现代集成电路芯片中,随着设计规模的不断扩大。一个系统中往往含有数个时钟。多时钟带来的一个问题就是,如何设计异步时钟之间的接口电路。异步 fifo(first in first out)是解决这个问题的一种简便、快捷的解决方案。使用异步fifo可以在两个不同时钟系统之间快速而方便地传输实时数据。在网络接口、图像处理等方面,异步fifo都得到广泛的应用。异步fifo是一种先进先出的电路,使用在数据接口部分,用来存储、缓冲在两个异步时钟之间的数据传输。在异步电路中,由于时钟之间周期和相位完全独立,因而数据的丢失概率不为零。如何设计一个可靠性高、速度高的异步fifo电路便成为一个难点。
1 异步fifo的工作原理及逻辑框图
本文根据实际工作的需要。给出了一种利用片内ram构造fifo器件的设计,重点强调了设计有效。可靠的握手信号full和empty的方法。并在lattice公司的fpga芯片lfxp2-5e上实现。lfxp2-5e属于latiice公司xp2系列的一款,他采用优化的flexiflash结构。内部包含有基于查找表的逻辑、分布式和嵌入式存储器,锁相环(pll)。工程预制的源同步i/0以及增强的sysdsp块。有166kbits的ebrsram。利用其内部的ebrsram可以实现一定容量的异步fifo.而无需单独购买fif0器件。
由图1可以看出:异步fifo一般由四个模块构成:数据存储单元,写地址产生模块,读地址产生模块,标志位产生模块。整个系统分为两个完全独立的时钟域—读时钟域和写时钟域:在写时钟域部分由写地址产生逻辑产生写控制信号和写地址:读时钟域部分,由读地址产生逻辑产生读控制信号和读地址;在标志位产生模块部分,由读写地址相互比较产生空/满标志。异步fifo的操作过程为:在写时钟的上升沿。当写使能有效时,将数据写入到双口ram中写地址对应的位置中:在读时钟的上升沿,当读使能有效时。则按先进先出顺序读出数据。在fifo写满或读空的情况下。分别对满标志full或空标志empty信号置位。来表示fifo的两种特殊状态。
图1异步fifo逻辑框图
2 异步fifo的vhdl实现读时钟
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为满条件。
由以上可知。满标志的产生条件为:写指针赶上读指针。即写满后,又从零地址开始写直到赶上读指针,这时期读写指针的最高位不同,其他位相同,这就是满条件。空标志的产生条件为:复位或者是读指针赶上写指针。即在写指针循环到第二轮时读指针赶上写指针,这时读写指针的高低位均相同,这就是空条件。
2.2异步fifo的vhdl语言实现
以下为本程序的核心部分
程序1格雷码计数器的实现
3 仿真验证
基于以上的分析结合实际本文构造了一个8192x8的fifo,用modelsim进行仿真。对该异步fifo编写测试向量进行仿真,如图2所示。
图2仿真波形图
图2中,wclk为写时钟,writeen_in为写使能,full_out为满信号,data_in为数据入,rclk为读时钟,readen_in为读时能,empty_out为空信号,data_out为数据出,clear_in为系统清零信号。上面部分为写地址产生模块部分的信号波形,从图2中可以看出。在写时钟的上升沿。在写时能为高有效期间擞据开始输入到ram里面,而在读时钟的上升沿,在读时能有效时,在本仿真时间的195ns处。开始输出数据。将程序下载到lattice公司的fpga芯片中,经过测试验证,系统的时钟频率可达33mhz。
4 总结
本文主要研究了用fpga芯片实现异步fifo的一种方法。详细阐述了空,满标志信号的产生方法。按照以上思想所设计的异步fifo已经在实际电路中得到了应用。实践证明他可以解决大多数异步fifo电路常见的错误。同时增加了系统的可靠性和应用灵活性。
倍流整流的低压大电流DC-DC变换器
酒厂气体报警器的使用与维护
汽车毫米波雷达测试方案
华为65WUSBPD充电器拆解 整机的用料和做工依然保持业界领先水准
什么是特洛伊木马技术
用FPGA芯片实现高速异步FIFO的一种方法
MAX1452 Diagnostic Clip Circui
比原链正式启动全球开发者大赛,在区块链技术大赛中的优秀团队将会获得200万BTM
CAN总线错误帧基础知识及排查分析技术
一文看懂软性线路板行业发展趋势
小米有品新款暖手宝,55℃双面发热可温暖4小时
粮食水分检测仪的详细介绍
一加3T欧美广告“舔”爱,看得我面红耳赤
单片机教程二:单片机存储器结构
网友:小米6来不来无所谓!四个月不降价,最保值的小米手机
远程医疗与智能监护产品
DC-DC BOOST空载时输入电流的计算公式
不锈钢等离子清洗效果评估|钢板表面油脂污染情况检测方案表面油脂污染度清洁度检测
如何定制Arduino零件
英飞凌科技推出XDP™数字电源平台LED应用系列的新成员XDPL8221