數字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