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
修复说明
- 修正逻辑分支顺序:将数据存储逻辑放在
ram_cnt <= 127条件下,确保先完成128个数据的存储流程 - 调整输出触发条件:仅当
ram_cnt等于127(即第128个数据存储完成)时,执行dout的赋值操作 - 规范赋值方式:将
dout的阻塞赋值改为非阻塞赋值<=,符合时序电路编码要求 - 完善复位逻辑:复位时初始化
dout与RAM(可选),消除未知态对功能的影响
内容的提问来源于stack exchange,提问作者Ti Wize
相关产品推荐
相关产品推荐

