2014-05-05 29 views
0

我是verilog的新手,我打算在Verilog中用16x4 SRAM創建一個64x8內存單元。我設計了它,但我不知道如何將其解釋爲verilog。我有16x4 SRAM和2到4解碼器,但從我的理解是,我需要創建一個64x8,我不知道如何。這是我迄今爲止的2個模塊。我知道64x8內存單元使用2to4解碼器和8x16 SRAM,至少根據我的設計。內存單元Verilog

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; 

[email protected](*) 
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

是問題如何建立與16×4塊64×8? – Morgan

+2

向我們展示您認爲它會是什麼樣子。或者,你認爲32x4和16x8會是什麼樣子。我們會從那裏改正/引導你。 – Greg

+0

@Morgan是的,這就是我想要弄清楚的,更可能是我不明白verilog。 – user2318083

回答

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):

  • 數據 - 爲了擴大數據(可以說16×8的內存),你將需要兩個實例採用相同的控制信號和不同部分的數據 - 一個需要位[3:0]和其他位[7:4]。每個寫入和讀取都在兩個實例上執行。
  • 地址空間 - 爲了擴展地址空間(可以說是64x4內存),你應該使用2to4解碼器。這種方式將地址0-15映射到實例0,將地址16-31映射到實例1等等。根據地址MSB,每個寫或讀在上僅執行一個實例

說了這一切,在64×8的解決方案是基於2個概念結合以上和smay是這樣的:(它可以使用時產生的,但那是另一個故事是更優雅)

模塊ram64x8( input [5:0] adrs, inout [7:0] data, input chip_en,write_en,output_en);

wire ce0,ce1,ce2,ce3;

2to4decoder解碼( .a5(ADR的[5]), .a4(ADR的[4]), ._ce0(〜CE0) ._ce1(〜CE1), ._ce2(〜CE2) , ._ce3(〜ce3));

ram16x4 mem_0_0( .adrs(ADR的[3:0]), 。數據(數據[3:0]), .chip_en(CE0) .write_en(write_en) .output_en(output_en));

ram16x4 mem_0_1( .adrs(ADR的[3:0]), 。數據(數據[7:4]), .chip_en(CE0) .write_en(write_en) 。output_en(output_en));

ram16x4 mem_1_0( .adrs(ADR的[3:0]), 。數據(數據[3:0]), .chip_en(CE1) .write_en(write_en) .output_en(output_en));

ram16x4 mem_1_1( .adrs(ADR的[3:0]), 。數據(數據[7:4]), .chip_en(CE1) .write_en(write_en) .output_en(output_en));

ram16x4 mem_2_0( .adrs(ADR的[3:0]), 。數據(數據[3:0]), .chip_en(CE2) .write_en(write_en) .output_en(output_en));

ram16x4 mem_2_1( .adrs(ADR的[3:0]), 。數據(數據[7:4]), .chip_en(CE2) .write_en(write_en) .output_en(output_en));

ram16x4 mem_3_0( .adrs(ADR的[3:0]), 。數據(數據[3:0]), .chip_en(CE3) .write_en(write_en) .output_en(output_en));

ram16x4 mem_3_1( .adrs(ADR的[3:0]), 。數據(數據[7:4]), .chip_en(CE3) .write_en(write_en) .output_en(output_en));

endmodule