verilog 中的缓冲区数组

问题描述 投票:0回答:1

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

示意图如下所示 enter image description here

我尝试使用 for 循环和非阻塞分配来同步通过每个缓冲区的数据流。我希望当 init_valid 为高并且有 clk 的上升沿时,数据将在缓冲区中波动。

verilog system-verilog
1个回答
0
投票

我在这里看到几个问题(除了你的问题):

  1. 您应该在敏感度列表中使用
    posedge input_load
    ,因为这样您将尝试通过
    AND
    门将时钟馈送到逻辑中。在 FPGA 中不建议这样做,因为时钟路由与数据路由不同,即时钟信号在单独的专用路由上传输。通过
    AND
    门,您可以将
    CLK
    信号引入正常数据路由。所以简单的解决方案是你应该在always块中使用额外的
    else if
  2. 您的输出应该是 8 位,即
    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
© www.soinside.com 2019 - 2024. All rights reserved.