//-----------------------------------------------------
// Имя модуля : ram_sp_ar_sw
// Имя файла : ram_sp_ar_sw.v
// Функц. назначение : Синхронная запись, асинхронное чтение RAM
// Программист : portal-ed.ru/
//-----------------------------------------------------
module ram_sp_ar_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];
//--------------Начало кода------------------
// Управление тристабильным буфером
// 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 @ (address or cs or we or oe)
begin : MEM_READ
if (cs && !we && oe) begin
data_out = mem[address];
end
end
endmodule // Конец модуля ram_sp_ar_sw