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