Verilog Code Устранение неполадок, часть данных теряется во время записи, а затем операции чтения в модуле памяти - PullRequest
0 голосов
/ 07 мая 2019

Так что для назначения мне нужно создать модуль памяти, используя существующие модули памяти. Мне нужно превратить модуль, который хранит 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

1 Ответ

1 голос
/ 07 мая 2019

Вы должны начать с некоторой базовой математики.

У вас есть память 64x8 бит.Это 512 бит.
Вам нужна память 128х16 бит.Это 2048 бит.

Таким образом, вам нужно четыре памяти 64x8, чтобы получить это количество бит.

Вы должны сделать два типа расширения:

  1. Расширение по ширине для получения ширины от 8 до 16 бит.
  2. Расширение по глубине от 64 до 128 глубины.

Первое требует параллельного использования памяти..
Второй требует, чтобы вы использовали воспоминания «последовательно».

В вашем коде вы сделали расширение по ширине, разместив две памяти параллельно.Однако ваши биты адреса полностью перепутаны.

После всего этого совета я оставляю все остальное вам, так как подозреваю, что это домашняя работа.

...