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

RAM阵列显示‘XXXXX’:128数据缓存输出异常技术求助

问题排查与修复

故障现象

ram_cnt始终显示0,dout与RAM均为未知态(XXXXX),无法完成128个数据的存储与输出功能。

核心问题分析

代码存在逻辑分支完全颠倒的致命错误:

  • 初始状态ram_cnt为0,满足ram_cnt <= 7'd127条件,直接进入数据输出分支并将ram_cnt强制置0,导致永远无法进入数据存储分支
  • 数据输出分支的触发逻辑错误,本该在存满128个数据后执行输出,却被设置为初始就触发
  • always时序块内使用阻塞赋值=操作dout,不符合Verilog时序电路编码规范,易引发时序冲突

修复后的代码

module Data_buffer (
  input clk,
  input rst,
  input we,
  input en,
  input [7:0] di,
  output reg [1023:0] dout,
  output reg [6:0] ram_cnt
);

  reg [7:0] RAM [0:127];
  integer i;

  always @(posedge clk) begin
    if (rst) begin
      ram_cnt <= 7'd0;
      dout <= 1024'd0; // 复位时初始化输出
      // 可选:复位时清空RAM,避免未知态残留
      for(i = 0; i < 128; i = i + 1) begin
        RAM[i] <= 8'd0;
      end
    end
    else if (en && we ) begin
      if (ram_cnt <= 7'd127) begin
        // 存储输入数据到RAM对应地址
        RAM[ram_cnt] <= di;
        // 计数器自增,直到存满128个数据
        ram_cnt <= ram_cnt + 1'd1;
      end
      // 当第128个数据存储完成(ram_cnt达到127),输出所有RAM数据
      if (ram_cnt == 7'd127) begin
        for (i = 0; i < 128; i = i + 1) begin
          dout[(127 - i)*8 +: 8] <= RAM[i];
        end
        // 可选:输出完成后重置计数器,准备下一轮数据存储
        ram_cnt <= 7'd0;
      end
    end
  end

endmodule

修复说明

  1. 修正逻辑分支顺序:将数据存储逻辑放在ram_cnt <= 127条件下,确保先完成128个数据的存储流程
  2. 调整输出触发条件:仅当ram_cnt等于127(即第128个数据存储完成)时,执行dout的赋值操作
  3. 规范赋值方式:将dout的阻塞赋值改为非阻塞赋值<=,符合时序电路编码要求
  4. 完善复位逻辑:复位时初始化dout与RAM(可选),消除未知态对功能的影响

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 08:18:19