记忆单元Verilog

时间:2014-05-05 04:18:19

标签: verilog

我是verilog的新手,我想用一个16x4 SRAM在verilog中创建一个64x8内存单元。我设计了它,但我不知道如何将其解释为verilog。我有16x4 SRAM和2到4解码器,但据我所知,我需要创建一个64x8,我不确定如何。这是我到目前为止的两个模块。我知道64x8内存单元使用2to4解码器和8x16x4 SRAM,至少根据我的设计。

module ram16x4(
    input [3:0] adrs,
    inout [3:0] data,
    input chip_en, write_en, output_en
);
reg [0:15][3:0] mem;

assign data = ~chip_en & write_en & ~output_en ? mem[adrs]: 4'hz;

always@(*)
begin
if(chip_en == 0)
    if(write_en == 0 && output_en == 1)
        mem[adrs] = data;
end
endmodule

2到4解码器:

module 2to4decoder  (a4, a5, _ce0, _ce1, _ce2, _ce3);

output w, x, y, z;
input a4, a5;

assign _ce0 = (~a4) & (~a5);
assign _ce1 = (~a4) & a5;
assign _ce2 = a4 & (~a5);
assign _ce3 = a4 & a5;

endmodule

1 个答案:

答案 0 :(得分:1)

您的代码中存在一些不一致(2to4decoder参数是x,y或ce0,ce1?)所以我将回答假设您的模块的以下签名:(控制是低有效的,如您设计的那样)

ram16x4 (
    input [3:0] adrs,
    inout [3:0] data,
    input chip_en,
    input write_en,
    input output_en        
);
module 2to4decoder (
    input a5,
    input a4,
    ouput _ce0,
    ouput _ce1,
    ouput _ce2,
    ouput _ce3
};

该解决方案基于2种简单技术。一个用于扩展数据(从4到8),一个用于扩展地址空间(从16到64):

  • 数据 - 为了扩展数据(比如16x8内存),你需要两个采用相同控制信号和不同部分数据的实例 - 一个采用位[3:0]和其他位[7 :4]。每次写入和读取都在两个实例上执行。
  • 地址空间 - 为了扩展地址空间(比如64x4内存),你应该使用2to4解码器。这种方式将地址0-15映射到实例0,地址16-31映射到实例1,依此类推......根据地址MSB,每次写入或读取都在仅一个实例上执行。

说完这一切,64x8解决方案基于上面的两个概念的结合,而且看起来像这样:(当使用generate时它可以更优雅,但那是另一个故事)

  

模块ram64x8(       输入[5:0] adrs,       inout [7:0]数据,       输入chip_en,write_en,output_en);

     

wire ce0,ce1,ce2,ce3;

     

2to4解码器解码(       .a5(adrs [5]),       .a4(adrs [4]),       ._ce0(~ce0),       ._ce1(~ce1),       ._ce2(~ce2),       ._ce3(~ce3));

     

ram16x4 mem_0_0(       .adrs(adrs [3:0]),       .data(数据[ 3:0 ]),       .chip_en( ce0 ),       .write_en(write_en),       .output_en(output_en));

     

ram16x4 mem_0_1(       .adrs(adrs [3:0]),       .data(数据[ 7:4 ]),       .chip_en( ce0 ),       .write_en(write_en),       .output_en(output_en));

     

ram16x4 mem_1_0(       .adrs(adrs [3:0]),       .data(数据[ 3:0 ]),       .chip_en( ce1 ),       .write_en(write_en),       .output_en(output_en));

     

ram16x4 mem_1_1(       .adrs(adrs [3:0]),       .data(数据[ 7:4 ]),       .chip_en( ce1 ),       .write_en(write_en),       .output_en(output_en));

     

ram16x4 mem_2_0(       .adrs(adrs [3:0]),       .data(数据[ 3:0 ]),       .chip_en( ce2 ),       .write_en(write_en),       .output_en(output_en));

     

ram16x4 mem_2_1(       .adrs(adrs [3:0]),       .data(数据[ 7:4 ]),       .chip_en( ce2 ),       .write_en(write_en),       .output_en(output_en));

     

ram16x4 mem_3_0(       .adrs(adrs [3:0]),       .data(数据[ 3:0 ]),       .chip_en( ce3 ),       .write_en(write_en),       .output_en(output_en));

     

ram16x4 mem_3_1(       .adrs(adrs [3:0]),       .data(数据[ 7:4 ]),       .chip_en( ce3 ),       .write_en(write_en),       .output_en(output_en));

     

endmodule