Verilog字节对齐内存访问32位字 实现addr起始4字节写入的方法
Verilog数据存储器32位字节写入功能实现
原代码问题
原有代码仅支持单字节读写,且存在位宽不匹配的问题:
module data_mem( input clk, input [31:0] addr, input [31:0] wdata, input wr_en, input rd_en, output [31:0] rdata ); reg [7:0] Mem [255:0]; // 读逻辑仅返回单字节,位宽不匹配32位输出 assign rdata = rd_en ? Mem[addr]:32'bxxxxxxxx; always @ (posedge clk) begin if (wr_en) // 写逻辑仅写入单字节,且32位wdata直接赋值给8位寄存器会丢失高24位 Mem[addr] <= wdata; end endmodule
修改后完整实现
module data_mem( input clk, input [31:0] addr, input [31:0] wdata, input wr_en, input rd_en, output [31:0] rdata ); reg [7:0] Mem [255:0]; // 读逻辑:拼接4个连续地址的字节为32位数据返回,采用小端序 assign rdata = rd_en ? {Mem[addr+3], Mem[addr+2], Mem[addr+1], Mem[addr]} : 32'bxxxxxxxx; always @ (posedge clk) begin if (wr_en) begin // 拆分32位wdata为4个字节,依次写入连续4个地址 Mem[addr] <= wdata[7:0]; Mem[addr+1] <= wdata[15:8]; Mem[addr+2] <= wdata[23:16]; Mem[addr+3] <= wdata[31:24]; end end endmodule
功能说明
- 默认采用小端字节序:低地址存储32位数据的低字节,若需要使用大端序,直接交换各地址对应的wdata字节段即可
- 若需要增加地址越界判断(避免addr+3超过Mem的255最大地址),可在写逻辑中增加地址范围判断条件,超出范围时不执行写入
- 读写逻辑均保持原有使能信号控制规则,无需修改上层调用逻辑
内容的提问来源于stack exchange,提问作者computerfunfact
相关产品推荐
相关产品推荐

