mirror of
git://projects.qi-hardware.com/nn-usb-fpga.git
synced 2025-01-09 19:20:15 +02:00
53 lines
1.3 KiB
Verilog
53 lines
1.3 KiB
Verilog
//---------------------------------------------------------------------------
|
|
// Behavioral model of a static ram chip
|
|
//
|
|
// Organization:
|
|
//
|
|
// 16 bit x 2**(adr_width-1)
|
|
//---------------------------------------------------------------------------
|
|
module sram16 #(
|
|
parameter adr_width = 18
|
|
) (
|
|
input [adr_width-1:0] adr,
|
|
inout [15:0] dat,
|
|
input ub_n,
|
|
input lb_n,
|
|
input cs_n,
|
|
input we_n,
|
|
input oe_n
|
|
);
|
|
|
|
parameter dat_width = 16;
|
|
|
|
//---------------------------------------------------------------------------
|
|
// Actual RAM cells
|
|
//---------------------------------------------------------------------------
|
|
reg [7:0] mem_ub [0:1<<adr_width];
|
|
reg [7:0] mem_lb [0:1<<adr_width];
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
wire [15:0] mem = { mem_ub[adr], mem_lb[adr] };
|
|
wire [15:0] zzz = 16'bz;
|
|
|
|
// Drive output
|
|
assign dat = (!cs_n && !oe_n) ? mem : zzz;
|
|
|
|
// Write to UB
|
|
always @(*)
|
|
if (!cs_n && !we_n && !ub_n)
|
|
mem_ub[adr] = dat[15:8];
|
|
|
|
// Write to LB
|
|
always @(*)
|
|
if (!cs_n && !we_n && !lb_n)
|
|
mem_lb[adr] = dat[7:0];
|
|
|
|
always @(*)
|
|
if (!we_n && !oe_n)
|
|
$display("Operational error in RamChip: OE and WE both active");
|
|
|
|
endmodule
|
|
|