可综合的异步fifo设计(一)

异步FIFO设计一、基本概念二、设计思路2.1 设计前准备工作2.1.1 系统框图2.1.2 格雷码基础2.1.3 异步fifo工作流程举例2.2 RTL建模2.2.1 DPRAM建模2.2.2 WR_LOGIC建模2.2.3 RD_LOGIC建模2.2.4 PIPE模块建模2.2.5 格雷码处理模块建模一、基本概念1.异步fifo定义:跨读写时钟域的dpram(双口ram),fifo的读写时钟是相互独立的两个时钟,在各自时钟下实现fifo数据的读写功能。2.异步fifo用途:【1】跨时钟域的多bi
摘要由CSDN通过智能技术生成

一、基本概念

1.异步fifo定义:跨读写时钟域的dpram(双口ram),fifo的读写时钟是相互独立的两个时钟,在各自时钟下实现fifo数据的读写功能。

2.异步fifo用途:

【1】跨时钟域的多bit数据传输;

【2】数据的缓存;

二、设计思路

2.1 设计前准备工作

2.1.1 系统框图

主要包括三部分:Dpram、rd_logic和wr_logic。构成如下图2-1.1的系统框图。
在这里插入图片描述

图2-1.1 本设计的异步fifo系统框图

具体设计之前,定义各个模块的基本功能。Dpram本质上是一个读写ram,在wr_en(写使能)和rd_en(读使能)的作用下,在各自时钟沿完成数据的写入和读出。

Wr_logic为写时钟域逻辑模块,主要实现:
[1] 在wr_en下wr_addr增加,并将该地址作格雷码处理待输出给rd_logic;
[2] 写满标志wr_full判断及产生;
[3] 接收rd_loic传来的rd_addr_gray,打2-3拍完成地址同步;
rd_logic为读时钟域逻辑模块,主要实现:
[1] 在rd_en下rd_addr增加,并将该地址作格雷码处理待输出给wr_logic;
[2] 读空标志rd_empty判断及产生;
[3] 接收wr_loic传来的wr_addr_gray,打2-3拍完成地址同步;

2.1.2 格雷码基础

作为一种计算机编码方式,格雷码具有如下特点:循环码;相邻码或对称项编码仅有1bit不相同。举例,如下2-1.2列出了0-15的4bit格雷码,可见,十进制码0和1、1和2、14和15(相邻码)对应的Gray4仅有1bit不同,其余位全相同;再观察0和15、1和14、7和8(对称项码)也仅有1bit不同,其余位全相同;再观察,gray4的第0bit,以0110作为循环节,次低位(第1bit)以00111100位循环节,第2bit按照0000_1111_1111­_0000为循环节,且循环节中0和1的个数是相等的。
在这里插入图片描述

图2-1.2 十进制数0-15的4bit格雷码对照图

格雷码具有相邻码仅有1bit相异的特点,故在跨时钟域处理时,用作地址传输时,可以有效减少重汇聚(re-coverage,即多bit数据跨时钟域传输时,若时钟采样刚好发生在数据变化时刻,采样到的各bit数据就会不确定,有可能是变化前,也有可能是变化后的)现象发生的概率。这就是异部fifo采用格雷码地址传输的原因。

2.1.3 异步fifo工作流程举例

在RTL建模之前,先举例了解async_fifo的工作机制。如下图2-1.3,为一个深度为8的async_fifo。

在这里插入图片描述

图2-1.3 深度为8的fifo

NOTE1:规定写指针总是指向下一个将要写入的地址,读地址指向当前读出的地址;

NOTE2:写满后不能继续写,有数据保护,读空后不能再读,避免错读;

①开始,fifo为空,wr_ptr(蓝色为写指针)和rd_ptr(橘黄色为读指针)均指向0地址。向fifo中写入3个数据后,蓝色指针指向addr3,此时未写满。接下来有两种操作,1继续写;2不写,读数据;若选择操作1,蓝色指针向上指直到写满并产生wr_full标志,则不能再写入数据,直到进行读操作,若选择操作2,橘黄色指针递增,当橘黄色指针指向addr3的前一个地址即addr2时,fifo被读空,产生rd_empty标志,此后不能再读。(先写到0010(实际上写地址指向0110,即下一个地址)再读到0010,将写地址à读时钟域,读空标志产生)

②随后继续写,则读空标志消失,比如写到addr6(0101),随后可进行读操作,读到addr6则fifo再次读空并产生rd_empty标志;若写到addr6后继续写,写到addr7后达到fifo_deepth,再执行写操作,写指针会循环一圈,重新指向addr0(此时写地址记成wr+1:addrx),直到再次写到wr+1:addr3,此时fifo倍写满,由于写满保护,则后续只能进行读操作。若一直进行读操作,读指针递增至rd:addr7,之后读指针也循环一圈,直到再次指向addr3(记作rd+1:addr3),再一次产生rd_empty标志。

③至此,读写指针都循环一圈,重新指向addr3回到新的同一个起点,此记作一个round,而后的操作重复执行①、②。

将上述读写流程用流程图描述,见图2-1.4.

在这里插入图片描述

图2-1.4 深度为8的fifo读写流程示意图(1个循环)
2.1.4 异步fifo空满标志产生的算法设计

按照图2-1.4所述读写流程,发现规律:

1、在读写流程中,当读写指针都在同一个循环之内(读写指针轮回的次数相同)时,

wr_addr≥rd_addr

此时读写指针的状态就是读指针滞后于写指针(即rd_addr总是追赶wr_addr),当rd_addr追赶上wr_addr时(认为相等),即把写的内容全部读完,则rd_empty标志产生。

2、写满、读空保护机制的存在,在逻辑上总是“先写后读”,这就使得写指针总是先于读指针完成一次轮回,当写指针来到新的一圈轮回时,此时,

Case1:rd_addr≥wr_addr

意思是,写指针已经写完一圈了,即将和读指针相遇,直到再次追上rd_addr(认为相等),则把所有的空余空间全部写完,则wr_full标志产生。

若读使能有效,则rd_addr也会递增,在wr_addr轮回一圈之后rd_addr也会轮回新的一圈,记此时两者仍在同一等级(至少是在同一圈),此时,

Case2:wr_addr≥rd_addr

很不幸,rd_addr再次踏上追逐wr_addr的道路,当两者再次相等时,rd_empty标志产生,再次读完。此后循环1、2步骤。

基于上,需要记录读写指针所在圈数轮回的不同,用 奇偶数圈标志(0、1、2、3…….),转两圈就回到偶数圈,这样可以在原有指针地址的基础上, 扩展1bit记录奇偶圈;新的一圈时,地址表示见下图2-1.5。

在这里插入图片描述

图2-1.5 深度为8的fifo读写地址轮回一圈的表示方法

NOTE1:上述圆圈转一圈回到起点,该圈成为映射圈。

NOTE2:十进制地址0-7之后就会变成0,这是fifo的一次轮回(因为fifo物理上不是一个圆圈),当十进制地址新的一圈轮回结束后,再次回到起点,这称为映射圈(格雷码映射圈)的一个轮回。

深度为8的fifo,用3bit(8个地址)+1bit(奇偶圈标志)表示,上图所示,红色线表示圈的起点,绿色线标志圈的终点(0-7为第0圈,扩展位为0,15-8为轮回一圈,扩展位为1),当从0-7再从15-8时,地址再次变成0(0000)回到偶数圈,新的一个映射圈轮回开始。

观察知,上述映射圈实际上被16个地址平均分配,十进制数对应0-15,格雷码对应0000-1000,因为格雷码循环码的特征,正好可以用来记录fifo的奇偶圈,又因为格雷码具有对称位置相差1bit的特征,即十进制0-15的gray4只有最高位相反。所以,十进制地址计数器只会计数到7,只不过不同的两圈用不同的格雷码映射,两者结合可以完成空满标志的判断。

综上分析,格雷码映射圈顺时针循环,从十进制0-7,再从15-8,而体现在格雷码上,除去最高位(bit3),低3位是循环的,这正好符合设计初衷。至此,完成空满标志产生的算法设计。

2.2 RTL建模

2.2.1 DPRAM建模

如图2-2.1,为DPRAM的接口示意图。该模块功能简单,只需要在rd_clk和wr_clk下,当使能信号有效,分别向ram中写入和读取数据即可。

在这里插入图片描述

图2-2.1 深度为8的dpram的接口示意图

RTL代码如下:

module dpram # (
	parameter WR_WID = 8 , 
	parameter RD_WID = 8 ,
	parameter ADDR_W
  • 12
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值