Files
ciciec2026_loongson/sim/sram.v

58 lines
1.8 KiB
Verilog
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
`timescale 1ns/100ps
module sram_sp #(
parameter AW = 16,
parameter Init_File = "none"
)
(
inout [31:0] ram_data, //BaseRAM数据低8位与CPLD串口控制器共享
input [19:0] ram_addr, //BaseRAM地址
input [ 3:0] ram_be_n, //BaseRAM字节使能低有效。如果不使用字节使能请保持为0
input ram_ce_n, //BaseRAM片选低有效
input ram_oe_n, //BaseRAM读使能低有效
input ram_we_n //BaseRAM写使能低有效
);
localparam AWT = ((1<<(AW-0))-1);
reg [31:0] BRAM [AWT:0];
initial begin
if(Init_File != "none") begin
$readmemb(Init_File,BRAM);
end
end
reg [AW-1:0] addr_q1;
wire [3:0] write_enable;
assign write_enable[3:0] = (~ram_be_n) & {4{(~ram_ce_n) & (~ram_we_n)}};
always @(*) begin
if (write_enable[0]) BRAM[ram_addr][7:0] = ram_data[7:0];
if (write_enable[1]) BRAM[ram_addr][15:8] = ram_data[15:8];
if (write_enable[2]) BRAM[ram_addr][23:16] = ram_data[23:16];
if (write_enable[3]) BRAM[ram_addr][31:24] = ram_data[31:24];
end
// always@(posedge write_enable[0]) begin
// #10;
// if(~ram_be_n[0]) BRAM[ram_addr][7:0] <= ram_data[7:0];
// end
// always@(posedge write_enable[1]) begin
// #10;
// if(~ram_be_n[1]) BRAM[ram_addr][15:8] <= ram_data[15:8];
// end
// always@(posedge write_enable[2]) begin
// #10;
// if(~ram_be_n[2]) BRAM[ram_addr][23:16] <= ram_data[23:16];
// end
// always@(posedge write_enable[3]) begin
// #10;
// if(~ram_be_n[3]) BRAM[ram_addr][31:24] <= ram_data[31:24];
// end
wire [31:0] RDATA = BRAM[ram_addr];
assign ram_data = ((~ram_ce_n) & (~ram_oe_n)) ? RDATA : 32'hzzzzzzzz;
endmodule