Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
存储器单元Verilog_Verilog - Fatal编程技术网

存储器单元Verilog

存储器单元Verilog,verilog,Verilog,我是verilog的新手,我想用16x4 SRAM在verilog中创建一个64x8内存单元。我设计了它,但我不知道如何将它翻译成verilog。我有16x4 SRAM和2到4解码器,但据我所知,我需要创建一个64x8,我不知道如何创建。这是我到目前为止的两个模块。我知道64x8内存单元使用2to4解码器和16x4 SRAM的8个,至少根据我的设计 module ram16x4( input [3:0] adrs, inout [3:0] data, input chip

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

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

您的代码中存在一些不一致性(2to4decoder参数是x,y或ce0,ce1?),因此我将假设您的模块具有以下特征来回答:(控件处于低活动状态,如您设计的那样)

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

  • 数据-为了扩展数据(比如16x8内存),您需要两个实例,它们采用相同的控制信号和不同的数据部分-一个采用位[3:0],另一个采用位[7:4]。每次写入和读取都在两个实例上执行
  • 地址空间-为了扩展地址空间(比如64x4内存),您应该使用2to4解码器。这样,地址0-15映射到实例0,地址16-31映射到实例1,依此类推。。。根据地址MSB,每次写入或读取仅对一个实例执行
综上所述,64x8解决方案基于上述两个概念的结合,SMA可能如下所示:(使用generate for时可能更优雅,但这是另一回事)

模块ram64x8( 输入[5:0]ADR, 输入[7:0]数据, 输入芯片、写入芯片、输出芯片)

导线ce0、ce1、ce2、ce3

2to4decoder解码( .a5(美国存托凭证[5]), .a4(美国存托凭证[4]), .ce0(~ce0), .(ce1)(ce1),, .(ce2)(ce2),, .ce3(~ce3))

ram16x4内存0( .药品不良反应(药品不良反应[3:0]), .数据(数据[3:0), .chip_en(ce0), .write_en(write_en), .output_en(output_en))

ram16x4内存0\u 1( .药品不良反应(药品不良反应[3:0]), .数据(数据[7:4), .chip_en(ce0), .write_en(write_en), .output_en(output_en))

ram16x4内存1\u 0( .药品不良反应(药品不良反应[3:0]), .数据(数据[3:0), .chip_en(ce1), .write_en(write_en), .output_en(output_en))

ram16x4内存1( .药品不良反应(药品不良反应[3:0]), .数据(数据[7:4), .chip_en(ce1), .write_en(write_en), .output_en(output_en))

ram16x4内存2 0( .药品不良反应(药品不良反应[3:0]), .数据(数据[3:0), .chip_en(ce2), .write_en(write_en), .output_en(output_en))

ram16x4内存2\u 1( .药品不良反应(药品不良反应[3:0]), .数据(数据[7:4), .chip_en(ce2), .write_en(write_en), .output_en(output_en))

ram16x4内存3 0( .药品不良反应(药品不良反应[3:0]), .数据(数据[3:0), .chip_en(ce3), .write_en(write_en), .output_en(output_en))

ram16x4内存3个1( .药品不良反应(药品不良反应[3:0]), .数据(数据[7:4), .chip_en(ce3), .write_en(write_en), .output_en(output_en))

端模


问题是如何用16x4块构建64x8?向我们展示您的想法。或者,您认为32x4和16x8会是什么样子。我们将从那里纠正/指导您。@Morgan是的,这正是我想弄明白的,很可能我也不理解verilog。您能否将您认为的
模块ram64x8
添加到问题中,即使它只是实例化了几个16x4块。
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
};