(完整版)异步FIFO设计
异步FIFO的实现方式

异步FIFO的实现方式实验目的本次实验介绍一种异步FIFO的实现方式。
使用FIFO存储器可以在两个不同时钟系统之间快速而方便的传输数据。
另外,在网络接口,图像处理等方面异步FIFO存储器也得到了广泛的应用。
因此,异步FIFO存储器具有较大的研究和应用价值。
异步FIFO的介绍和整体结构异步FIFO(First In First Out)存储器是指向FIFO缓冲器中写入数据的时钟域和从FIFO缓冲器中读取数据的时钟域是不同的,这两个时钟之间没有必然的因果关系。
异步FIFO是一种先进先出的电路,使用在异步时钟域数据接口的部分,用来存储、缓冲在两个异步时钟之间的数据传输。
在异步电路中,由于时钟之间周期和相位完全独立,所以数据的丢失概率不为零。
如何设计一个高可靠性、高速的异步FIFO存储器便成为一个难点。
异步FIFO的一般结构如图1所示,都是由一个读时钟域电路、一个写时钟域电路和一个双端口的RAM来构成的。
异步FIFO与同步FIFO所做的工作是相同的,都是在写信号有效时写数据到RAM中,在读信号有效时把数据从RAM中读出,所以对于中间部分的RAM 设计是比较简单的。
另外,读电路和写电路单独实现起来也是比较容易的,只需要按照同步FIFO的工作情况,如果没有写满或读空的状态时每写一个数据就把写地址加1,每读一个数据就把读地址减1。
设计难点在于两个时钟域的交叠部分:满、空状态的产生,这也是设计的重点。
图1 异步FIFO结构针对这个问题,先从对亚稳态的处理开始介绍亚稳态的处理一个触发器进入亚稳态时,既无法预测该单元的输出电平,也无法预测何时输出才能稳定在某个正确的电平上。
在这个稳定期间,触发器输出一些中间级电平,或者可能处于振荡状态、并且这种无用的输出电平可以沿信号通道上的各个触发器级联式传播下去。
亚稳态发生的原因是由于在同步系统中,如果触发器的建立时间或保持时间不满足,就可能产生亚稳态,此时触发器输出端Q在亚稳态是指触发器无法在某个规定时间段内达到一个可确认的状态,逻辑误判有可能通过电路的特殊设计减轻危害(如本设计中将使用的Gray码计数器),而亚稳态的传播则扩大了故障面,难以处理。
quartus 异步fifo用法 -回复

quartus 异步fifo用法-回复quartus异步FIFO用法引言:在数字电路设计中,FIFO(First In First Out)是一种常见的数据存储器,它允许数据以先进先出的顺序进出。
在使用Quartus进行FPGA设计时,异步FIFO是一种非常有用的工具,它可以帮助我们处理不同速度的数据流,并实现数据的缓冲和流量控制。
本文将介绍Quartus异步FIFO的基本概念和使用方法,并给出一些实例。
第一部分:Quartus异步FIFO概述1.1 什么是异步FIFO?异步FIFO是一种数据存储器,在其中数据可以以不同速度进入和退出。
与同步FIFO不同,异步FIFO的读写时钟可以是不同的,这使得它可以处理速度不匹配的数据流。
Quartus提供了异步FIFO的库函数和IP核,使得它可以在FPGA设计中方便地使用。
1.2 Quartus异步FIFO的特点Quartus异步FIFO具有以下特点:- 可以使用不同的时钟频率进行读写操作。
- 可以配置不同的缓冲深度来满足特定的设计需求。
- 可以实现流量控制和数据的重排序。
- 可以支持并行读写和读写使能信号。
- 可以适应不同的数据宽度和时钟域要求。
第二部分:Quartus异步FIFO的使用方法2.1 创建异步FIFO在Quartus中创建异步FIFO的方式有两种:使用库函数和使用IP核。
使用库函数创建异步FIFO的步骤如下:- 首先,在Quartus中打开设计工程,并创建一个新的源文件。
- 然后,将异步FIFO的库函数导入到源文件中,以便在设计中调用它。
- 接着,实例化异步FIFO,并通过参数配置其属性,例如宽度,深度,时钟域等。
- 最后,将异步FIFO连接到其他逻辑模块,完成设计。
使用IP核创建异步FIFO的步骤如下:- 首先,在Quartus中打开设计工程,并创建一个新的IP核。
- 然后,在IP核的界面中选择合适的FIFO类型和配置参数。
- 接着,将异步FIFO实例化到设计中,将其连接到其他逻辑模块。
一种异步FIFO的设计方法

一种异步FIFO的设计方法摘要:使用FIFO同步源自不同时钟域的数据是在数字IC设计中经常使用的方法,设计功能正确的FUFO会遇到很多问题,探讨了两种不同的异步FIFO的设计思路。
两种思路都能够实现功能正确的PIFO。
本文所研究的FIFO,从硬件的观点来看,就是一块数据内存。
它有两个端口,一个用来写数据,就是将数据存入FIFO;另一个用来读数据,也就是将数据从FIFO当中取出.与FIFO操作相关的有两个指针,写指针指向要写的内存部分,读指针指向要读的内存部分。
FIFO控制器通过外部的读写信号控制这两个指针移动,并由此产生FIFO空信号或满信号.XX对于异步FIFO而言,数据是由某一个时钟域的控制信号写入FIFO,而由另一个时钟域的控制信号将数据读出FIFO。
也就是说,读写指针的变化动作是由不同的时钟产生的。
因此,对FIFO空或满的是跨时钟域的。
如何根据异步的指针信号对FIFO的满状态或空状态进行正确的是本文研究的重点.此外,设计过程中的一些细节问题也将在文中涉及到。
1指针以及满空信号的产生为了更好地说明问题,先探讨一下同步FIFO指针移动以及满空信号的产生过程.对于同步FIFO,读写指针都指向一个内存的初始位置,每进行一次读写操作,相应的指针就递增一次,指向下一个内存位置。
当指针移动到了内存的最后一个位置时,它又重新跳回初始位置。
在FIFO非满或非空的情况下,这个过程将随着读写控制信号的变化一直进行下去。
如果FIFO处于空的状态,下一个读动作将会导致向下溢出(underflow),一个无效的数据被读人;同样,对于一个满了的FIFO,进行写动作将会导致向上溢出(overflow),一个有用的数据被新写入的数据覆盖。
这两种情况都属于误动作,因此需要设置满和空两个信号,对满信号置位表示FIFO处于满状态,对满信号复位表示FIF O非满,还有空间可以写入数据;对空信号置位表示FIFO处于空状态,对空信号复位表示FIFO非空,还有有效的数据可以读出。
高速异步FIFO的设计与仿真毕业设计

华中科技大学文华学院毕业设计(论文)题目:高速异步FIFO的设计与仿真学生姓名:孙光源学号: 080110011111 学部(系):信息学部电子科学与技术系专业年级:电子科学与技术2008级指导教师:雷鑑铭职称或学位:副教授2012 年5 月13日摘要 (4)ABSTRACT (5)第一章绪论 (6)1.1 FIFO的研究背景与意义 (6)1.2本文的设计任务 (7)1.3本文的主要工作和论文安排 (7)第二章主要问题分析以及解决方案 (8)2.1如何避免亚稳态产生 (9)2.1.1 同步器 (9)2.1.2 格雷码计数器 (9)2.2空满标志如何正确的产生 (11)2.3小结 (11)第三章EDA开发环境介绍 (12)3.1硬件描述语言 (12)3.2M ODELSIM +S YNPLIFY +DC开发环境 (13)3.2.1 Modelsim (13)3.2.2 逻辑综合和综合工具Synplify (14)3.2.3 Design complier简介 (15)3.3设计方法 (16)3.4本章小节 (17)第四章高速异步FIFO的设计 (18)4.1写指针控制模块 (18)4.1.1 重要部分代码: (18)4.1.2 结构图: (19)4.1.3 仿真结果 (19)4.2读指针控制模块 (19)4.2.1 其中重要部分代码: (19)4.2.2 结构图 (20)4.2.3 仿真结果 (20)4.3双端口SRAM模块 (21)4.3.1.结构图 (21)4.3.2 仿真图 (22)4.4空满信号生成电路 (22)4.4.1 重要部分代码 (23)4.4.2.结构图 (24)4.4.3.仿真图 (24)4.5结束语 (25)第五章系统的仿真和测试 (26)5.1FIFO的顶层模块仿真波形 (26)5.2FPGA综合分析 (27)5.3 DC综合结果分析 (28)结束语 (31)致谢 (32)参考文献 (33)附录 (34)摘要在现代的集成电路芯片中,随着设计规模的逐步扩大,一个系统中往往含有数个时钟。
高速异步FIFO的设计与实现

高速异步FIFO的设计与实现2 异步FIFO的实现读时钟2.1 FIFO设计的难点如何同步异步信号,使触发器不产生亚稳态是设计异步FIFO的难点。
国内外解决此问题的较成熟方法是对写地址膜地址采纳格雷码,本文也挺直采纳格雷码。
异步FIFO设计的另一个难点是如何推断FIFO的空/满状态。
为了保证数据正确的写入或读出。
必需保证异步FIFO在满的状态下.不能举行写操作:在空的状态下不能举行读操作。
通常状况下将存储器组织成一个环形链表。
满/空标记产生的原则是:写满不溢出.读空不多读。
即无论在什么状况.都不应浮现读写地址同时对一个存储器地址操作的状况。
在读写地址相等或相差一个或多个地址的时候,满标记应当有效。
表示此时FIFO 已满,外部电路应停止对FIFO发数据。
在满信号有效时写数据应按照设计的要求,或保持、或抛弃重发。
同理,空标记的产生也是如此。
为了更好的推断满/空标记。
采纳在FIFO本来深度的基础上增强一位的办法,而由该位组成的格雷码并不代表新的地址。
也就是说3位格雷码可表示8位的深度,若再加一位最高位MSB,则这一位加其他三位组成的格雷码并不代表新的地址,也就是说格雷码的0100表示7,而1100仍然表示7,只不过格雷码在经过一个以0位MSB的循环后进入一个以1为MSB的循环,然后又进入一个以0位MSB的循环。
其他的三位码仍然是格雷码。
举例解释:一个深度为8字节的FIFO怎样工作(用法已转换为二进制的指针),N=3,指针宽度为N+I=4。
开头rd_ptr_bin和wr_ptr_bin均为“0000”。
此时FIFO中写入8个字节的数据。
wr_ptr_bin=“1000",rd_ptr_bin=“0000”。
固然,这就是满条件。
现在,假设执行了8次的读操作.使得rd_ptr_bin=“1000”,这就是空条件。
另外的8次写操作将使wr_ptr_bin等于“0000”,但rd_ptr_bin仍然等于“1000”,因此,FIFO为满条件。
FIFO设计

• 4) FULL信号控制进程 • 如何判断FULL信号为‘1’;
• 1、当前没有读/写数据有效信号,FIFO数 据已满 • 2、当前没有读有效信号,有写有效信号, 而且FIFO还差一个就满了。
• 4) FULL信号控制进程
•
Process(clk,reset) begin if reset='1' then full_mid<='1'; elsif rising_edge(clk) then if (rd_enable='0' and (fifo_cnt(8 downto 1) = "11111111") and ((fifo_cnt(0)='1') or (wr_enable='1'))) then full_mid<='1'; else full_mid<='0'; end if; end if; end process;
同步FIFO的操作
1、 同步FIFO的操作 当FIFO不满且wr_en有效时,向FIFO写数据,并 置写使能wr_enable有效; 当FIFO不空且rd_en有效时,从FIFO从读出数据 并置读使能rd_enable有效; 当FIFO满且wr_en有效时,置写使能wr_enable
无效且作废此次写操作; 当FIFO空且rd_en有效时,置读使能rd_enable 无效且作废此次读操作。
异步FIFO的设计
• 异步FIFO的数据读、写受不同时钟的控制; • 异步FIFO的空、满状态不能依靠计数的方 式进行,因为读、写均需要对计数器进行 操作; • 如何判断异步FIFO的空、满情形?如何操 作?
异步FIFO的设计与实现

摘要随着数字系统规模的不断增大,单时钟域设计会极大地限制数字系统性能,现代数字系统为了提升性能,常采用多时钟域的设计。
跨时钟域的信号在传输时会遇到亚稳态现象,如何保持系统稳定地传输数据是多时钟域系统设计者重点关注的问题,在跨时钟域传递数据的系统中,常采用异步FIFO(First In First Out,先进先出队列)口来缓冲传输的数据,以克服亚稳态产生的错误,保证数据的正确传输。
常规的异步FIFO 设计采用先同步读写指针后比较产生空/满标志和用先比较读写指针产生空/满标志,再同步到相应时钟域的方法,但由于常规异步FIFO 模块中的RAM 存储器读写寻址指针常采用格雷码计数器以及“空满”控制逻辑的存在,工作频率低,面积大,将使通过这两个模块的信号通路延时对整个模块的工作频率造成制约。
本文提出了一种新型异步FIFO 的设计方法,该方法省略“了满”信号产生模块和多余的存储器位深来简化常规的FIFO 模块,而只保留“空”信号产生模块,避免使用大量的同步寄存器,减少了面积空间。
FPGA 验证的结果表明,改进后的异步 FIFO 性能有了显著的提高。
关键词:现场可编程门阵列(FPGA )亚稳态空/满标志产高速FIFOABSTRACTWith the increasing of digital system size, a single clock domain design will greatly limit the digital system performance. To enhance the performance of modern digital systems, multiple clock domain design is conventionally adopted. While being transmitted, Cross-clock domain signals will come across the phenomenon of metastability, hence it will be a major concern for the multi -clock domain system designers to probe how to maintain the system stability and to have data transmission conducted smoothly. As to the bus system data transmission in the system where the two data interface clocks don’t match, one of super and effective solutions is to use asynchronous FIFO buffer memory. How To solve the key and difficult issue that metastability and how to generate empty and full flag correctly in asynchronous FIFO design. Traditional FIFO design often synchronizes write/read address first, then compares them to generate empty/full signals or empty / full flag first compare the read and write pointer, and then synchronized to the clock domain, This design takes on too much area and can only work at a low frequency,this will allow the signaling pathways of these two modules delay caused by constraints of the operating frequency of the entire module. A new method of asynchronous FIFO is proposed to overcome these problems,omit the "full" signal generator module and redundant memory bit depth to simplify the conventional FIFO module, leaving only the "empty" signal generation module,avoid the use of a large number of synchronization registers, reducing the area of space. FPGA verification results show that the asynchronous FIFO improved performance has been significantly improved.Keywords: Field Programmable Gate Array (FPGA); Metastable; Mmpty / Full Flag production; High-speed FIFO目录摘要 (I)ABSTRACT (II)第一章绪论 (1)1.1研究背景和意义 (1)1.2研究现状 (1)1.3本文的主要工作 (3)1.4论文结构 (3)第二章跨时钟域设计的挑战与实现方法 (4)2.1跨时钟域设计的挑战 (4)2.1.1亚稳态问题 (4)2.1.2亚稳态产生的原因 (5)2.1.3亚稳态的危害 (5)2.2 跨时钟域的实现方法 (6)2.2.1同步器 (6)2.2.2握手机制 (9)第三章开发环境 (11)3.1硬件平台 (11)3.2软件平台 (11)第四章异步FIFO的设计与实现 (13)4.1异步FIFO (13)4.1.1异步FIFO工作原理 (13)4.1.2异步FIFO设计的难点 (14)4.2常见异步 FIFO 的设计 (16)4.2.1 读写地址产生逻辑 (18)4.2.2空/满标志的产生及代码的实现 (19)4.3.3改进的异步 FIFO 设计方法分析 (22)4.4高速异步FIFO的设计与实现 (23)4.4.1常见FIFO模块分析 (23)4.4.2高速异步FIFO 设计 (25)第五章结论 (28)第六章参考文献 (29)致谢 (30)附录高速异步FIFO设计仿真分析 (31)附1. 设计工作流程 (31)附.1.1 设计输入 (31)附.1.2 设计编译 (35)附.1.3 设计仿真 (36)第一章绪论1.1研究背景和意义作为21 世纪最重要的科学领域之一,超级计算机是体现科技竞争力和综合国力的重要标志。
基于verilog_hdl的异步FIFO设计毕业设计

题目基于verilog hdl的异步FIFO设计毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。
尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。
对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。
作者签名:日期:指导教师签名:日期:使用授权说明本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。
作者签名:日期:学位论文原创性声明本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。
除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。
对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。
本人完全意识到本声明的法律后果由本人承担。
作者签名:日期:年月日学位论文版权使用授权书本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。
本人授权大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
涉密论文按学校规定处理。
作者签名:日期:年月日导师签名:日期:年月日注意事项1.设计(论文)的内容包括:1)封面(按教务处制定的标准封面格式制作)2)原创性声明3)中文摘要(300字左右)、关键词4)外文摘要、关键词5)目次页(附件不统一编入)6)论文主体部分:引言(或绪论)、正文、结论7)参考文献8)致谢9)附录(对论文支持必要时)2.论文字数要求:理工类设计(论文)正文字数不少于1万字(不包括图纸、程序清单等),文科类论文正文字数不少于1.2万字。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
异步FIFO设计文档
一、概述
在大规模ASIC或FPGA设计中,多时钟系统往往是不可避免的,这样就产
生了不同时钟域数据传输的问题,其中一个比较好的解决方案就是使用异步
FIFO来作不同时钟域数据传输的缓冲区,这们既可以使相异时钟域数据传输的
时序要求变得宽松,也提高了它们之间的传输效率。此文内容就是阐述异步FIFO
的设计。
二、设计原理
2.1结构框图
Fig. 2.1.1
如上图所示的同步模块synchronize to write clk,其作用是把读时钟域的读
指针rd_ptr采集到写时钟(wr_clk)域,然后和写指针wr_ptr进行比较从而产生
或撤消写满标志位wr_full;类似地,同步模块synchronize to read clk的作用是
把写时钟域的写指针wr_ptr采集到读时钟域,然后和读指针rd_ptr进行比较从
而产生或撤消读空标志位rd_empty。
另外还有写指针wr_ptr和写满标志位wr_full产生模块,读指针rd_ptr和读
空标志位rd_empty产生模块,以及双端口存储RAM模块。
2.2 二进制计数器存在的问题
异步FIFO读写指针需要在数学上的操作和比较才能产生准确的空满标志
位,但由于读写指针属于不同的时钟域及读写时钟相位关系的不确定性,同步模
块采集另一时钟域的指针时,此指针有可能正处在跳变的过程中,如图Fig.2.2.1
所示,那么采集到的值很有可能是不期望的值,当然,不期望的错误结果也会随
之发生。
Fig. 2.2.1
上图中,rd_ptr2sync 3和4以及4和5之间的中间态是由于到各寄存器的时
钟rd_clk存在偏差而引起的。二进制的递增操作,在大多数情况下都会有两位或
者两以上的bit位在同一个递增操作内发生变化,但由于实际电路中会存在时钟
偏差和不同的路径延时,二进制计数器在自增时会不可避免地产生错误的中间结
果,如图Fig.2.2.2。
Fig.2.2.2
上图是Fig.2.2.1的电路原型以及局部波形的放大。由于rd_clk上升沿到达
三寄存器的时间各不相同,这就导致了rd_ptr2sync的值从3’b011跳变3’b100的
过程中经历了3’b111和3’b101,直到最后一个时钟(rd_clk0)沿的到来rd_ptr2sync
才跳变到正确结果3’b100。中间结果的持续的时间虽然相对短暂,但是这些不正
确的结果完全有可能被其它时钟域的同步模块采集到而产生错误的动作,见上
图。
由此可见,要避免中间结果的产生,其中一个可行的方案就是使被同步模
块采集的数据递变时,每次只有一个bit位发生改变。格雷码计数器就是一个不
错的选择。
2.3 格雷码计数器的实现
2.3.1 格雷码的表现形式
格雷码一个最大的特点就是在递增或递减的过程中,每次只变化一位,这是
它最大的优点。同时它也有自己的局限性,那就是循环计数深度必须是2的n
次幂,否则就失去了每次只变化一位的特性。深度为16的二进制及格雷码递变
表如下:
Binary Gray
0 0000 0000
1 0001 0001
2 0010 0011
3 0011 0010
4 0100 0110
5 0101 0111
6 0110 0101
7 0111 0100
8 1000 1100
9 1001 1101
10 1010 1111
11 1011 1110
12 1100 1010
13 1101 1011
14 1110 1001
15 1111 1000
0 0000 0000
2.3.2 二进制和格雷码的相互转换
1、二进制到格雷码:
[1][1];[2][2][1];[2][2][3];[1][1][2];[0][0][1];graynbinngraynbinnbinngraybinbingraybinbingraybinbin
总结上述转换规律,又知000aaaa••,所以它们之间有如
下简化关系:[1:0]([1:0]1)[1:0];graynbinnbinn
2、格雷码到二进制:
[0][1][2]...[1][0];[1][1][2]...[1];.........bingrayngrayngraygraybingrayngrayngray
[2][1][2];[1][1];binngrayngraynbinngrayn
总结上述转换规律,又知000aaaa••,所以它们之间有如
下简化关系:[]([1:0]);.................(01)binigrayniin
2.3.3
格雷码计数器的实现
如下图fig.2.3.1所示,指向存储器的地址指针由二进制计数器产生,而用于
跨时钟域传播的格雷码指针是对二进制指针的实时转换并用寄存器采集获得的。
这里要注意的是,计数器的位宽比实际所需的位宽要多出一位,这样做的目的是
方便判断FIFO的空或满,这一点下文中将会介绍。
Fig.2.3.1 格雷码计数器结构图
2.4 空满标志位的产生
异步FIFO最核心的部分就是精确产生空满标志位,这直接关系到设计的成
败。本文采用比较读写指针来判断FIFO的空满,如果FIFO的深度是n-1位线
所能访问到的地址空间,那么此设计所要用的指针位宽就比实际多出一位,也就
是n位,这样做有助于判断FIFO是空还是满。
2.4.1 读空标志位的产生
当读地址rd_ptr赶上写地址wr_ptr,也就是rd_ptr完全等于wr_ptr时,可以
断定,FIFO里的数据已被读空,而且只有在两种情况下,FIFO才会为空:第一
种是系统复位,读写指针全部清零;另一种情况是在FIFO不为空时,数据读出
的速率快于数据写入的速率,读地址赶上写地址时FIFO为空。空标志位的产生
需要在读时钟域里完成,这样不至于发生FIFO已经为空了而空标志位还没有产
生的情况,但是可能会发生FIFO里已经有数据了而空标志位还没有撤消的情况,
不过就算是在最坏情况下,空标志位撤消的滞后也只有三个时钟周期,这个问题
不会引起传输错误;还有一种情况就是空标志比较逻辑检测到读地址和写地址相
同后紧接着系统产生了写操作,写地址增加,FIFO内有了新数据,由于同步模
块的滞后性,用于比较的写地址不能及时更新,这样,一个本不应该有的空标志
信号就产生了,不过这种情况也不会导致错误的发生,像这种FIFO非空而产生
空标志信号的情况称为“虚空”。
Fig. 2.4.1.1 空标志产生逻辑
如图Fig. 2.4.1.1 空标志产生逻辑,写时钟域的写指针通过两级寄存被同步
到读时钟域之后与读指针进行比较,如果完全相等,则会产生空标志信号;同步
模块用两级寄存器来实现是为了消除可能的亚稳态,正如前面所述,因为
wr_ptr_gray是用格雷码实现的,即使同步模块是在wr_ptr_gray跳变的时刻进行
采集,其采集到的所有可能值也只有两个,一个是跳变之前的值,一个是跳变之
后的值,它们只相差1,最坏情况也只是产生了“虚空”信号,而这不会引起错
误传输。
Fig. 2.4.1.2 空标志产生时序
2.4.2 写满标志位的产生
和读空标志位产生机制一样,写满标志位也是通过比较读写地址产生的。读
写指针的关系就好比A,B两个田径运动员在一环形跑道上进行比赛一样,当B
运动员领先A并整整超前一圈时,A,B两人的地点相同,此种情况对应于读写
指针指向了同一地址,但写指针超前整整一圈,FIFO被写满。如此看来,和读
空标志产生一样,写满标志也是读写指针相同时产生。但是如果地址的宽度和
FIFO实际深度所需的宽度相等,某一时刻读写地址相同了,那FIFO是空还是满
就难以判断了。所以读写指针需要增加一位来标记写地址是否超前读地址(在系
统正确工作的前提下,读地址不可能超前于写地址),比如FIFO的深度为8,我
们需要用宽度为4的指针。
Fig. 2.4.2.1 格雷码指针和存储空间的映射关系
如果读指针的最高位为0,而写指针的最高位为1,说明写指针超前于读指
针,这时如果读写指针指向同一存储空间,参照Fig. 2.4.2.1 , 则FIFO被写满。
写满标志位产生逻辑只需关心格雷码指针最高位不同(写超前于读)且它们指向
同一存储空间的情况,那么怎么通过比较两格雷码指针来判断这种情况的发生
呢?首先,最高位相异(因为读指针不可能超前于定指针,所以只可能是写指针
超前于读指针);其次,如果把最高位为1的所有格雷码指针的次高位均取反后,
除去最高位不看,则指向同一存储空间的两指针相同,从而得出第二个条件是:
次高也相异。
Fig. 2.4.2.2 写满标志位产生逻辑