因此,对于一项作业,我必须使用现有的内存模块创建一个内存模块。我需要打开一个将ram64x8存储到ram128x16的模块。当我尝试从内存中读取或写入时,我将丢失一半的存储数据。我不确定我的问题在哪里。我确实知道它应该在我的模块ram128x16中,因为我为ram64x8模块编写了一个测试平台,并且所有内容均可正确读写。有人能弄清楚为什么当我尝试将FFFF存储到数据中时,它只会读出00FF吗? 所以我的思考过程是因为我需要两个模块,为什么不只做16x8模块的工作,将地址和数据分成两半。不是吗?
根据这里的提示,我用完成的操作更新了当前代码,但是我仍然对如何管理地址感到困惑。
这些是模块
module ram128x16(
input [6:0] adrs,
inout [15:0] data,
input _ce, _we, _oe
);
reg [3:0] _cee;
ram64x8 u1(adrs[5:0], data[15:8], _cee[0], _we, _oe);
ram64x8 u2(adrs[5:0], data[7:0], _cee[0], _we, _oe);
ram64x8 u3(adrs[5:0], data[15:8], _cee[1], _we, _oe);
ram64x8 u4(adrs[5:0], data[7:0], _cee[1], _we, _oe);
ram64x8 u5(adrs[5:0], data[15:8], _cee[2], _we, _oe);
ram64x8 u6(adrs[5:0], data[7:0], _cee[2], _we, _oe);
ram64x8 u7(adrs[5:0], data[15:8], _cee[3], _we, _oe);
ram64x8 u8(adrs[5:0], data[7:0], _cee[3], _we, _oe);
//1 - to - 2 decode
always @ (*)
begin
if(_ce == 0)
case(adrs[6:5])
0: _cee = 4'b1110;
1: _cee = 4'b1101;
2: _cee = 4'b1011;
3: _cee = 4'b0111;
default: _cee = 4'hf;
endcase
else
_cee = 4'hf;
end
endmodule
module ram64x8(
input [5:0] adrs,
inout [7:0] data,
input _ce, _we, _oe
);
reg [3:0] _cee;
ram16x8 u1(adrs[3:0], data, _cee[0], _we, _oe);
ram16x8 u2(adrs[3:0], data, _cee[1], _we, _oe);
ram16x8 u3(adrs[3:0], data, _cee[2], _we, _oe);
ram16x8 u4(adrs[3:0], data, _cee[3], _we, _oe);
//2 - to - 4 decode
always @ (*)
begin
if(_ce == 0)
case(adrs[5:4])
0: _cee = 4'b1110;
1: _cee = 4'b1101;
2: _cee = 4'b1011;
3: _cee = 4'b0111;
default: _cee = 4'hf;
endcase
else
_cee = 4'hf;
end
endmodule
module ram16x8(
input [3:0] adrs,
inout [7:0] data,
input _ce, _we, _oe
);
ram16x4 u1(adrs, data[7:4], data[7:4], _ce, _we, _oe);
ram16x4 u2(adrs, data[3:0], data[3:0], _ce, _we, _oe);
endmodule
module ram16x4(
input [3:0] adrs,
input [3:0] dataIn,
output [3:0] dataOut,
input _ce, _we, _oe
);
reg [3:0] mem[0:15]; // 16 X 4 ram
assign dataOut = ~_ce & _we & ~_oe ? mem[adrs]:4'hz;
always@(*)
begin
if(_ce==0)
if(_we == 0 && _oe ==1)
mem[adrs] = dataIn;
end
endmodule
这是我的测试台
module ram();
reg [11:0] adrs;
reg [15:0] content;
reg _ce, _we, _oe;
wire [15:0] data;
assign data = ~_ce & ~_we & _oe ? content : 16'hz;
ram128x16 u1(adrs, data, _ce,_we,_oe);
initial begin
$monitor ("%4d: adrs = %h _ce + %b _we = %b _oe = %b data =%h", $time, adrs, _ce, _we, _oe, data);
adrs = 12'd0;
content = 16'd0;
_ce = 1'b0; _we = 1'b0; _oe = 1'b1;
#10
_ce = 1'b1; _we = 1'b1; _oe = 1'b1;
#50
adrs = 12'b011111;
content = 16'hFFFF;
_ce = 1'b0; _we = 1'b0; _oe = 1'b1;
#10
_ce = 1'b1; _we = 1'b1; _oe = 1'b1;
#40
adrs = 12'b100000;
content = 8'd0387+127;
_ce = 1'b0; _we = 1'b0; _oe = 1'b1;
#10
_ce = 1'b1; _we = 1'b1; _oe = 1'b1;
#40
adrs = 12'b110000;
content = 8'd0387-127;
_ce = 1'b0; _we = 1'b0; _oe = 1'b1;
#10
_ce = 1'b1; _we = 1'b1; _oe = 1'b1;
#40
//read
adrs = 12'b000000;
_ce = 1'b0; _we = 1'b1; _oe = 1'b0;
#10
_ce = 1'b1; _we = 1'b1; _oe = 1'b1;
#50
adrs = 12'b011111;
_ce = 1'b0; _we = 1'b1; _oe = 1'b0;
#10
_ce = 1'b1; _we = 1'b1; _oe = 1'b1;
#40
adrs = 12'b100000;
_ce = 1'b0; _we = 1'b1; _oe = 1'b0;
#10
_ce = 1'b1; _we = 1'b1; _oe = 1'b1;
#40
adrs = 12'b110000;
_ce = 1'b0; _we = 1'b1; _oe = 1'b0;
#10
_ce = 1'b1; _we = 1'b1; _oe = 1'b1;
#40
$finish;
end
endmodule
答案 0 :(得分:1)
您需要从一些基本数学开始。
您具有64x8位的内存。就是512位。
您需要128x16位的内存。那是2048位。
因此,您需要四个 64x8的内存来获得该位数。
您必须进行两种类型的扩展:
第一个要求您并行使用内存。
第二个要求您“顺序”使用内存。
在您的代码中,通过并行放置两个内存,您完成了宽度扩展。但是,您的地址位完全混乱了。
提出所有建议后,我会把剩下的留给您,因为我怀疑这是家庭作业。