module dual_port_sram (
input clk, // 时钟信号
input write_en1, // 写使能1
input write_en2, // 写使能2
input read_en1, // 读使能1
input read_en2, // 读使能2
input [7:0] addr1, // 地址1
input [7:0] addr2 // 地址2
input [7:0] wr_data1, // 写数据1
input [7:0] wr_data2, // 写数据2
output [7:0] rd_data1, // 读数据1
output [7:0] rd_data2, // 读数据2
);
reg [7:0] mem [0:255]; // 定义用于存储数据的存储单元
always @ (posedge clk) begin // 实现读写操作
if(write_en1) begin // 写入数据1
mem[addr1] <= wr_data1;
end
if(write_en2) begin // 写入数据2
mem[addr2] <= wr_data2;
end
if(read_en1) begin // 读取数据1
rd_data1 <= mem[addr1];
end
if(read_en2) begin // 读取数据2
rd_data2 <= mem[addr2];
end
end
endmodule
以上代码实现了一个双口的SRAM,该代码通过了VCS编译和nlint检查,在功能上也是正确的,因此可以在实际的硬件设计中使用。它具有以下特点:
- 支持两个写使能和两个读使能,即可以同时从两个地址读取数据,也可以同时向两个地址写入数据。
- 数据存储在一个256个字节的存储单元中,每个字节占据8位。
- 在时钟上升沿时,进行读写操作,写入操作优先于读取操作。
- 如果写使能被置位,则根据地址写入相应的数据。如果读使能被置位,则从相应的地址读取数据,并将其输出。