You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Verilog缓冲数组实现问题:data_in未连首缓冲致输出高阻

Verilog缓冲数组实现问题修复

问题根源分析

  • 时钟触发逻辑错误:直接用clk & init_valid生成触发信号不符合时序设计规范,时钟沿必须依赖原始时钟信号,使能信号应在时序块内部判断,而非用来合成触发沿。
  • 数组赋值逻辑错误:原循环中,j=24时先对input_fm_buff[24]赋值data_in,随后立即被input_fm_buff[24] <= input_fm_buff[25]覆盖;且j+1=25超出数组input_fm_buff[24:0]的索引范围,导致未知行为,data_in从未真正写入缓冲。
  • 数据流向错误:移位方向颠倒,无法实现数据逐级传递的需求。

修正后的代码

module convolution_ip(
    input [7:0] data_in, 
    input reset, 
    input init_valid,  
    input clk, 
    output [9:0] final_output 
);
                       
    reg [7:0] input_fm_buff[24:0] ;

    always@(posedge clk or posedge reset) begin
        if (reset) begin
            // 异步复位,清空所有缓冲单元
            for (int j = 0; j <= 24; j++) begin
                input_fm_buff[j] <= 8'h00;
            end
        end else if (init_valid) begin
            // 从后往前移位,新数据写入首个缓冲单元
            for (int j = 24; j > 0; j--) begin
                input_fm_buff[j] <= input_fm_buff[j-1];
            end
            input_fm_buff[0] <= data_in;
        end
        // init_valid无效时,保持缓冲数据不变
    end

    // 将8bit缓冲数据扩展为10bit输出,匹配位宽要求
    assign final_output = {2'b00, input_fm_buff[1]};
endmodule 

修正说明

  1. 时序逻辑规范:改用posedge clk作为触发沿,异步复位,在时序块内通过init_valid控制移位动作,符合FPGA/ASIC的时序设计要求。
  2. 正确的移位逻辑:从最后一个缓冲单元(索引24)开始,依次将前一个单元的数据后移,最后将data_in写入首个单元(索引0),确保每拍时钟上升沿时数据逐级传递,无索引越界问题。
  3. 位宽匹配:通过拼接2位0将8bit缓冲数据扩展为10bit输出,避免隐式位宽转换带来的问题。

内容的提问来源于stack exchange,提问作者nikhil0505

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 14:10:12