Verilog で合成可能なコードを記述しようとしていますが、数秒の時間遅延を含める必要があります。#delay を使用してシミュレーションを実行しましたが、これはシンセサイザーでは受け入れられません。
条件によってではなく、数秒の時間遅延後に状態が変化する FSM を合成する過程で、上記の時間遅延方法が必要です。FSM は、state_1 から state_2 に 4 秒後に、state_2 から state_3 に 2 秒後に、というように状態を切り替える必要があります。
クロック周波数が x Hz であることがわかっていて、y 秒待ちたい場合は、単純にカウンターを使用して x*y の数値に達するまで待ちます。
たとえば、クロックが 1kHz で遅延が 3 秒の場合、このコードは遅延時間の後に do_something をトリガーします。
`define CLOCK_FREQ 1000
`define TIME_DELAY 3
reg [31:0] count=0;
assign do_something = (count==`CLOCK_FREQ*`TIME_DELAY);
always @(posedge clk)
begin
count <= count + 1'b1;
end
時間遅延後に状態を切り替えるために、このコードが役立つことを願っています。
current_state=state_1;
for(i=0;i<=timedelay*freq;i=i+1)
@posedge;
current_state=state_2;