数字IC秋招手撕代码(一)异步双端口ram

这篇博客介绍了如何使用Verilog语言设计一个异步双端口RAM,深度为16,位宽为8bit。A口用于读取,B口用于写入,支持片选、读写请求,并且代码可综合。设计思路强调了读写分离和时钟分离,提供了详细的代码实现。
摘要由CSDN通过智能技术生成

数字IC秋招手撕代码(一)异步双端口ram



题目

用verilog实现一个异步双端口ram,深度16,位宽8bit。A口读出,B口写入。支持片选读写请求,要求代码可综合

设计思路

因为要设计双端ram,所以是读写分离,时钟分离,控制信号分离。先确定端口:

端口名备注
rstn低电平复位
cs片选
clkaA端时钟
addraA端地址
doutram输出
rd_en读端使能
clkbB端时钟
addrbB端地址
dinram写入数据
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	




搜索关注我的微信公众号【IC墨鱼仔】,获取我的更多IC干货分享!

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值