| // open RAM implemented as flip flops (fall back solution) | |
| module openRam ( | |
| input wire CLK, | |
| input wire CSb, | |
| input wire WEb, | |
| input wire [4:0] ADDR, | |
| input wire [7:0] DATA_IN, | |
| output wire [7:0] DATA_OUT | |
| ); | |
| // control signal flip flops | |
| reg CSb_Q; | |
| reg WEb_Q; | |
| reg [4:0] ADDR_Q; | |
| reg [7:0] DATA_IN_Q; | |
| // "RAM" flip flops (32 x 8bit = 256bit) | |
| reg [7:0] RAM_Q [31:0]; | |
| reg [7:0] RAM_OUT_Q; | |
| // module output | |
| assign DATA_OUT = RAM_OUT_Q; | |
| // latch control signals first | |
| always @(posedge(CLK)) begin | |
| CSb_Q <= CSb; | |
| WEb_Q <= WEb; | |
| ADDR_Q <= ADDR; | |
| DATA_IN_Q <= DATA_IN; | |
| end | |
| // actual ram cell access | |
| always @(negedge(CLK)) begin | |
| // new ram access | |
| if (CSb_Q == 1'b0) begin | |
| // valid write access | |
| if (WEb_Q == 1'b0) begin | |
| RAM_Q[ADDR_Q] <= DATA_IN_Q; | |
| RAM_OUT_Q <= DATA_IN_Q; | |
| // valid read access | |
| end else RAM_OUT_Q <= RAM_Q[ADDR_Q]; | |
| end | |
| end | |
| endmodule |