1
0
mirror of https://github.com/sehugg/8bitworkshop.git synced 2024-06-01 05:41:31 +00:00
8bitworkshop/presets/verilog/ram.v

82 lines
1.9 KiB
Coq
Raw Permalink Normal View History

`ifndef RAM_H
`define RAM_H
2018-10-01 16:30:47 +00:00
/*
RAM_sync - Synchronous RAM module.
RAM_async - Asynchronous RAM module.
RAM_async_tristate - Async RAM module with bidirectional data bus.
Module parameters:
A - number of address bits (default = 10)
D - number of data bits (default = 8)
*/
2018-02-28 03:35:42 +00:00
module RAM_sync(clk, addr, din, dout, we);
parameter A = 10; // # of address bits
parameter D = 8; // # of data bits
input clk; // clock
2018-06-01 17:33:37 +00:00
input [A-1:0] addr; // address
input [D-1:0] din; // data input
input we; // write enable
output reg [D-1:0] dout; // data output
reg [D-1:0] mem [0:(1<<A)-1]; // (1<<A)xD bit memory
always @(posedge clk) begin
if (we) // if write enabled
mem[addr] <= din; // write memory from din
2018-02-28 03:35:42 +00:00
dout <= mem[addr]; // read memory to dout (sync)
end
endmodule
2018-02-28 03:35:42 +00:00
module RAM_async(clk, addr, din, dout, we);
parameter A = 10; // # of address bits
parameter D = 8; // # of data bits
input clk; // clock
2018-06-01 17:33:37 +00:00
input [A-1:0] addr; // address
input [D-1:0] din; // data input
output [D-1:0] dout; // data output
2018-02-28 03:35:42 +00:00
input we; // write enable
reg [D-1:0] mem [0:(1<<A)-1]; // (1<<A)xD bit memory
2018-02-28 03:35:42 +00:00
always @(posedge clk) begin
if (we) // if write enabled
mem[addr] <= din; // write memory from din
end
assign dout = mem[addr]; // read memory to dout (async)
endmodule
2018-07-22 12:31:42 +00:00
module RAM_async_tristate(clk, addr, data, we);
parameter A = 10; // # of address bits
parameter D = 8; // # of data bits
input clk; // clock
input [A-1:0] addr; // address
inout [D-1:0] data; // data in/out
input we; // write enable
reg [D-1:0] mem [0:(1<<A)-1]; // (1<<A)xD bit memory
2018-07-22 12:31:42 +00:00
always @(posedge clk) begin
if (we) // if write enabled
mem[addr] <= data; // write memory from data
end
assign data = !we ? mem[addr] : {D{1'bz}}; // read memory to data (async)
endmodule
`endif