天天看點

數字IC秋招手撕代碼(一)異步雙端口ram題目設計思路代碼

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

繼續閱讀