我正在尝试在 Verilog 中实现一个缓冲器阵列,其中当输入信号 (data_valid) 处于活动状态时,数据将在时钟信号 (CLK) 的正边沿上波动通过缓冲器。但是,我遇到了一个问题,我的 data_in 线没有连接到第一个缓冲区,导致我的输出陷入高阻抗状态。
module convolution_ip(input [7:0] data_in,
input reset, input wire init_valid, clk,
output [9:0] final_output );
integer j ;
reg [7:0] input_fm_buff[24:0] ;
wire input_load;
/////////////////////////////////////////
assign input_load = clk & init_valid;
/////////////////////////////////////////
always@(posedge input_load or posedge reset)begin
if (reset) begin
// Reset buffer
for (int j = 0; j <=24; j = j + 1) begin
input_fm_buff[j] <= 8'h00;
end
end else begin
for (int j = 0; j<=24; j = j+1) begin
if (j==24)begin input_fm_buff[j] <= data_in;
end
input_fm_buff[j] <= input_fm_buff[j+1];
end
end
end
assign final_output = input_fm_buff[1];
endmodule
我尝试使用 for 循环和非阻塞分配来同步通过每个缓冲区的数据流。我希望当 init_valid 为高并且有 clk 的上升沿时,数据将在缓冲区中波动。
我在这里看到几个问题(除了你的问题):
posedge input_load
,因为这样您将尝试通过AND
门将时钟馈送到逻辑中。在 FPGA 中不建议这样做,因为时钟路由与数据路由不同,即时钟信号在单独的专用路由上传输。通过 AND
门,您可以将 CLK
信号引入正常数据路由。所以简单的解决方案是你应该在always块中使用额外的else if
。output [7:0] final_output
,但您已将其定义为 10 位。现在,主要问题是为什么
data_in
线没有连接到第一个缓冲区?您已经在 else 块中定义了逻辑,如下所示,如果 j==24
那么 if 语句是正确的,并且您的值被分配给缓冲区地址 24,即 input_fm_buff[24] <= data_i
。但是,在 if 语句之后,您在 if 语句之外为 input_fm_buff[j]
重新分配了一个新值,而该值恰好是 input_fm_buff[j+1]
,即 25,这是一个不存在的内存。
换句话说,当
j==24
时,input_fm_buff[j] <= data_in;
和input_fm_buff[j] <= input_fm_buff[j+1];
都被执行,导致后面的语句即input_fm_buff[j] <= input_fm_buff[j+1];
被执行。
if (j==24)begin
input_fm_buff[j] <= data_in;
end
input_fm_buff[j] <= input_fm_buff[j+1];
解决方案是将逻辑包装在 if else 语句中。
if (j==24)begin
input_fm_buff[j] <= data_in;
end
else begin
input_fm_buff[j] <= input_fm_buff[j+1];
end