2013-06-28 63 views
2

我正尝试在Verilog中编写一个可综合的代码,其中我需要包含几秒钟的时间延迟。我使用#delay完成了模拟,但这是合成器无法接受的。如何在合成的verilog中包含时间延迟?

在合成一个有限状态机的过程中,它不是基于某种条件改变它的状态,而是在几秒钟的时间延迟之后,我想要上面的时间延迟方法。 FSM必须在4秒后将状态从state_1切换到state_2,在2秒后将state_2切换到state_3等等。

+0

@Peter德Rivaz回答了你的问题,但我只是好奇,为什么你需要这样的功能呢? – Vasiliy

+0

我同意@Vasiliy Zukanov,这通常是不好的做法。如果需要延迟用于刷新的重复块,则通常使用时钟分频器逻辑。你能发布更多细节吗?也许描述你正试图解决的问题? – GCon

回答

1

为了在一段时间延迟后切换状态,我希望这段代码有帮助。

current_state=state_1;
for(i=0;i<=timedelay*freq;i=i+1)
@posedge;
current_state=state_2;

+0

谢谢。这可能有帮助 –

7

如果您知道您的时钟频率为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