一、概述
在大规模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、二进制到格雷码:
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写满标志位发生逻辑
三、总结
前文叙述了异步FIFO的使用需求、完结原理,并要点论述了空满标志信号的发生办法以及或许会发生的“虚空”和“虚满”现象。理解了这些要害信号的发生原理,规划一个异步FIFO也就不难了。
责任编辑:gt