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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 06:24:05