2017-04-11 39 views
0

私は、ロールシフト/リングカウンタを書き、Verilogのクロックとして2つのスイッチを使用しています。次のように2つのクロックリングカウンタとVerilog

私のコードは次のとおりです。

module roll(CLK1, CLK2, LEDS); 
input CLK1; 
input CLK2; 
output [3:0] LEDS; 
reg [3:0] LEDS; 


initial 
begin 
LEDS = 4'b0001; 
end 


[email protected](posedge CLK1 or posedge CLK2) 
begin 
if(CLK1) 
begin 

     LEDS[3]<=LEDS[2]; 
     LEDS[2]<=LEDS[1]; 
     LEDS[1]<=LEDS[0]; 
     LEDS[0]<=LEDS[3]; 
end 

// Roll Right 
if(CLK2) 
begin 
     LEDS[3]<=LEDS[0]; 
     LEDS[2]<=LEDS[3]; 
     LEDS[1]<=LEDS[2]; 
     LEDS[0]<=LEDS[1]; 

end 
end 
endmodule 

私は2個のalwaysのブロックを使用してみましたが、その後、私はそれを行うことができないことを考え出しました。 alwaysの文にposedge CLK2があると、私のFPGA上のLEDはすべてそのまま残ります。

+0

複数のドライバがあるため、Ofcouse。このアサイメントにはマルチプレクサを使用する必要があります。 – Roman

+0

この質問は、Verilogのシンタックスやシンセティックスよりもデジタルロジックでできることが多いため、ここではなく、[Electrical Engineering Stackexchange](http://electronics.stackexchange.com)に属している可能性があります。 –

答えて

4

Verilogはハードウェア記述言語であるプログラミング言語ではありません。

合成用のコードを書くときには、実際のゲートでインスタンス化できるコードを書くだけで成功します。したがって、2つの異なる信号のエッジに対する感度を有する常時ブロックを書き込むことは、2つの信号の一方に対する応答がRESETまたはPRESET動作の効果を持たない限り、合成することができない。

あなたのコードも論理的にはあなたが望むようにはできません。 CLK1が既にハイ(またはその逆)のときに、CLK2の立ち上がりエッジがある場合にコードが何を言うかを考えてみましょう。あなたのライトは左に転がり、その後すぐに右に動いて変化しません。

より一般的なアプローチは、UPとDOWN入力が変化すると予想されるクロックよりもはるかに速いクロックを実行し、ロジックを駆動するために使用することです。たとえば、

module roller(input clk, input rst, input UP, input DOWN, output reg LEDS[3:0]); 

reg UP1, DOWN1; 

always @(posedge clk or posedge rst) 
if (rst) begin 
    LEDS[3:0] <= 4'b0001; 
end 
else 
begin 
    UP1 <= UP; 
    DOWN1 <= DOWN; 
    if (UP & ~UP1) begin 
     LEDS[3:0] <= {LEDS[2:0], LEDS[3]}; 
    end 
    else if (DOWN & ~DOWN1) begin 
     LEDS[3:0] <= {LEDS[0], LEDS[3:1]}; 
    end 
end 
endmodule; 

これが優先順位を上げることに注意してください。 UPとDOWNの両方がアサートされていると、パターンはダウンしないで「上に」転がります。別の動作が必要な場合は、コードを変更してそれを達成する必要があります。

関連する問題