Двойной порт RAM c синхронным режимом записи/чтения

//-----------------------------------------------------
// Имя модуля : ram_dp_sr_sw
// Имя файла : ram_dp_sr_sw.v
// Функц. назначение : Синхронный блок для записи/чтения RAM
// Программист : portal-ed.ru/
//-----------------------------------------------------
module ram_dp_sr_sw (
clk , // Тактовый вход
address_0 , // Вход address_0
data_0 , // Двунаправленный порт data_0
cs_0 , // Выбор блока
we_0 , // Разрешение записи/Разрешение чтения
oe_0 , // Разрешение выхода
address_1 , // Вход address_1
data_1 , // Двунаправленный порт data_1
cs_1 , // Выбор блока
we_1 , // Разрешение записи/Разрешение чтения
oe_1 // Разрешение выхода
);
parameter data_0_WIDTH = 8 ;
parameter ADDR_WIDTH = 8 ;
parameter RAM_DEPTH = 1 << ADDR_WIDTH;
//--------------Входные порты-----------------------
input [ADDR_WIDTH-1:0] address_0 ;
input cs_0 ;
input we_0 ;
input oe_0 ;
input [ADDR_WIDTH-1:0] address_1 ;
input cs_1 ;
input we_1 ;
input oe_1 ;
//--------------Двунаправленные порты-------------------
inout [data_0_WIDTH-1:0] data_0 ;
inout [data_0_WIDTH-1:0] data_1 ;
//--------------Внутренние переменные----------------
reg [data_0_WIDTH-1:0] data_0_out ;
reg [data_0_WIDTH-1:0] data_1_out ;
reg [data_0_WIDTH-1:0] mem [0:RAM_DEPTH-1];
//--------------Начало кода------------------
// Запись блока памяти
// Write Operation : When we_0 = 1, cs_0 = 1
always @ (posedge clk)
begin : MEM_WRITE
          if ( cs_0 && we_0 ) begin
                                      mem[address_0] <= data_0;
                                      end else if (cs_1 && we_1) begin
                                                                              mem[address_1] <= data_1;
                                                                              end
end
// Управление тристабильным буфером
// output : When we_0 = 0, oe_0 = 1, cs_0 = 1
assign data_0 = (cs_0 && oe_0 && !we_0) ? data_0_out : 8'bz;
// Чтение блока памяти
// Read Operation : When we_0 = 0, oe_0 = 1, cs_0 = 1
always @ (posedge clk)
begin : MEM_READ_0
          if (cs_0 && !we_0 && oe_0) begin
                                                  data_0_out <= mem[address_0];
                                                  end else begin
                                                                data_0_out <= 0;
                                                                end
end
//Второй блок RAM
// Управление тристабильным буфером
// output : When we_0 = 0, oe_0 = 1, cs_0 = 1
assign data_1 = (cs_1 && oe_1 && !we_1) ? data_1_out : 8'bz;
// Чтение блока памяти 1
// Read Operation : When we_1 = 0, oe_1 = 1, cs_1 = 1
always @ (posedge clk)
begin : MEM_READ_1
          if (cs_1 && !we_1 && oe_1) begin
                                                  data_1_out <= mem[address_1];
                                                  end else begin
                                                                data_1_out <= 0;
                                                               end
end
endmodule // Конец блока ram_dp_sr_sw

 

 

ВСПОМНИТЬ КАК РАБОТАЕТ>>>