我正在尝试用verilog编写可综合的代码,其中我需要包含几秒钟的时间延迟。我已经使用#delay进行了模拟,但这对于合成器来说是不可接受的。
在合成FSM的过程中,其状态不是根据某些条件而是在几秒的延时后改变,我想要上面的延时方法。 FSM 必须在 4 秒后将状态从 state_1 切换到 state_2,在 2 秒后将 state_2 切换到 state_3,依此类推。
如果您知道时钟频率是 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;
如果您有某个频率的时钟,您可以使用重复语句。如果您的时钟周期为 1.25 纳秒,并且您想要模拟 100 纳秒的延迟。那么您需要 1.25 * 100 = 125 个时钟周期。然后你就可以这样做:
repeat (125) begin
@(posedge clk);
end
// do stuff now