我正在尝试在Verilog中实现一个小的行缓冲区。我从一端放入数据,从另一端读取数据。
wire [29:0] temp_pixel;
reg [29:0] temp_buffer[2:0];
我可以使用像这样的阻塞分配语句,它应该可以按预期工作。
always @(posedge TD_CLK27)
begin
temp_buffer[0] = temp_buffer[1];
temp_buffer[1] = temp_buffer[2];
temp_buffer[2] = temp_pixel;
end
但是,我可以使用非阻塞语句(如下所示)并且仍然获得预期结果吗?还是在将temp_buffer [1]读入temp_buffer [0]之前,它会被temp_buffer [2]覆盖?
always @(posedge TD_CLK27)
begin
temp_buffer[0] <= temp_buffer[1];
temp_buffer[1] <= temp_buffer[2];
temp_buffer[2] <= temp_pixel;
end
这两个块的工作原理是否相同,还是必须强制阻塞赋值语句?为什么?
两个块是不同的。
当您使用阻塞分配时,直到分配完成后,下一条语句才开始执行。
x = #5 y + z;
该语句执行如下:
因此,在您的情况下,分配已创建的缓冲区时没有延迟,verilog会将其解释为单个触发器。
x <= y + z;
正常的非阻塞分配如下执行:
因此,在您的第二个示例中,temp_buffer[2]
获取的先前值temp_buffer[1]
。因此,存在一个循环延迟,您可以在该循环延迟之前访问该值。因此,在获得实际输出之前,会有一串触发器(取决于您的代码)。
同样,上一个答案中的链接是一本非常好的阅读文章。这里还有一些Sunburst Design Link2
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句