数字IC秋招手撕代码(一)异步双端口ram
- 题目
- 设计思路
- 代码
题目
用verilog实现一个异步双端口ram,深度16,位宽8bit。A口读出,B口写入。支持片选,读写请求,要求代码可综合
设计思路
因为要设计双端ram,所以是读写分离,时钟分离,控制信号分离。先确定端口:
端口名 | 备注 |
---|---|
rstn | 低电平复位 |
cs | 片选 |
clka | A端时钟 |
addra | A端地址 |
dout | ram输出 |
rd_en | 读端使能 |
clkb | B端时钟 |
addrb | B端地址 |
din | ram写入数据 |
wr_en | 写端使能 |
由于读写分离,所以直接分开写两个always块分别控制读写会简洁很多。
代码
module Dual_port_Sram
#(
parameter ADDR_WIDTH = 4,
parameter DATA_WIDTH = 8,
parameter DATA_DEPTH = 1 << ADDR_WIDTH
)
(
input rstn,
input cs,
input clka,
input [ADDR_WIDTH-1:0] addra,
output [DATA_WIDTH-1:0] dout,
input rd_en,
input clkb,
input [ADDR_WIDTH-1:0] addrb,
input [DATA_WIDTH-1:0] din,
input wr_en
)
integer i;
reg [DATA_WIDTH-1:0] register[DATA_DEPTH-1:0];
always @(posedge clkb)begin //写控制逻辑
if(!rstn)begin
for(i-0;i<DATA_DEPTH;i=i+1)
register[i] <= 0;
end
else if(wr_en && cs)
register[addrb] <= din;
end
always @(posedge clka)begin
if(!rstn)
dout <= 0;
else if(rd_en && cs)
dout <= register[addra];
end
endmodule