Так что для назначения мне нужно создать модуль памяти, используя существующие модули памяти. Мне нужно превратить модуль, который хранит ram64x8 в ram128x16. Позднее я теряю половину своих сохраненных данных, когда пытаюсь читать из памяти или когда я пишу. Я не уверен, где моя проблема. Я знаю, что это должно быть в моем модуле ram128x16, так как я написал тестовый стенд для модуля ram64x8 и все пишет и читает правильно. Кто-нибудь может понять, почему, когда я пытаюсь сохранить FFFF в данных, он считывает только 00FF?
Итак, мой мыслительный процесс состоял в том, что мне нужно 2 из модулей, почему бы просто не сделать то, что сделал модуль 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