// part of NeoGS project (c) 2007-2008 NedoPC
//
// mem512b is 512 bytes synchronous memory, which maps directly to the EAB memory block of ACEX1K.
// rdaddr is read address, dataout is the data read. Data is read with 1-clock latency, i.e. it
// appears after the positive clock edge, which locked rdaddr.
// wraddr is write address, datain is data to be written. we enables write to memory: when it
// locks as being 1 at positive clock edge, data contained at datain is written to wraddr location.
//
// clk __/``\__/``\__/``\__/``\__/``
// rdaddr |addr1|addr2|
// dataout |data1|data2|
// wraddr |addr3|addr4|
// datain |data3|data4|
// we _________/```````````\_______
//
// data1 is the data read from addr1, data2 is read from addr2
// data3 is written to addr3, data4 is written to addr4
//
// simultaneous write and read to the same memory address lead to undefined read data.
module mem512b(
rdaddr, // read address
wraddr, // write address
datain, // write data
dataout, // read data
we, // write enable
clk
);
input [8:0] rdaddr;
input [8:0] wraddr;
input [7:0] datain;
output reg [7:0] dataout;
input we;
input clk;
reg [7:0] mem[0:511]; // memory block
always @(posedge clk)
begin
dataout <= mem[rdaddr]; // reading data
if( we ) // writing data
begin
mem[wraddr] <= datain;
end
end
endmodule