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)
这两个块是否都相同,或强制必须阻止赋值语句,为什么?
这个阻塞的最小例子,请注意=:
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个触发器:
虽然没有阻塞,但请注意<=:
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个人字拖鞋:

缓冲区是这样创建的:
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)

更多信息在这里.