非阻塞或阻塞分配的缓冲区?

周杰伦

我正在尝试在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

这两个块的工作原理是否相同,还是必须强制阻塞赋值语句?为什么?

Chitranna

两个块是不同的。

当您使用阻塞分配时,直到分配完成后,下一条语句才开始执行。

 x = #5 y + z;

该语句执行如下:

  1. 评估RHS表达式并保存结果
  2. 等待指定的延迟
  3. 执行作业

因此,在您的情况下,分配已创建的缓冲区时没有延迟,verilog会将其解释为单个触发器。

x <= y + z;

正常的非阻塞分配如下执行:

  1. 评估RHS表达式并将结果保存在临时缓冲区中
  2. 完成程序块中的所有其他事件,其他非阻塞分配除外
  3. 最后执行作业。

因此,在您的第二个示例中,temp_buffer[2]获取的先前值temp_buffer[1]因此,存在一个循环延迟,您可以在该循环延迟之前访问该值。因此,在获得实际输出之前,会有一串触发器(取决于您的代码)。

同样,上一个答案中的链接是一本非常好的阅读文章。这里还有一些Sunburst Design Link2

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章