天天看点

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

继续阅读