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

Jay*_*y K 0 buffer verilog fpga fifo

我试图在Verilog中实现一个小行缓冲区.我从一端放入数据并从另一端读取数据.

wire [29:0] temp_pixel;
reg  [29:0] temp_buffer[2:0];
Run Code Online (Sandbox Code Playgroud)

我可以使用像这样的阻塞分配语句,它应该按预期工作.

always @(posedge TD_CLK27)
begin
temp_buffer[0] = temp_buffer[1];
temp_buffer[1] = temp_buffer[2];
temp_buffer[2] = temp_pixel;
end
Run Code Online (Sandbox Code Playgroud)

但是,我可以使用非阻塞语句(如下所示)并仍能获得预期结果吗?或者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
Run Code Online (Sandbox Code Playgroud)

这两个块是否都相同,或强制必须阻止赋值语句,为什么?

N8T*_*TRO 6

这个阻塞的最小例子,请注意=:

module test(
input  data_in, clk,
output data_out
);

reg [2:0] temp;

always @(posedge clk)
begin
   temp[2] = data_in;
   temp[1] = temp[2];
   temp[0] = temp[1];
end

assign data_out = temp[0];

endmodule
Run Code Online (Sandbox Code Playgroud)

创建1个触发器:

1个人字拖

虽然没有阻塞,但请注意<=:

module test(
input  data_in, clk,
output data_out
);

reg [2:0] temp;

always @(posedge clk)
begin
   temp[2] <= data_in;
   temp[1] <= temp[2];
   temp[0] <= temp[1];
end

assign data_out = temp[0];

endmodule
Run Code Online (Sandbox Code Playgroud)

创造3个人字拖鞋:

3个人字拖鞋

缓冲区是这样创建的:

module test(
input  data_in, clk,
output data_out
);

wire [2:0] temp;

   buf(temp[2], data_in);
   buf(temp[1], temp[2]);
   buf(temp[0], temp[1]);

assign data_out = temp[0];

endmodule
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

更多信息在这里.