相信用过FPGA的朋友对Verilog一定不陌生,这篇文章来简单介绍一下Verilog中@的两个用处。
- 直接上实例来说明吧,首先我们经常见到到就是always块中的@:
always @(posedge clk or posedge reset) begin
...
end
@于此起到触发的作用,always表示一直执行的意思,而一直执行的周期是怎么样子的呢,所以通过一个@来表示执行条件(也就是触发条件),当检测到时钟信号或复位信号的上升沿的时候执行always中的语句。
类似的,还有在如下语句:
always @(*)begin
if(key_in)
led = ~led;
else
led = led;
end
上面的语句表明在这个always语句中的驱动信号,只要发生变化就会触发always语句执行。所以只要上述语句中key_in信号发生变化,就会触发这个always信号了。
2.还有一种比较常见的用法用在仿真文件中,如下所示:
@(posedge clk);
@(negedge key_in_fall);
那么这样子的语句在仿真中又有什么意义呢。
在仿真中,这样子的语句表示等待触发的意思,我们来验证一下:
reg sign1;
reg sign2;
reg sign3;
reg sign4;
initial begin
sign1 = 1'b0;
sign2 = 1'b0;
@(negedge sign3);
sign1 = 1'b1;
#100
sign2 = 1'b1;
end
initial begin
sign3 = 1'b1;
#100
sign3 = 1'b0;
end
initial begin
sign4 = 1'b0;
#100
sign4 = 1'b1;
end
上面代码所运行的仿真波形如下所示:
由上面的波形可以看出,第一个initial语句块中,@的作用就像是一个while,直到所需要的触发信号出现之后才会继续往下运行,否则就卡死在这里了,而像sign4,在另外一个initial中,就不受影响。
总结:两大作用,第一是触发,第二是等待。如果有朋友还能指出更多的作用,欢迎评论区留言。