//----------------------------------------------------- // Имя модуля : ram_dp_sr_sw // Имя файла : ram_dp_sr_sw.v // Функц. назначение : Синхронный блок для записи/чтения RAM // Программист : www.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