- // 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 
-   
-