Одиночный порт RAM с синхронной записью и чтением

//-----------------------------------------------------
// Имя модуля : ram_sp_sr_sw
// Имя файла : ram_sp_sr_sw.v
// Функц. назначение : Синхронная запись, чтение RAM
// Программист : portal-ed.ru/
//-----------------------------------------------------
module ram_sp_sr_sw (
clk , // Тактовый вход
address , // Адресный вход
data , // Двунаправленный порт данных
cs , // Выбор блока
we , // Разрешение записи/Разрешение чтения
oe // Разрешение выхода
);
parameter DATA_WIDTH = 8 ;
parameter ADDR_WIDTH = 8 ;
parameter RAM_DEPTH = 1 << ADDR_WIDTH;
//--------------Входные порты-----------------------
input clk ;
input [ADDR_WIDTH-1:0] address ;
input cs ;
input we ;
input oe ;
//--------------Двунаправленные порты-----------------------
inout [DATA_WIDTH-1:0] data ;
//--------------Внутренние переменные----------------
reg [DATA_WIDTH-1:0] data_out ;
reg [DATA_WIDTH-1:0] mem [0:RAM_DEPTH-1];
reg oe_r;
//--------------Начало кода------------------
// Управление тристабильным буфером
// output : When we = 0, oe = 1, cs = 1
assign data = (cs && oe && !we) ? data_out : 8'bz;
// Блок записи памяти
// Write Operation : When we = 1, cs = 1
always @ (posedge clk)
begin : MEM_WRITE
           if ( cs && we ) begin
                                 mem[address] = data;
                                end
end
// Блок чтения памяти
// Read Operation : When we = 0, oe = 1, cs = 1
always @ (posedge clk)
begin : MEM_READ
           if (cs && !we && oe) begin
                                         data_out = mem[address];
                                         oe_r = 1;
                                         end else begin
                                                       oe_r = 0;
                                                      end
end
endmodule // Конец модуля ram_sp_sr_sw

 

 

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