本发明属于数字集成电路设计领域,特别涉及一种异步先入先出(fifo,firstinputfirstoutput)的数据缓存控制器。
背景技术:
在现场可编程逻辑门阵列(fpga,fieldprogrammablegatearray)系统中,如果数据传输中不满足触发器的建立时间和保持时间,或者复位过程中复位信号的释放相对于有效时钟沿的恢复时间不满足,就可能产生亚稳态,此时触发器输出端在有效时钟沿之后比较长的一段时间处于不确定的状态,在这段时间内输出端在0和1之间处于振荡状态,而不是等于输入端的值。只要系统中有异步元件,亚稳态就无法避免。亚稳态主要发生在异步信号检测、跨时钟域信号传输以及复位电路等常用设计中。由于产生亚稳态后,寄存器输出端输出在稳定下来之前可能是毛刺、振荡、固定的某一电压值。在信号传输中产生亚稳态就会导致与其相连其他数字部件将其作出不同的判断,有的判断到“1”有的判断到“0”,有的也进入了亚稳态,数字部件就会逻辑混乱。在复位电路中产生亚稳态可能会导致复位失败。在跨时钟域的数据传输中产生亚稳态的现象尤为明显。
在大规模集成电路设计中,多时钟系统往往是不可避免的,这样就产生了跨时钟域的数据传输问题,时钟域的时钟频率不同是导致亚稳态问题的一个重要原因,即跨时钟域的数据传输会导致亚稳态问题的产生。然而系统的运作和功能体现则需要所有模块的相互合作,这样,设计工作过程中必然就存在着不同模块之间的数据传输跨时钟域就是一条路径穿过不同的时钟域,由于不同时钟域的时钟频率不同,就会难以确定信号传输的正确性,解决跨时钟域路径的信号传输问题就是异步fifo设计的目的之一。其中一个比较好的解决方案就是使用异步fifo来作不同时钟域数据传输的缓冲区,这样既可以使相异时钟域数据传输的时序要求变得宽松,也提高了它们之间的传输效率。fifo存储器依靠合理的价格、使用的方便性和灵活性以及对速度进行匹配这些特点而成为解决这类问题的理想方法。异步fifo一般可作为速率匹配数据缓冲器,能在快速处理器和较慢的外设之间实现速率匹配,且它在远程通信、数字信号处理、大容量存储系统、图像处理以及打印系统这些领域非常有用。
在多种解决跨时钟域问题的方法中,异步fifo较为简便、快捷。异步fifo是一种先进先出的逻辑电路,本质上可以看做是一种缓存单元,但区别在于它的另一个作用是确保两个不同时钟域之间的数据正确传输。功能实现过程中,写时钟域的数据通过写操作进入异步fifo缓存,读时钟域则通过读操作从异步fifo的缓存中读走数据,进而达到跨时域路径的数据稳定、有效传输。
在异步fifo的结构中,由于时钟频率不同的影响,为了确保通信的正常,需要建立严格的握手机制,但当时钟频率差距过大时,握手机制有可能失效,此时为了确保系统的正常运行,通常是对缓存深度进行增加,但是在数据位宽较大的系统中,如果加深缓存深度就会带来巨大的资源浪费。
技术实现要素:
针对上述异步fifo在两个时钟域下数据缓存溢出的问题,本发明提出了一种异步先入先出fifo的数据缓存控制器,能够在两个时钟域中握手机制失效的情况下,不通过无限制的增加ram(随机存取存储器randomaccessmemory,ram)深度,而是通过本发明提出的异步fifo数据缓存控制器结构来达到防止数据溢出的目的。
本发明的技术方案为:
一种异步先入先出的数据缓存控制器,包括双端口ram存储模块、写地址产生逻辑模块、读地址产生逻辑模块、写满判断模块、读空判断模块、读指针同步模块、写指针同步模块、写指针计数模块和读指针计数模块,
所述写地址产生逻辑模块的时钟端连接写时钟信号,其复位端连接写复位信号,其使能端连接写使能信号,其控制端连接写控制信号,其地址输出端输出写地址信号,其指针输出端连接写指针信号;
当所述写控制信号为低电平时,所述写地址产生逻辑模块在所述写时钟信号的每个周期将写地址信号和写指针信号的编码自加1后输出;当所述写控制信号为高电平时,所述写地址产生逻辑模块输出的写地址信号和写指针信号的编码停止自加1保持不变;
所述读地址产生逻辑模块的时钟端连接读时钟信号,其复位端连接读复位信号,其使能端连接读使能信号,其控制端连接读控制信号,其地址输出端输出读地址信号,其指针输出端连接读指针信号;
当所述读控制信号为低电平时,所述读地址产生逻辑模块在所述读时钟信号的每个周期将读地址信号和读指针信号的编码自加1后输出;当所述读控制信号为高电平时,所述读地址产生逻辑模块输出的读地址信号和读指针信号的编码停止自加1保持不变;
所述双端口ram存储模块包括写控制单元、读控制单元和存储单元,
所述存储单元的数据输入端连接写入数据信号,其数据输出端连接读出数据信号;
所述写控制单元的时钟端连接所述写时钟信号,其复位端连接所述写复位信号,其使能端连接所述写使能信号,其地址输入端连接所述写地址信号,所述写控制单元用于控制所述写入数据信号在写时钟域下存入到所述存储单元中对应地址;
所述读控制单元的时钟端连接所述读时钟信号,其复位端连接所述读复位信号,其使能端连接所述读使能信号,其地址输入端连接所述读地址信号,所述读控制单元用于在读时钟域下将所述存储单元中对应地址的数据读出获得所述读出数据信号;
所述写指针计数模块用于对所述写指针信号进行计数,当计数结果达到设定值时产生高电平的写指针计数控制信号;
所述读指针计数模块用于对所述读指针信号进行计数,当计数结果达到设定值时产生高电平的读指针计数控制信号;
所述读指针同步模块用于将所述读指针信号同步到写时钟域;
所述写指针同步模块用于将所述写指针信号同步到读时钟域;
所述写满判断模块的时钟端连接所述写时钟信号,其复位端连接所述写复位信号,所述写满判断模块用于比较所述写地址产生逻辑模块输出的写指针信号和所述读指针信号经所述读指针同步模块同步后的信号,当两者只有最高位和次高位不同时输出高电平的写满判断信号;
所述读空判断模块的时钟端连接所述读时钟信号,其复位端连接所述读复位信号,所述读空判断模块用于比较所述读地址产生逻辑模块输出的读指针信号和所述写指针信号经所述写指针同步模块同步后的信号,当两者完全相同时输出高电平的读空判断信号;
所述写指针计数控制信号和所述写满判断信号相或后产生所述写控制信号;
所述读指针计数控制信号和所述读空判断信号相或后产生所述读控制信号。
具体的,所述读地址信号为二进制编码形式输出,所述读指针信号为二进制转格雷码形式输出;所述写地址信号为二进制编码形式输出,所述写指针信号为二进制转格雷码形式输出;
具体的,所述读指针同步模块包括两个d触发器,所述读指针信号经过两个d触发器延时两次后输出到所述写满判断模块与所述写指针信号进行比较;所述写指针同步模块包括两个d触发器,所述写指针信号经过两个d触发器延时两次后输出到所述读空判断模块与所述读指针信号进行比较。
具体的,所述写指针计数模块的判断逻辑为,对所述写指针信号进行计数,当计数到所述双端口ram存储模块地址深度的前两个数时,输出高电平的写指针计数控制信号,否则输出低电平的写指针计数控制信号;
所述读指针计数模块的判断逻辑为,对所述读指针信号进行计数,当计数到所述双端口ram存储模块地址深度的前两个数时,输出高电平的读指针计数控制信号,否则输出低电平的读指针计数控制信号。
具体的,所述写指针计数模块输出高电平的写指针计数控制信号后,所述写指针计数模块经过所述写时钟信号的五个周期后复位;
所述读指针计数模块输出高电平的读指针计数控制信号后,所述读指针计数模块经过所述读时钟信号的五个周期后复位。
本发明的有益效果为:本发明能够在不增加ram深度且不影响系统整体运行速度的情况下,使数据正常的写入和读出,能够解决跨时钟域数据传输中两个时钟域下数据缓存溢出的问题。
附图说明
图1为本发明提出的一种异步先入先出的数据缓存控制器的系统框图。
具体实施方式
下面结合附图和具体实施例详细说明本发明的技术方案。
如图1所示,本发明提出的一种异步先入先出的数据缓存控制器包括双端口ram存储模块201、写地址产生逻辑模块202、读地址产生逻辑模块203、写满判断模块204、读空判断模块205、读指针同步模块206、写指针同步模块207、写指针计数模块208和读指针计输模块209。
其中双端口ram存储模块201有九个输入端口和一个输出端口,写时钟端口、写复位端口、写使能端口、写地址端口设置在双端口ram存储模块201的写控制单元内;读时钟端口、读复位端口、读使能端口、读地址端口设置在双端口ram存储模块201的读控制单元内;双端口ram存储模块201的存储单元的输入端口是写数据端口,输出端口是读数据端口。写时钟端口连接写时钟信号wrclk、写复位端口连接写复位信号wrrst、写使能端口连接写使能信号wren、写地址端口连接写地址产生逻辑模块202输出端写地址信号wraddr,读时钟端口连接读时钟信号rdclk、读复位端口连接读复位信号rdrst、读使能端口连接读使能信号rden、读地址端口连接读地址产生逻辑模块203输出端读地址信号rdaddr,写数据端口输入写入数据信号wrdata,读数据端口输出读出数据信号rddata,双端口ram存储模块201的写数据端口仅在写时钟域的控制下写入数据,读数据端口仅在读时钟域的控制下读出数据;写地址端口和读地址端口分别由写地址产生逻辑模块202和读地址产生模块203控制,深度可自行设定。且双端口ram存储模块201的读写数据位宽也可自行设定。
写地址产生逻辑模块202有四个输入端口:时钟端连接写时钟信号wrclk、复位端连接写复位信号wrrst、使能端连接写使能信号wren、控制端连接写控制信号wrstop;写地址产生逻辑模块202有两个输出端口:地址输出端输出写地址信号wraddr、指针输出端输出写指针信号wrptr。写地址产生逻辑模块202产生的写地址信号wraddr输出到双端口ram存储模块201的写地址输入端口,写地址产生逻辑模块202产生的写指针信号wrptr输出到写指针同步模块207、写指针计数器模块208和写满判断模块204。
读地址产生逻辑模块203有四个输入端口:时钟端连接读时钟信号rdclk、复位端连接读复位信号rdrst、使能端连接读使能信号rden、控制端连接读控制信号rdstop;读地址产生逻辑模块203有两个输出端口:地址输出端输出读地址信号rdaddr、指针输出端输出读指针信号rdptr。读地址产生逻辑模块203产生的读地址信号rdaddr输出到双端口ram存储模块201的读地址输入端口,读地址产生逻辑模块203产生的读指针信号rdptr输出到读指针同步模块206、读指针计数器模块209和读空判断模块205。
写指针计数模块208在写时钟域下工作,有一个输入端口连接写地址产生逻辑模块202输出的写指针信号wrptr,和一个输出端口输出写指针计数控制信号wrptren。读指针计数模块209在读时钟域下工作,有一个输入端口连接读地址产生逻辑模块203输出的读指针信号rrptr,和一个输出端口输出读指针计数控制信号rdptren。
写指针计数模块208用于对写指针信号wrptr进行计数,当计数结果达到设定值时产生高电平的写指针计数控制信号wrptren,一些实施例中写指针计数模块208的判断逻辑可以为:对写指针信号wrptr计数增加到双端口ram存储模块201地址深度的前两个数时,写指针计数控制信号wrptren输出为1,其余时刻皆为0。
读指针计数模块209用于对读指针信号rrptr进行计数,当计数结果达到设定值时产生高电平的读指针计数控制信号rdptren,一些实施例中读指针计数模块209的判断逻辑可以为:对读指针信号rrptr计数增加到双端口ram存储模块201地址深度的前两个数时,读指针计数控制信号rdptren输出为1,其余时刻皆为0。
读指针同步模块206在写时钟域下工作,其输入与读地址产生逻辑模块203输出的读指针信号rdptr相连,其输出信号rdptr2与写满判断模块204相连。读指针同步模块206在一些实施例中,可以在写时钟的控制下通过两级d触发器进行打两拍操作将读指针信号rdptr同步到写时钟域下的信号rdptr2,以达到降低跨时钟域传输下出现亚稳态的概率。
写指针同步模块207在读时钟域下工作,其输入与写地址产生逻辑模块202输出的写指针端口wrptr相连,其输出信号wrptr2与读空判断模块205相连。写指针同步模块207在一些实施例中,可以在读时钟的控制下通过两级d触发器进行打两拍操作将写指针信号wrptr同步到读时钟域下的信号wrptr2,以达到降低跨时钟域传输下出现亚稳态的概率。
写满判断模块204有四个输入端口:时钟端连接写时钟信号wrclk、复位端连接写复位信号wrrst、一个比较输入端连接写指针信号wrptr、另一个比较输入端连接经过读指针同步模块206同步后的信号rdptr2;写满判断模块204有一个输出端口输出写满判断信号wrfull,标志写满。
读空判断模块205有四个输入端口:时钟端连接读时钟信号rdclk、复位端连接读复位信号rdrst、一个比较输入端连接读指针信号rdptr、另一个比较输入端连接经过写指针同步模块207同步之后的信号wrptr2;读空判断模块205有一个输出端口输出读空判断信号rdempty,标志读空。
写满判断模块204用于根据写地址产生逻辑模块202输出的写指针信号wrptr和经过读指针同步模块206同步后的信号rdptr2判断是否写满,其判断逻辑可以为:写指针信号wrptr和同步过来的信号rdptr2的最高位msb不相等,写指针信号wrptr和同步过来的信号rdptr2的次高位也不相等,剩下的位数全部相等则说明写满,写满判断信号wrfull输出为1。
读空判断模块205用于根据读地址产生逻辑模块203输出的读指针信号rdptr和经过写指针同步模块207同步后的信号wrptr2判断是否读空,其判断逻辑可以为:读指针信号rdptr和同步过来的信号wptr2完全相等则说明读空,读空判断信号rdempty输出为1。
写满判断信号wrfull和写指针计数控制信号wrptren经过一个或门后产生写地址产生逻辑模块202的写控制信号wrstop。读空判断信号rdempty和读指针计数控制信号rdptren经过一个或门后产生读地址产生逻辑模块203的读控制信号rdstop。
写地址产生逻辑模块202在写控制信号wrstop为1的时候写地址信号wraddr和写指针信号wrptr的编码不进行自加1的操作,只有当写控制信号wrstop为0的时才自加1;其中一些实施例中写地址信号wraddr采用二进制编码方式输出,写指针信号wrptr通过二进制转格雷码的方式以格雷码形式输出。同样的,读地址产生逻辑模块203在读控制信号rdstop为1的时候读地址信号rdaddr和读指针信号rdptr不进行自加1的操作,只有当读控制信号rdstop为0的时才自加1,一些实施例中读地址信号rdaddr采用二进制编码方式输出,读指针信号rdptr通过二进制转格雷码的方式以格雷码形式输出。
本发明提出的异步先入先出的数据缓存控制器,利用写地址产生逻辑模块202在写时钟域每个周期对写地址信号、写指针信号自加1,利用读地址产生逻辑模块203在读时钟域每个周期对读地址信号、读指针信号自加1,另外设置了计数模块208和209对写指针信号和读指针信号进行计数,设置写指针同步模块207将写指针信号同步到读时钟域与读指针信号进行比较判断读空,设置读指针同步模块206将读指针信号同步到写时钟域与写指针信号进行比较判断写满,根据计数结果和判断结果控制读、写地址产生逻辑模块202和203,双端口ram存储模块201在写时钟域下将写入数据信号写入ram,在读时钟域下将读出数据信号从ram中读出。
下面详细描述本实施例的具体工作过程。
步骤1、首先确定双端口ram存储模块201数据的位宽以及ram的深度,其中ram的深度能够限定确定读地址信号rdaddr和写地址信号wraddr的最大值,数据的位宽即写入数据信号wrdata和读出数据信号rddata的位宽。
步骤2、确定写时钟信号wrclk的频率和读时钟信号rdclk的频率。
步骤3、确定写复位信号wrrst的状态是否为0,若为0,则系统处于复位状态,对写地址产生逻辑模块202、写满判断模块204和双端口ram存储模块202的写控制单元复位,写地址信号wraddr、写满判断信号wrfull、写指针信号wrptr处于初始0状态,此时不能进行写数据的操作。
步骤4、确定读复位信号rdrst的状态是否为0,若为0,则系统处于复位状态,对读地址产生逻辑模块203、读空判断模块205和双端口ram存储模块202的读控制单元复位,读地址信号rdaddr、读空判断信号rdempty、读指针信号rdptr处于初始0状态,此时不能进行读数据的操作。
步骤5、当写复位信号wrrst的状态为1时,同时若写使能信号wren有效且写控制信号wrstop为0时,写地址信号wraddr在写时钟信号wrclk每个周期进行自加1的操作,同时外部输入的写入数据信号wrdata就会通过双端口ram存储模块201的数据输入端口存入到存储单元ram的第0位地址中。若写使能信号wren无效或者写控制信号wrstop为1时,则外部数据无法输入,写地址不会自加1。
步骤6、当读复位信号rdrst的状态为1时,同时若读使能信号rden有效且读控制信号rdstop为0时,读地址信号rdaddr在读时钟信号rdclk每个周期行自加1的操作,同时双端口ram存储模块201中第0位地址中存储的数据就会从数据输出端口读出rddata。若读使能信号rden无效或者读控制信号rdstop为1时,则无法读出数据,读地址不会自加1。步骤5和6可同时进行或分开进行。
步骤7、当写地址信号每次进行自加1操作时,都会在写地址产生逻辑模块202中进行二进制转格雷码的操作,转换完的格雷码会通过写指针信号wrptr的方式在写指针同步模块207内进行同步以及在写指针计数模块208内进行计数。
步骤8、当读地址信号每次进行自加1操作时,都会在读地址产生逻辑模块203中进行二进制转格雷码的操作,转换完的格雷码会通过读指针信号rdptr的方式在读指针同步模块206内进行同步以及在读指针计数模块209内进行计数。
步骤9、当写时钟信号wrclk的频率大于读时钟信号rdclk的频率时,步骤7中的写指针信号wrptr输入到写指针计数器模块208中,当写指针信号wrptr每次加1时,写指针计数器模块208会进行计数,当写指针计数器模块208计数到双端口ram存储模块的ram深度大小前两个数时,输出的写指针计数控制信号wrptren为1,随后写指针计数器模块208自加五个周期后复位重新对写指针信号wrptr计数,且写指针计数控制信号wrptren变为0。当然也可以设置其他复位时间。
步骤10、当读时钟信号rdclk的频率大于写时钟信号wrclk的频率时,步骤8中的读指针信号rdptr输入到读指针计数器模块209中,当读指针信号rdptr每次加1时,读指针计数器模块209会进行计数,当读指针计数器模块209计数到双端口ram存储模块的ram深度大小前两个数时,输出的读指针计数控制信号rdptren为1,随后读指针计数器模块209自加如五个周期后复位重新对读指针信号rdptr计数,且读指针计数控制信号rdptren变为0。
步骤11、从写地址产生逻辑模块202输出的写指针信号wrptr会经过写指针同步模块207的两个d触发器,时序上延时两拍得到同步到读时钟域的信号wrptr2送入读空判断模块205。
步骤12、从读地址产生逻辑模块203输出的读指针信号rdptr会经过读指针同步模块206的两个d触发器,时序上延时两拍得到同步到写时钟域的信号rdptr2送入写满判断模块204。
步骤13、步骤12中的信号rdptr2与输入到写满判断模块204的写指针信号wrptr在写时钟域进行比较,判断逻辑为:写指针信号wrptr和同步过来的信号rdptr2的最高位msb不相等、次高位也不相等,剩下的位数全部相等则说明写满,写满判断信号wrfull输出为1。
步骤14、步骤11中的信号wrptr2与输入到读空判断模块205的读指针信号rdptr在读时钟域进行比较,判断逻辑为:读指针信号rdptr和同步过来的信号wptr2完全相等则说明读空,读空判断信号rdempty输出为1。
步骤15、如此循环上述过程。
综上,本发明结合异步先入先出fifo的正常工作原理,通过读写指针在各自时钟域中每一个数据自加1的特点,设计了用于计数和控制的模块,通过与读空和写满的逻辑判断对读写地址进行控制,能够在不增加ram深度且不影响系统整体运行速度的情况下,使数据正常的写入和读出。
本领域的普通技术人员可以根据本发明公开的这些技术启示做出各种不脱离本发明实质的其它各种具体变形和组合,这些变形和组合仍然在本发明的保护范围内。