本申请涉及存储电路,具体地,涉及任意深度的异步fifo(firstinfirstout,先进先出)存储器。
背景技术:
在多时钟域系统的soc(systemonchip,片上系统)设计中,常常用异步fifo来解决不同时钟域之间的数据传输问题。经过多年的发展,异步fifo的设计也已经比较成熟,既可以使相异时钟域数据传输的时序要求变得宽松,也提高了它们之间的传输效率。
图1展示了现有技术的异步fifo的框图。
参看图1,异步fifo包括3个主要部件,fifo存储器(双端口存储器(图1的dualportram))、写入单元与读出单元。图1中左侧部分是向fifo存储器写入数据的写入单元,右侧部分是从fifo存储器读出数据的读出单元。写入单元与读出单元位于不同的时钟域,分别称为写时钟域与读时钟域。
写入单元向fifo存储器写入数据,读出单元从fifo存储器读出数据。fifo存储器被视作例如环形队列,向其的写入操作发生在队列的队尾,而读出操作发生在队头。从而写入单元维护fifo存储器的写指针(wptr),每次写入fifo存储器的操作,将数据写入写指针(wptr)所指示的fifo存储器的位置。每次写入fifo存储器完成后,wptr递增。当wptr达到最大值发生回绕。读出单元维护fifo存储器的读指针(rptr),每次读取fifo存储器的操作,根据读指针(rptr)访问fifo存储器,并获取读出数据。每次读取fifo存储器完成后,rptr递增。当rptr达到最大值发生回绕。
fifo存储器可能为空或满的状态。fifo为空状态时,禁止从其中读取数据;fifo为满状态时,禁止向其中写入数据。通过比较读指针rptr与写指针wptr的值来识别fifo存储器是否为空状态或满状态。
由于读出单元与写入单元分别位于两个时钟域,异步fifo存储还包括两个的同步模块:“向写入单元的同步模块(synchronizetowriteclk)”与“向读出单元的同步模块(synchronizetoreadclk)”。“向写入单元的同步模块”的作用是把读出单元所产生的用于从fifo存储器读数据的读指针rptr传输到写时钟域,“向读出单元的同步模块”的作用是把写入单元所使用的用于向fifo存储器写数据的写指针wptr传输到读时钟域。
从而写入单元得以将自身维护的写指针wptr与“向写入单元的同步模块”提供的读指针rptr进行比较,从而产生写满标志位。类似地,读出单元将自身维护的读指针rptr与“向读出单元的同步模块”提供的写指针进行比较产生读空标志位。
在指针同步过程中,如果直接用二进制计数器的,会因为多位数据在数值跳变过程中同时发生翻转,而造成指针同步错误。例如,当指针从0b0111变成0b1000的时候,数据位的每一个比特都发生翻转,如果此时直接用接收方的异步时钟对其进行采样,可能出现任意的中间值(有可能接收方会看到0b0111→0b0101→0b1000的变化),这样就可能造成“满”/“空”判断错误而引起对fifo存储器的误读或误写。
所以,在异步fifo存储器设计中,通常选用相邻数据只有1位发生变化的格雷码来传递读/写指针。以上例中的0b0111→0b1000的变化来看,对应的格雷码为0b0100→0b1100。这样即便接收方采样到亚稳态的指针值,采样到的值要么是0b0100,要么是0b1100,不会出现其他不可预期的值。
以一个深度为8的异步fifo为例,其需要4位格雷码作为读/写指针的值。表1展示了其读/写指针与格雷码的关系。
表1的最右列“指针”代表了访问fifo存储器的读/写指针值。作为举例,fifo存储器共有8个存储单元。“指针”的取值从0顺序变化到7,每个值代表了fifo存储器的一个存储单元。在一个完整的循环中,“指针”值经历两轮从0到7的变化过程。“指针”值为7时,下次访问fifo存储器的“指针”值回绕到0。
表1的最左列“十进制”代表了指针的状态。对于深度为8的fifo存储器,指针有16种状态(0~15),分别对应一个完整的循环中,“指针”值经历两轮从0到7的变化过程中,指针的每个取值。
表1的“二进制计数”列,其每个值同“十进制”列的每个取值对应,为“十进制”列的取值的二进制表达。表1的“格雷码”列的每个值同“二进制计数”列的每个值对应,为“二进制计数”列的取值的对应格雷码。
表1
异步fifo存储器还维护空和满标志。写入单元的满检测单元(fullflaglogic)生成满状态标记(记为full)。读出单元的空检测单元(emptyflaglogic)生成空状态标记(记为empty)。
空检测单元比较读出单元维护的读指针rptr与“向读出单元的同步模块”提供的写指针(记为(wptr_sync),其中空状态标记empty=(wptr_sync==rptr)?1’b1:1’b0。满检测单元比较写入单元维护的写指针wptr与“向写入单元的同步模块”提供的读指针(记为rptr_sync),其中满状态标记full=(wptr_bin[n]!=rptr_sync_bin[n])?(wptr_bin[n-1:0]==rptr_sync_bin[n-1:0]):1’b0。
当读写指针相等的时候,fifo就是空的;当读写指针相差为fifo深度的时候,fifo就是满的。因为异步fifo存储器的深度是2的幂次方(例如,8=2^3),满的判读也非常简单:将两个指针都转成二进制编码,当最高位不相等,但是次高位以下全部相等的时候,fifo就是满状态。
技术实现要素:
图1的fifo设计简单,但缺点是深度只能是2的幂次方,使用受到很大的局限。如果要设计一个11个深度的异步fifo,采用当前的设计方案,实际需要深度为16的存储器(同11最接近的2的幂次方),多余的5个深度只是为了适应编码,并不会对传输效率与存储容量有实质性的提升。简言之,多余的5个深度浪费了芯片面积,没有必要。
根据本申请的第一方面,提供了根据本申请第一方面的第一异步fifo存储器,包括双端口存储器、写地址译码器、读地址译码器、满检测单元、读指针同步单元、空检测单元与写指针同步单元;所述写指针译码器、满检测单元与读指针同步单元位于第一时钟域;所述读指针译码器、空检查单元与写指针同步单元位于第二时钟域;所述写指针译码器耦合到所述双端口存储器的写端口,并向所述双端口存储器的写端口提供写指针;所述读指针译码器耦合到所述双端口存储器的读端口,并向所述双端口存储器的写端口提供读指针;其特征在于,所述写指针译码器包括第一状态计数器、写指针计数器、第一格雷码译码器与反向格雷码译码器;所述读指针译码器包括第二状态计数器、读指针计数器与格雷码译码器;所述第一状态计数器与第二状态计数器各自均按二进制从0到m-1再从2^(n 1)-m到2^(n 1)-1的范围以步长为1连续循环计数,其中m是所述异步fifo存储器的深度;所述第一状态计数器耦合到所述写指针计数器、所述第一格雷码译码器与所述反向格雷码译码器;所述写指针计数器按二进制从0到m-1以步长为1连续循环计数,所述写指针计数器的计数值作为所述写指针译码器提供给所述双端口存储器的写端口的写指针;所述第一格雷码译码器将所述第一状态计数器提供的二进制计数值转换为格雷码;所述反向格雷码译码器将所述第一状态计数器提供的二进制计数值转换为反向格雷码;所述第一格雷码译码器的输出耦合到所述写指针同步单元;所述反向格雷码译码器的输出耦合到所述满检测单元。
根据本申请第一方面的第一异步fifo存储器,提供了根据本申请第一方面的第二异步fifo存储器,其中所述第二状态计数器耦合到所述读指针计数器与所述第二格雷码译码器;所述读指针计数器按二进制从0到m-1以步长为1连续循环计数,所述读指针计数器的计数值作为所述读指针译码器提供给所述双端口存储器的读端口的读指针;所述第二格雷码译码器将所述第二状态计数器提供的二进制计数值转换为格雷码;所述第二格雷码译码器的输出耦合到所述读指针同步单元;所述第二格雷码译码器的输出也耦合到所述空检测单元。
根据本申请第一方面的第一或第二异步fifo存储器,提供了根据本申请第一方面的第三异步fifo存储器,其中若所述第一状态计数器输出的计数值i在0~(m-1)范围,所述反向格雷码译码器将所述第一状态计数器输出的计数值i转换为g(m-1-i),其中g(i)代表二进制值i的格雷码;若所述第一状态计数器输出的计数值2^(n 1)-m i在2^(n 1)-m到2^(n 1)-1范围,所述反向格雷码译码器将所述第一状态计数器输出的计数值2^(n 1)-m i转换为g(2^(n 1)-1-i),其中n为log2(m)向上取整的结果。
根据本申请第一方面的第二或第三异步fifo存储器,提供了根据本申请第一方面的第四异步fifo存储器,其中所述读指针同步单元的输出与所述反向格雷码译码器的输出耦合到所述满检测单元;所述写指针同步单元的输出与所述第二格雷码译码器的输出耦合到所述空检测单元。
根据本申请第一方面的第四异步fifo存储器,提供了根据本申请第一方面的第五异步fifo存储器,其中所述满检测单元依据所述读指针同步单元的输出与所述反向格雷码译码器的输出的最高位相反而其他位相同而输出满状态标记,否则输出非满状态标记。
根据本申请第一方面的第四或第五异步fifo存储器,提供了根据本申请第一方面的第六异步fifo存储器,其中所述空检测单元依据所述写指针同步单元的输出与所述第二向格雷码译码器的输出相同而输出空状态标记,否则输出非空状态标记。
第一时钟域与第二时钟域是不同的时钟域。
根据本申请的第二方面,提供了根据本申请第二方面的第一异步fifo存储器,包括双端口存储器、写地址译码器、读地址译码器、满检测单元、读指针同步单元、空检测单元与写指针同步单元;所述写指针译码器、满检测单元与读指针同步单元位于第一时钟域;所述读指针译码器、空检查单元与写指针同步单元位于第二时钟域;所述写指针译码器耦合到所述双端口存储器的写端口,并向所述双端口存储器的写端口提供写指针;所述读指针译码器耦合到所述双端口存储器的读端口,并向所述双端口存储器的写端口提供读指针;其特征在于,所述写指针译码器包括第一状态计数器、写指针计数器与第一格雷码译码器;所述读指针译码器包括第二状态计数器、读指针计数器、第二格雷码译码器与反向格雷码转换单元;所述第一状态计数器与第二状态计数器各自均按二进制从0到m-1再从2^(n 1)-m到2^(n 1)-1的范围以步长为1连续循环计数,其中m是所述异步fifo存储器的深度;所述第一状态计数器耦合到所述写指针计数器与所述第一格雷码译码器;所述第二状态计数器耦合到所述读指针计数器与所述第二格雷码译码器;所述读指针计数器按二进制从0到m-1以步长为1连续循环计数,所述读指针计数器的计数值作为所述读指针译码器提供给所述双端口存储器的读端口的读指针;所述第二格雷码译码器将所述第二状态计数器提供的二进制计数值转换为格雷码;所述反向格雷码转换单元的输出耦合到所述读指针同步单元;所述第二格雷码译码器的输出耦合到所述空检测单元;所述反向格雷码转换单元将所述第二格雷码译码器的输出转换为反向格雷码。
根据本申请第二方面的第一异步fifo存储器,提供了根据本申请第二方面的第二异步fifo存储器,其中所述第一状态计数器耦合到所述写指针计数器与所述第一格雷码译码器;所述写指针计数器按二进制从0到m-1以步长为1连续循环计数,所述写指针计数器的计数值作为所述写指针译码器提供给所述双端口存储器的写端口的写指针;所述第一格雷码译码器将所述第一状态计数器提供的二进制计数值转换为格雷码;所述第一格雷码译码器的输出耦合到所述写指针同步单元;所述第一格雷码译码器的输出也耦合到所述满检测单元。
根据本申请第二方面的第一或第二异步fifo存储器,提供了根据本申请第二方面的第三异步fifo存储器,其中若所述第二格雷码译码器输出的格雷码为g(i),其中i为在0~(m-1)范围的所述第二状态计数器的值,所述反向格雷码转换单元将所述第二格雷码译码器的输出转换为g(m-1-i);若所述第二状态计数器输出的计数值2^(n 1)-m i在2^(n 1)-m到2^(n 1)-1范围,所述反向格雷码转换单元将所述第二格雷码译码器的输出转换为g(2^(n 1)-1-i),其中n为log2(m)向上取整的结果。
根据本申请第二方面的第二或第三异步fifo存储器,提供了根据本申请第二方面的第四异步fifo存储器,其中所述读指针同步单元的输出与所述第一格雷码译码器的输出耦合到所述满检测单元;所述写指针同步单元的输出与所述第二格雷码译码器的输出耦合到所述空检测单元。
根据本申请第二方面的第四异步fifo存储器,提供了根据本申请第二方面的第五异步fifo存储器,其中所述满检测单元依据所述读指针同步单元的输出与所述第一格雷码译码器的输出的最高位相反而其他位相同而输出满状态标记,否则输出非满状态标记。
根据本申请第二方面的第四或第五异步fifo存储器,提供了根据本申请第二方面的第六异步fifo存储器,其中所述空检测单元依据所述写指针同步单元的输出与所述第一向格雷码译码器的输出相同而输出空状态标记,否则输出非空状态标记。
根据本申请的第三方面,提供了根据本申请第三方面的第一异步fifo存储器,包括双端口存储器、写地址译码器、读地址译码器、满检测单元、读指针同步单元、空检测单元与写指针同步单元;所述写指针译码器、满检测单元与读指针同步单元位于第一时钟域;所述读指针译码器、空检查单元与写指针同步单元位于第二时钟域;所述写指针译码器耦合到所述双端口存储器的写端口,并向所述双端口存储器的写端口提供写指针;所述读指针译码器耦合到所述双端口存储器的读端口,并向所述双端口存储器的写端口提供读指针;其特征在于,所述写指针译码器包括第一状态计数器、写指针计数器与第一格雷码译码器;所述读指针译码器包括第二状态计数器、读指针计数器与第二格雷码译码器;所述第一状态计数器与第二状态计数器各自均按二进制从0到m-1再从2^(n 1)-m到2^(n 1)-1的范围以步长为1连续循环计数,其中m是所述异步fifo存储器的深度;所述第一状态计数器耦合到所述写指针计数器与所述第一格雷码译码器;所述写指针计数器按二进制从0到m-1以步长为1连续循环计数,所述写指针计数器的计数值作为所述写指针译码器提供给所述双端口存储器的写端口的写指针;所述第一格雷码译码器将所述第一状态计数器提供的二进制计数值转换为格雷码;所述第一格雷码译码器的输出耦合到所述写指针同步单元;所述第一格雷码译码器的输出耦合到所述满检测单元;所述异步fifo存储器还包括位于第一时钟域的反向格雷码转换单元,所述反向格雷码转换单元的输入耦合到所述读指针同步单元的输出,所述反向格雷码转换单元的输出耦合到所述满检测单元的输入,所述反向格雷码译码器将所述读指针同步单元输出的读指针的格雷码转换为反向格雷码。
根据本申请第三方面的第一异步fifo存储器,提供了根据本申请第三方面的第二异步fifo存储器,其中所述第二状态计数器耦合到所述读指针计数器与所述第二格雷码译码器;所述读指针计数器按二进制从0到m-1以步长为1连续循环计数,所述读指针计数器的计数值作为所述读指针译码器提供给所述双端口存储器的读端口的读指针;所述第二格雷码译码器将所述第二状态计数器提供的二进制计数值转换为格雷码;所述第二格雷码译码器的输出耦合到所述读指针同步单元;所述第二格雷码译码器的输出也耦合到所述空检测单元。
根据本申请第三方面的第一或第二异步fifo存储器,提供了根据本申请第三方面的第三异步fifo存储器,其中若所述第二格雷码译码器输出的格雷码为g(i),其中i为在0~(m-1)范围的所述第二状态计数器的值,所述反向格雷码转换单元将所述读指针同步单元输出的格雷码转换为g(m-1-i);若所述第二状态计数器输出的计数值2^(n 1)-m i在2^(n 1)-m到2^(n 1)-1范围,所述反向格雷码转换单元将所述读指针同步单元输出的格雷码转换为g(2^(n 1)-1-i),其中n为log2(m)向上取整的结果。
根据本申请第三方面的第三或第四异步fifo存储器,提供了根据本申请第三方面的第五异步fifo存储器,其中所述第一格雷码译码器的输出与所述反向格雷码转换单元的输出耦合到所述满检测单元;所述写指针同步单元的输出与所述第二格雷码译码器的输出耦合到所述空检测单元。
根据本申请第三方面的第五异步fifo存储器,提供了根据本申请第三方面的第六异步fifo存储器,其中所述满检测单元依据所述读指针同步单元的输出与所述反向格雷码转换单元的输出的最高位相反而其他位相同而输出满状态标记,否则输出非满状态标记。
根据本申请第三方面的第五或第六异步fifo存储器,提供了根据本申请第三方面的第七异步fifo存储器,其中所述空检测单元依据所述写指针同步单元的输出与所述第二向格雷码译码器的输出相同而输出空状态标记,否则输出非空状态标记。
根据本申请的第四方面,提供了根据本申请第四方面的第一异步fifo存储器,包括双端口存储器、写地址译码器、读地址译码器、满检测单元、读指针同步单元、空检测单元与写指针同步单元;所述写指针译码器、满检测单元与读指针同步单元位于第一时钟域;所述读指针译码器、空检查单元与写指针同步单元位于第二时钟域;所述写指针译码器耦合到所述双端口存储器的写端口,并向所述双端口存储器的写端口提供写指针;所述读指针译码器耦合到所述双端口存储器的读端口,并向所述双端口存储器的写端口提供读指针;其特征在于,所述写指针译码器包括写指针计数器、第一格雷码生成单元与反向格雷码生成单元;所述读指针译码器包括读指针计数器与第二格雷码生成单元;所述读指针计数器与所述写指针计数器各自均按二进制从0到m-1的范围以步长为1连续循环计数,其中m是所述异步fifo存储器的深度;所述读指针计数器与所述写指针计数器各自还包括作为循环标记的寄存器,每当计数器的计数值从m-1环绕到0时作为循环标记的寄存器翻转;所述写指针计数器耦合到所述第一格雷码生成单元与所述反向格雷码生成单元;所述写指针计数器的计数值作为所述写指针译码器提供给所述双端口存储器的写端口的写指针;所述第一格雷码生成单元将所述写指针计数器的值与循环标记转换为格雷码;所述反向格雷码生成单元将所述写指针计数器的值与循环标记转换为反向格雷码;所述第一格雷码生成单元的输出耦合到所述写指针同步单元;所述反向格雷码译码器的输出耦合到所述满检测单元。
根据本申请第四方面的第一异步fifo存储器,提供了根据本申请第四方面的第二异步fifo存储器,其中所述读指针计数器耦合到所述第二格雷码生成单元;所述读指针计数器的计数值作为所述读指针译码器提供给所述双端口存储器的读端口的读指针;所述第二格雷码生成单元将所述写指针计数器的值与循环标记转换为格雷码;所述第二格雷码生成单元的输出耦合到所述读指针同步单元;所述第二格雷码生成单元的输出也耦合到所述空检测单元。
根据本申请第四方面的第一或第二异步fifo存储器,提供了根据本申请第四方面的第三异步fifo存储器,其中若所述写指针计数器的循环标记为第一值,所述第一格雷码生成单元将所述写指针计数器的输出换为格雷码g(i),其中i为所述写指针计数器的值,所述反向格雷码生成单元将所述写指针计数器的输出换为格雷码g(m-1-i);若所述写指针计数器的循环标记为第二值,所述第一格雷码生成单元元将所述写指针计数器的输出换为格雷码g(2^(n 1)-m i),所述反向格雷码生成单元将所述写指针计数器的输出转换为格雷码g(2^(n 1)-1-i),其中n为log2(m)向上取整的结果。
根据本申请第四方面的第二或第三异步fifo存储器,提供了根据本申请第四方面的第四异步fifo存储器,其中所述反向格雷码生成单元的输出与所述读指针同步单元的输出耦合到所述满检测单元;所述写指针同步单元的输出与所述第二格雷码生成单元的输出耦合到所述空检测单元。
根据本申请第四方面的第四异步fifo存储器,提供了根据本申请第四方面的第五异步fifo存储器,其中所述满检测单元依据所述读指针同步单元的输出与所述反向格雷码生成单元的输出的最高位相反而其他位相同而输出满状态标记,否则输出非满状态标记。
根据本申请第四方面的第四或第五异步fifo存储器,提供了根据本申请第四方面的第六异步fifo存储器,其中所述空检测单元依据所述写指针同步单元的输出与所述第二格雷码生成单元的输出相同而输出空状态标记,否则输出非空状态标记。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明中记载的一些实施例,对于本领域技术人员来讲,还可以根据这些附图获得其他的附图。
图1展示了现有技术的异步fifo的框图;
图2a展示了根据本申请实施例的异步fifo存储器的框图;
图2b展示了根据本申请实施例的多种编码的映射表;
图3a、3b与3c展示了十进制数、二进制数及其格雷码的映射表的示意图;
图4展示了根据本申请又一实施例的异步fifo存储器的框图;
图5展示了根据本申请再一实施例的异步fifo存储器的框图;以及
图6展示了根据本申请依然再一实施例的异步fifo存储器的框图。
具体实施方式
下面结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
图2a展示了根据本申请实施例的异步fifo存储器的框图。
参看图2a,根据本申请实施例的异步fifo存储器的深度为m(m为正整数)。例如,m可以是非2的整数次方。异步fifo存储器包括双端口存储器210、写地址译码单元240与读地址译码单元270。写地址译码单元240耦合到双端口存储器210的写端口,向其提供用于写入数据的写指针,写指针的取值范围是0~(m-1)。读地址译码单元270耦合到双端口存储器210的读端口,向其提供用于读出数据的读指针,读指针的取值范围是0~(m-1)。写地址译码单元240与读地址译码单元270各自位于不同的时钟域。
可以理解地,为操作双端口存储器210,还向其提供控制信号以实施读/写操作,并向其提供写入数据或接收其输出的数据。这些在图2a中未示出。
图2a展示的异步fifo存储器还包括读指针同步单元252、写指针同步单元282、满检测单元254与空检测单元284。
读指针同步单元252将从读地址译码单元270获取的读指针提供给满检测单元254。满检测单元比较同步单元252提供的读指针与从写地址译码单元240获取的写指针,并生成指示fifo存储器是否“满”的满状态标志。在fifo存储器未满时,才能向其写入数据。
写指针同步单元282将从写地址译码单元240获取的写指针提供给空检测单元284。空检测单元284比较同步单元282提供的写指针与从读地址译码单元270获取的读指针,并生成指示fifo存储器是否“空”的空状态标志。在fifo存储器非空时,才能从其读出数据。
写地址译码单元240包括状态计数器242、写指针计数器244、格雷码译码器246与反向格雷码译码器248。
根据本申请实施例的异步fifo的深度为m,用n比特数表达整数m,从而n为log2(m)向上取整的结果。例如,m=15,则n为4。
响应于每次向双端口存储器210写入数据,状态计数器242递增。状态计数器242是二进制码计数器,其位宽为n 1。状态计数器242的计数值的范围包括连续的两部分,从二进制0到m-1,再从二进制2^(n 1)-m到2^(n 1)-1,每个范围部分内部,状态计数器242以1为步长按二进制码连续计数。当状态计数器242计数到第一范围部分的结尾m-1时,下次计数的值为2^(n 1)-m;当状态计数器242计数到第二范围部分的结尾2^(n 1)-1时,下次计数的值为0。
写地址译码单元240的状态计数器242还分别耦合到写指针计数器244、格雷码译码器246与反向格雷码译码器248。状态计数器242的二进制计数值被同时提供给格雷码译码器246与反向格雷码译码器248,以根据二进制计数值分别生成对应的格雷码与反向格雷码。响应于每次计数,状态计数器242向写指针计数器244提供信号,以使写指针计数器244相应计数。写指针计数器244是二进制码计数器,其位宽为n,并且计数范围是从二进制0到m-1。当写指针计数器244计数到计数范围部分的结尾m-1时,下次计数的值为0。可选地,响应于每次向双端口存储器210写入数据,写地址译码单元240向写指针计数器244提供计数信号。
写指针计数器244的计数值被提供给双端口存储器210,作为写地址译码器240向双端口存储器210提供的写指针,用于指示向双端口存储器210写入数据的地址。
格雷码译码器246与反向格雷码译码器248各自的位宽是n 1。现有技术中有多种从二进制码到格雷码的转换方案,都可以用于根据本申请实施例的格雷码译码器246。
状态计数器242的计数值的范围包括连续的两部分,第一范围从二进制0到m-1,第二范围从二进制2^(n 1)-m到2^(n 1)-1。状态计数器242的计数值被提供给格雷码译码器246,从而格雷码译码器246也相应地输出该两个范围内的二进制数对应的格雷码。并且,在每个范围内,状态计数器242输出的二进制数是按顺序递增的,从而格雷码计数器246输出的格雷码也是有序的。将第一范围内,格雷码计数器246输出的格雷码依顺序记为p(0)、p(1)、……p(m-1)。相应地,根据本申请的实施例,反向格雷码计数器248在第一范围内对应的输出依此为p(m-1)、p(m-2)、……p(0)。即,反向格雷码计数器248输出的结果,同格雷码计数器246输出的结果,在状态计数器242的计数值的连续的范围内,关于该连续范围的中点对称。从而对于状态计数器242输出的计数值i(在0~m-1范围内),格雷码译码器246将该计数值转换为对应的格雷码(记为g(i),代表i的格雷码),而反向格雷码计数器248将该计数值转换为(g(m-1-i))。类似地,从而对于状态计数器242输出的计数值为2^(n 1)-m i(i在0~m-1范围内),格雷码译码器246将该计数值转换为对应的格雷码(记为g(2^(n 1)-m i)),而反向格雷码计数器248将该计数值转换为(g(2^(n 1)-1-i))。
格雷码译码器246输出的格雷码被提供写指针同步单元282。反向格雷码译码器248输出的反向格雷码被提供满检测单元254。
满检测单元254接收反向格雷码译码器248的输出(记为wptr_rev,位宽为n 1),还接收同步单元252的输出(记为rptr_sync,位宽为n 1)。满检测单元254生成满状态标记full=(wptr_rev[n]!=rptr_sync[n])?(wptr_rev[n-1:0]==rptr_sync[n-1:0]):1’b0。在满状态标记full指示fifo存储器非满时,才向双端口存储器210写入数据。
读地址译码单元270包括状态计数器272、读指针计数器274与格雷码译码器276。
响应于每次从双端口存储器210读出数据,状态计数器272递增。状态计数器272是二进制码计数器,其位宽为n 1。状态计数器272的计数值的范围包括连续的两部分,从二进制0到m-1,再从二进制2^(n 1)-m到2^(n 1)-1,每个范围部分内部,状态计数器272以1为步长按二进制码连续计数。当状态计数器272计数到第一范围部分的结尾m-1时,下次计数的值为2^(n 1)-m;当状态计数器272计数到第二范围部分的结尾2^(n 1)-1时,下次计数的值为0。可选地,状态计数器272同状态计数器242相同。
读地址译码单元270的状态计数器272还分别耦合到读指针计数器274与格雷码译码器276。状态计数器272的二进制计数值被提供给格雷码译码器276,以根据二进制计数值生成对应的格雷码。格雷码译码器276的位宽是n 1。响应于每次计数,状态计数器272向读指针计数器274提供信号,以使读指针计数器274相应计数。读指针计数器274是二进制码计数器,其位宽为n,并且计数范围是从二进制0到m-1。当读指针计数器274计数到计数范围部分的结尾m-1时,下次计数的值为0。可选地,响应于每次从双端口存储器210读出数据,读地址译码单元270向读指针计数器274提供计数信号。
读指针计数器274的计数值被提供给双端口存储器210,作为读地址译码单元270向双端口存储器210提供的读指针,用于指示从双端口存储器210读出数据的地址。
格雷码译码器276的输出被提供给读指针同步单元252与空检测单元284。
空检测单元284接收格雷码译码器276的输出(记为rptr,位宽为n 1),还接收同步单元282的输出(记为wptr_sync,位宽为n 1)。空检测单元284生成空状态标记empty=(wptr_sync==rptr)?1’b1:1’b0;。在空状态标记empty指示fifo存储器非空时,才从双端口存储器210读出数据。
图2b展示了根据本申请实施例的多种编码的映射表。
映射表的“状态计数器”列,指示状态计数器(242、272,也参看图2a)所代表的状态(但其并非状态计数器的计数值)。以异步fifo存储器的深度为m为例,相应地状态计数器有2m种状态,从而映射表包括2m行,每行对应状态计数器的一种状态。状态计数器的状态分为2组,第一组为状态s_0~s_(m-1),第二组为状态s_m到s_(2m-1)。
映射表的“二进制码”列指示了状态计数器(242、272)同“状态计数器”列的状态所对应的二进制计数值。对应于第一组状态s_0~s_(m-1),状态计数器(242、272)的计数值分别为bin(0)~bin(m-1),对应于第二组状态s_m到s_(2m-1),状态计数器(242、272)的计数值分别为bin(2^(n 1)-m)到~bin(2^(n 1)-1)。对应于状态的每一组,状态计数器(242、272)的计数值连续递增。但当从状态一组进入另一组时,状态计数器(242、272)的计数值发生不连续的跳变,跳变的幅度是2^(n 1)-2m 1。即状态计数器(242、272)对第一组状态最尾状态的计数值是bin(m-1),而下次跳变后的计数值为bin(2^(n 1)-m)。
可以理解地,虽然图2b中由统一的映射表展示,图2a中的状态计数器(242、272)分别记录状态。
映射表的“地址指针”列指示了写指针计数器(244)或读地址计数器(274)提供给双端口存储器210的地址。并且映射表的行,还指示了地址指针同状态计数器输出的二进制码的关系。简单地,写指针计数器(244)与读地址计数器(274)各自按从0到m-1的过程计数。
映射表的“格雷码”列指示了同二进制码对应的格雷码。格雷码译码器246将状态计数器242输出的二进制数转换为格雷码并提供给同步单元282。格雷码译码器276将状态计数器272输出的二进制数转换为格雷码并提供给同步单元252。
映射表的“反向格雷码”列指示了同二进制码对应的反向格雷码。并且映射表还指示了反向格雷码同格雷码的的对应关系,在从格雷码g(0)到g(m-1)的范围内,同某格雷码对应的反向格雷码是该格雷码在该范围内关于该范围的中间值对称的格雷码。在从格雷码g(2^(n 1)-m)到g(2^(n 1)-1)的范围内,同某格雷码对应的反向格雷码是该格雷码在该范围内关于该范围的中间值对称的格雷码。该范围的大小同fifo存储器的深度m相同。反向格雷码译码器248将状态计数器242输出的二进制数转换为反向格雷码并提供给满检测单元254。
返回参看图2a,响应于要向根据本申请实施例的异步fifo存储器写入数据,首先从满检测单元254获取fifo存储器是否满。若fifo未满,写指针计数器244的值被作为写地址提供给双端口存储器210,还向双端口存储器210提供写入的数据。响应于数据被写入双端口210,状态计数器242递增(按图2b指示的状态计数器计数规则递增),写指针计数器244也递增(按图2b指示的二进制码计数规则递增)。状态计数器242的计数值被提供给格雷码译码器246与反向格雷码译码器248。同步单元282将格雷码译码器246的值同步到空检测单元284。
响应于要向根据本申请实施例的异步fifo存储器写入数据,首先从空检测单元284获取fifo存储器是否空。若fifo非空,读指针计数器274的值被作为读地址提供给双端口存储器210,还从双端口存储器210接收读出的数据。响应于数据从双端口210读出,状态计数器272递增(按图2b指示的状态计数器计数规则递增),读指针计数器274也递增(按图2b指示的二进制码计数规则递增)。状态计数器272的计数值被提供给格雷码译码器276。同步单元252将格雷码译码器276的值同步到满检测单元254。
下面从数学理论上分析根据本申请实施例的深度为m的异步fifo存储器。
图3a、3b与3c展示了十进制数、二进制数及其格雷码的映射表的示意图。
图3a中,二进制数与格雷码有n 1位,n=log2(m)向上取整。图3a的第一列(列标题为“十进制”)从上到下按数值从小到大的顺序列出了由n 1位二进制数所能表达的所有十进制数。
选取其中的任意一个十进制数x,其二进制编码为anan-1an-2..a1a0。图3a的第一列的十进制数存在中间位置(2n-1与2n)。按照中间位置对折,同十进制数x对称的位置即为2^(n 1)-1-x。
从而有
2n 1-1-x=1n 10n0n-10n-2..0100b-1-x
=1n1n-11n-2..1110b-x
=1n1n-11n-2..1110b-anan-1an-2..a1a0
=~(anan-1an-2..a1a0)
根据二进制和格雷码的转换公式,对于x,假设其格雷码为gngn-1gn-2..g1g0:
gn=an
gn-1=an⊕an-1
gn-2=an-1⊕an-2
....
g0=a1⊕a0
与x关于中间位置对称位置的数:2n 1-1–x,假设其格雷码为pnpn-1pn-2…p1p0:
pn=~an=~gn
pn-1=(~an⊕~an-1)=an⊕an-1=gn-1
pn-2=(~an-1⊕~an-2)=an-1⊕an-2=gn-2
....
p0=(~a1⊕~a0)=a1⊕a0=g0
如此可见,除了最高位不一样以外,这两个数(x与2n 1-1–x)的格雷码从n-1位开始完全相等。根据这样的理论,在根据本申请的实施例中,设计任意深度的异步fifo存储器。假设fifo存储器需要的深度m(其二进制编码需要n位)的值为x,那么就选取0~(x-1)以及同图3a的“十进制”列中同范围“0~(x-1)”关于中间位置对称的范围(2n 1-1–(x-1))~(2n 1-1)来映射fifo存储器的指针,并将图3a的“十进制”列中的其他部分删除。也就是删除图3a中从x到2n 1-1–x中间的所有编码。
作为举例,当用计数器指示“十进制数”时,当计数器计到x-1后,下一次计数器递增,计数器直接跳到2n 1-1–(x-1)。以深度为7的异步fifo存储器为例,n=log2(7)向上取整为3,在图3a的表中,x=7,n=3,相应地在“十进制”列中删除7和8及其所对应的行。得到的结果如图3b所示。
对于这样的fifo存储器来说,计算空状态和2的幂次方fifo存储器是一样的,都是判断两个指针是否一样。但是要计算满状态就比较复杂了,因为fifo的深度不是2的幂次方,那么仅判断二进制编码最高位不同,余下位相同的规律就行不通的。
如果要通过指针相减,根据指针的差值等于fifo深度来判断fifo状态的话,需要特别考虑中间被删掉的指针。以上图为例,当读指针对应的十进制数为0,写指针对应的十进制数为9时,fifo为满十进制。9-0–2*(8-7)=7=fifo深度,可以判定为状态,其中2*(8-7)是中间被跳过的指针个数。这样计算出来的满十进制比较复杂,同时计算延迟也比较大,因为有减法,以及十进制数上下半区的判断等(两个十进制数在同一半区时又不需要减去跳过的指针个数)。
可以考虑再次利用格雷码呈轴对称的关系来简化满指针的判断:
如图3c所示,fifo存储器的深度为7。依据图3c的“十进制”列,将十进制数(连同其对应的行)分为两个半区。上半区的十进制数范围是0~6,下半区的十进制数的范围是9~15。对应地,图3c的“格雷码”列的数也分为了两个半区。
将“格雷码”列在每个半区内对所有编以各自半区内的排序中间位置为对称轴交换位置,在各自半区内的第一个格雷码和最后一个格雷码互换位置,第二个格雷码和倒数第二个格雷码互换位置,其他以此类推,得到的结果在图3c的“反向格雷码”列示出。
例如,参看图3c,“格雷码”列上半区的第一个格雷码是“0000”,最后一个格雷码是“0101”,对应地在“反向格雷码”列的第一个反向格雷码是“0101”而最后一个反向格雷码是“0000”。
经过这样的转换之后,上半区正向的格雷码和下半区的反向格雷码就会呈现一一对应的关系,即间隔为fifo深度的两个指针,其正向格雷码与另一个半区的反向格雷码只有最高位不同,其他位相同。例如,参看图3c,“格雷码”列下半区的第一个格雷码“1101”与“反向格雷码”列上半区的第一个格雷码“0101”,它们在图3c中的行的间隔是7(为fifo存储器的深度),并且这两个码只有最高位不同而其他位相同。
这个特性可以用来做fifo满的判断。例如,将写指针转换成反向格雷码(记为wptr_rev),读指针依然用格雷码(记为rptr_sync),以下公式可以实现fifo满状态full的判断:
full=(wptr_rev[n]!=rptr_sync[n])?(wptr_rev[n-1:0]==rptr_sync[n-1:0]):1’b0;
这样fifo满状态的判断相对于指针相减就简单许多了。以此特性可以设计参数化的异步fifo,将深度定义成参数,通过参数化的设计,实现任意深度的异步fifo存储器。在设计中仅需要考虑以下几点:
(1)指针跳转的时候,注意半区的边界位置为fifo存储器的深度m–1;
(2)提供参数化(参数为n 1,其中n为log2(m)向上取整)的反向格雷码生成单元。
图4展示了根据本申请又一实施例的异步fifo存储器的框图。
参看图4,根据本申请实施例的异步fifo存储器的深度为m(m为正整数)。异步fifo存储器包括双端口存储器410、写地址译码单元440与读地址译码单元470。写地址译码单元420耦合到双端口存储器410的写端口,向其提供用于写入数据的写指针,写指针的取值范围是0~(m-1)。读地址译码单元470耦合到双端口存储器410的读端口,向其提供用于读出数据的读指针,读指针的取值范围是0~(m-1)。写地址译码单元420与读地址译码单元470各自位于不同的时钟域。
图4展示的异步fifo存储器还包括读指针同步单元452、写指针同步单元482、满检测单元454与空检测单元484。
读指针同步单元452将从读地址译码单元470获取的读指针提供给满检测单元454。满检测单元比较读指针同步单元452提供的读指针与从写地址译码单元420获取的写指针,并生成指示fifo存储器是否“满”的满状态标志。
写指针同步单元482将从写地址译码单元420获取的写指针提供给空检测单元484。空检测单元484比较写指针同步单元482提供的写指针与从读地址译码单元470获取的读指针,并生成指示fifo存储器是否“空”的空状态标志。
写地址译码单元420包括状态计数器422、写指针计数器424与格雷码译码器426。同图2a的异步fifo存储器实施例不同的,写地址译码单元420不包括反向格雷码译码器。
响应于每次向双端口存储器410写入数据,状态计数器422递增。状态计数器422是二进制码计数器,其位宽为n 1。状态计数器242的计数值的范围包括连续的两部分,从二进制0到m-1,再从二进制2^(n 1)-m到2^(n 1)-1,每个范围部分内部,状态计数器422以1为步长按二进制码连续计数。当状态计数器422计数到第一范围部分的结尾m-1时,下次计数的值为2^(n 1)-m;当状态计数器422计数到第二范围部分的结尾2^(n 1)-1时,下次计数的值为0。
写地址译码单元420的状态计数器422还分别耦合到写指针计数器424与格雷码译码器426。格雷码译码器426的位宽是n 1。状态计数器422的二进制计数值被提供给格雷码译码器246,以根据二进制计数值生成对应的格雷码。响应于每次计数,状态计数器422向写指针计数器424提供信号,以使写指针计数器424相应计数。写指针计数器424是二进制码计数器,其位宽为n,并且计数范围是从二进制0到m-1。当写指针计数器244计数到计数范围部分的结尾m-1时,下次计数的值为0。可选地,响应于每次向双端口存储器410写入数据,写地址译码单元440向写指针计数器424提供计数信号。
写指针计数器424的计数值被提供给双端口存储器210,作为写地址译码器420向双端口存储器410提供的写指针,用于指示向双端口存储器410写入数据的地址。
格雷码译码器426输出的格雷码被提供给满检测单元454以及写指针同步单元482。
满检测单元454接收格雷码译码器426的输出(记为wptr,位宽为n 1),还接收读指针同步单元452的输出(记为rptr_rev_sync,位宽为n 1)。满检测单元454生成满状态标记full=(wptr[n]!=rptr_rev_sync[n])?(wptr[n-1:0]==rptr_rev_sync[n-1:0]):1’b0。在满状态标记full指示fifo存储器非满时,才向双端口存储器410写入数据。
读地址译码单元470包括状态计数器472、读指针计数器474、反向格雷码译码器476与格雷码译码器478。
响应于每次从双端口存储器410读出数据,状态计数器472递增。状态计数器472是二进制码计数器,其位宽为n 1。可选地,状态计数器472同状态计数器422相同。
读地址译码单元470的状态计数器472还分别耦合到读指针计数器474与格雷码译码器476。状态计数器472的二进制计数值被提供给格雷码译码器478,以根据二进制计数值生成对应的格雷码。格雷码译码器478的位宽是n 1。格雷码译码器478还将生成的格雷码提供给反向格雷码转换器476。反向格雷码转换器476将向其输入的格雷码转换为反向格雷码,并将生成的反向格雷码(记为rptr_rev)提供给读指针同步单元452。
响应于每次计数,状态计数器472向读指针计数器474提供信号,以使读指针计数器474相应计数。读指针计数器474是二进制码计数器,其位宽为n,并且计数范围是从二进制0到m-1。
读指针计数器474的计数值被提供给双端口存储器210,作为读地址译码单元470向双端口存储器410提供的读指针,用于指示从双端口存储器410读出数据的地址。
空检测单元484接收格雷码译码器478的输出(记为rptr,位宽为n 1),还接收写指针同步单元482的输出(记为wptr_sync,位宽为n 1)。空检测单元484生成空状态标记empty=(wptr_sync==rptr)?1’b1:1’b0;。在空状态标记empty指示fifo存储器非空时,才从双端口存储器410读出数据。
图5展示了根据本申请再一实施例的异步fifo存储器的框图。
参看图5,根据本申请实施例的异步fifo存储器的深度为m(m为正整数)。异步fifo存储器包括双端口存储器510、写地址译码单元520与读地址译码单元570。写地址译码单元520向双端口存储器510提供用于写入数据的写指针,写指针的取值范围是0~(m-1)。读地址译码单元570向双端口存储器510的读端口提供用于读出数据的读指针,读指针的取值范围是0~(m-1)。写地址译码单元520与读地址译码单元570各自位于不同的时钟域。
图5展示的异步fifo存储器还包括读指针同步单元552、写指针同步单元582、满检测单元554与空检测单元584。
读指针同步单元552将从读地址译码单元570获取的读指针提供给反向格雷码转换器560,反向格雷码转换器560的输出提供给满检测单元554。满检测单元比较反向格雷码转换器560提供的读指针与从写地址译码单元520获取的写指针,并生成指示fifo存储器是否“满”的满状态标志。
写指针同步单元582将从写地址译码单元520获取的写指针提供给空检测单元584。空检测单元584比较写指针同步单元582提供的写指针与从读地址译码单元570获取的读指针,并生成指示fifo存储器是否“空”的空状态标志。
写地址译码单元520包括状态计数器522、写指针计数器524与格雷码译码器526。
响应于每次向双端口存储器510写入数据,状态计数器522递增。状态计数器422是二进制码计数器,其位宽为n 1。可选地,状态计数器522同图4展示的状态计数器422一致,写指针计数器524同图4展示的写指针计数器424一致,格雷码译码器526同图4展示的格雷码译码器426一致。
格雷码译码器526输出的格雷码被提供给满检测单元554以及写指针同步单元582。
写指针同步单元582从读地址译码单元570获得读指针的格雷码,并提供给反向格雷码转换器560(记为rptr_sync)。反向格雷码转换器560将接收的读指针的格雷码(rptr_sync)转换为反向格雷码(记为rptr_rev_sync),并提供给满检测单元554。
满检测单元554接收格雷码译码器526的输出(记为wptr,位宽为n 1),还接收反向格雷码转换器560的输出(记为rptr_rev_sync,位宽为n 1)。满检测单元554生成满状态标记full=(wptr[n]!=rptr_rev_sync[n])?(wptr[n-1:0]==rptr_rev_sync[n-1:0]):1’b0。
读地址译码单元570包括状态计数器572、读指针计数器574与格雷码译码器576。
状态计数器572同图4的状态计数器472一致。读指针计数器574同图4的读指针计数器474一致。
读地址译码单元570的状态计数器572还分别耦合到读指针计数器574与格雷码译码器576。状态计数器572的二进制计数值被提供给格雷码译码器576,以根据二进制计数值生成对应的格雷码。格雷码译码器576的位宽是n 1。格雷码转换器576将生成的格雷码提供给读指针同步单元552。
空检测单元584接收格雷码译码器576的输出(记为rptr,位宽为n 1),还接收写指针同步单元582的输出(记为wptr_sync,位宽为n 1)。空检测单元584生成空状态标记empty=(wptr_sync==rptr)?1’b1:1’b0。
图6展示了根据本申请依然再一实施例的异步fifo存储器的框图。
参看图6,根据本申请实施例的异步fifo存储器的深度为m(m为正整数)。异步fifo存储器包括双端口存储器610、写地址译码单元620与读地址译码单元670。写地址译码单元620向双端口存储器610提供用于写入数据的写指针,写指针的取值范围是0~(m-1)。读地址译码单元670向双端口存储器610的读端口提供用于读出数据的读指针,读指针的取值范围是0~(m-1)。写地址译码单元620与读地址译码单元670各自位于不同的时钟域。
图6展示的异步fifo存储器还包括读指针同步单元652、写指针同步单元682、满检测单元654与空检测单元684。
读指针同步单元652将从读地址译码单元670获取的读指针提供给满检测单元654。满检测单元654比较读指针同步单元652提供的读指针与从写地址译码单元620获取的写指针,并生成指示fifo存储器是否“满”的满状态标志。
写指针同步单元682将从写地址译码单元620获取的写指针提供给空检测单元684。空检测单元684比较写指针同步单元682提供的写指针与从读地址译码单元670获取的读指针,并生成指示fifo存储器是否“空”的空状态标志。
写地址译码单元620包括写指针计数器624、格雷码生成单元626与反向格雷码生成单元628。
响应于每次向双端口存储器610写入数据,写指针计数器计数,其计数值递增。写指针计数器624是二进制码计数器,其位宽为n,并且计数范围是从二进制0到m-1。当写指针计数器624计数到计数范围部分的结尾m-1时,下次计数的值为0。写指针计数器624还包括循环标记d。循环标记d是例如1比特寄存器,用于指示写指针计数器624的计数值所对应的范围或半区(也参看图2b或图3c)。例如,初始化后写指针计数器624的循环标记d的值为0,而当每次写指针计数器624从计数范围部分的结尾m-1跳变到计数范围部分的开始0时,循环标记的值被翻转。
写指针计数器624的计数值与循环标记d的值被提供给格雷码生成单元626与反向格雷码生成单元628。写指针计数器624的计数值(作为“地址指针”)与循环标记d的值(作为对范围或半区的指示)共同唯一标识了例如图2b或图3c的一行,从而对所标识的行有对应的格雷码与反向格雷码。格雷码生成单元626将接收的写指针计数器624的计数值与循环标记d的值转换为格雷码。反向格雷码生成单元628将接收的写指针计数器624的计数值与循环标记d的值转换为反向格雷码。
写指针计数器624的计数值被提供给双端口存储器610,作为写地址译码单元620向双端口存储器610提供的写指针。
格雷码生成单元626生成的格雷码被提供给写指针同步单元682。
反向格雷码生成单元628生成的反向格雷码被提供给满检测单元654。
写指针同步单元682从读地址译码单元670获得读指针的格雷码,并提供给满检测单元654(记为rptr_sync)。
满检测单元654接收反向格雷码生成单元628的输出(记为wptr_rev,位宽为n 1),还接收同步单元652的输出(记为rptr_sync,位宽为n 1)。满检测单元654生成满状态标记full=(wptr_rev[n]!=rptr_sync[n])?(wptr_rev[n-1:0]==rptr_sync[n-1:0]):1’b0。
读地址译码单元670包括读指针计数器674与格雷码生成单元676。
可选地,读指针计数器674同写指针计数器624一致。格雷码生成单元676同格雷码生成单元626一致。
读指针计数器674的二进制计数值与循环标记d被提供给格雷码生成单元676,以生成对应的格雷码。格雷码生成单元676将生成的格雷码提供给读指针同步单元652。
空检测单元684接收格雷码生成单元676的输出(记为rptr,位宽为n 1),还接收写指针同步单元682的输出(记为wptr_sync,位宽为n 1)。空检测单元684生成空状态标记empty=(wptr_sync==rptr)?1’b1:1’b0。
尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。
1.一种异步fifo存储器,包括双端口存储器、写地址译码器、读地址译码器、满检测单元、读指针同步单元、空检测单元与写指针同步单元;
所述写指针译码器、满检测单元与读指针同步单元位于第一时钟域;
所述读指针译码器、空检查单元与写指针同步单元位于第二时钟域;
所述写指针译码器耦合到所述双端口存储器的写端口,并向所述双端口存储器的写端口提供写指针;
所述读指针译码器耦合到所述双端口存储器的读端口,并向所述双端口存储器的写端口提供读指针;
其特征在于,
所述写指针译码器包括第一状态计数器、写指针计数器、第一格雷码译码器与反向格雷码译码器;
所述第一状态计数器按二进制从0到m-1再从2^(n 1)-m到2^(n 1)-1的范围以步长为1连续循环计数,其中m是所述异步fifo存储器的深度;
所述第一状态计数器耦合到所述写指针计数器、所述第一格雷码译码器与所述反向格雷码译码器;
所述写指针计数器按二进制从0到m-1以步长为1连续循环计数,所述写指针计数器的计数值作为所述写指针译码器提供给所述双端口存储器的写端口的写指针;
所述第一格雷码译码器的输出耦合到所述写指针同步单元;
所述反向格雷码译码器的输出耦合到所述满检测单元。
2.根据权利要求1所述的异步fifo存储器,其中
所述读指针译码器包括第二状态计数器、读指针计数器与第二格雷码译码器;
所述第二状态计数器按二进制从0到m-1再从2^(n 1)-m到2^(n 1)-1的范围以步长为1连续循环计数,其中m是所述异步fifo存储器的深度;
所述第二状态计数器耦合到所述读指针计数器与所述第二格雷码译码器;
所述读指针计数器按二进制从0到m-1以步长为1连续循环计数,所述读指针计数器的计数值作为所述读指针译码器提供给所述双端口存储器的读端口的读指针;
所述第二格雷码译码器将所述第二状态计数器提供的二进制计数值转换为格雷码;
所述第二格雷码译码器的输出耦合到所述读指针同步单元;
所述第二格雷码译码器的输出也耦合到所述空检测单元。
3.根据权利要求1或2之一所述的异步fifo存储器,其中
若所述第一状态计数器输出的计数值i在0~(m-1)范围,所述反向格雷码译码器将所述第一状态计数器输出的计数值i转换为g(m-1-i),其中g(i)代表二进制值i的格雷码;
若所述第一状态计数器输出的计数值2^(n 1)-m i在2^(n 1)-m到2^(n 1)-1范围,所述反向格雷码译码器将所述第一状态计数器输出的计数值2^(n 1)-m i转换为g(2^(n 1)-1-i),其中n为log2(m)向上取整的结果。
4.根据权利要求2或3所述的异步fifo存储器,其中
所述读指针同步单元的输出与所述反向格雷码译码器的输出耦合到所述满检测单元;
所述写指针同步单元的输出与所述第二格雷码译码器的输出耦合到所述空检测单元。
5.根据权利要求4所述的异步fifo存储器,其中
所述满检测单元依据所述读指针同步单元的输出与所述反向格雷码译码器的输出的最高位相反而其他位相同而输出满状态标记,否则输出非满状态标记。
6.根据权利要求4或5所述的异步fifo存储器,其中
所述空检测单元依据所述写指针同步单元的输出与所述第二向格雷码译码器的输出相同而输出空状态标记,否则输出非空状态标记。
7.一种异步fifo存储器,包括双端口存储器、写地址译码器、读地址译码器、满检测单元、读指针同步单元、空检测单元与写指针同步单元;
所述写指针译码器、满检测单元与读指针同步单元位于第一时钟域;
所述读指针译码器、空检查单元与写指针同步单元位于第二时钟域;
所述写指针译码器耦合到所述双端口存储器的写端口,并向所述双端口存储器的写端口提供写指针;
所述读指针译码器耦合到所述双端口存储器的读端口,并向所述双端口存储器的写端口提供读指针;
其特征在于,
所述写指针译码器包括第一状态计数器、写指针计数器与第一格雷码译码器;
所述读指针译码器包括第二状态计数器、读指针计数器、第二格雷码译码器与反向格雷码转换单元;
所述第一状态计数器与第二状态计数器各自均按二进制从0到m-1再从2^(n 1)-m到2^(n 1)-1的范围以步长为1连续循环计数,其中m是所述异步fifo存储器的深度;
所述第二状态计数器耦合到所述读指针计数器与所述第二格雷码译码器;
所述读指针计数器按二进制从0到m-1以步长为1连续循环计数,所述读指针计数器的计数值作为所述读指针译码器提供给所述双端口存储器的读端口的读指针;
所述第二格雷码译码器将所述第二状态计数器提供的二进制计数值转换为格雷码;
所述反向格雷码转换单元的输出耦合到所述读指针同步单元;
所述第二格雷码译码器的输出耦合到所述空检测单元;
所述反向格雷码转换单元将所述第二格雷码译码器的输出转换为反向格雷码。
8.根据权利要求7所述的异步fifo存储器,其中
所述第一状态计数器耦合到所述写指针计数器与所述第一格雷码译码器;
所述写指针计数器按二进制从0到m-1以步长为1连续循环计数,所述写指针计数器的计数值作为所述写指针译码器提供给所述双端口存储器的写端口的写指针;
所述第一格雷码译码器将所述第一状态计数器提供的二进制计数值转换为格雷码;
所述第一格雷码译码器的输出耦合到所述写指针同步单元;
所述第一格雷码译码器的输出也耦合到所述满检测单元。
9.一种异步fifo存储器,包括双端口存储器、写地址译码器、读地址译码器、满检测单元、读指针同步单元、空检测单元与写指针同步单元;
所述写指针译码器、满检测单元与读指针同步单元位于第一时钟域;
所述读指针译码器、空检查单元与写指针同步单元位于第二时钟域;
所述写指针译码器耦合到所述双端口存储器的写端口,并向所述双端口存储器的写端口提供写指针;
所述读指针译码器耦合到所述双端口存储器的读端口,并向所述双端口存储器的写端口提供读指针;
其特征在于,
所述写指针译码器包括第一状态计数器、写指针计数器与第一格雷码译码器;
所述读指针译码器包括第二状态计数器、读指针计数器与第二格雷码译码器;
所述第一状态计数器与第二状态计数器各自均按二进制从0到m-1再从2^(n 1)-m到2^(n 1)-1的范围以步长为1连续循环计数,其中m是所述异步fifo存储器的深度;
所述第一状态计数器耦合到所述写指针计数器与所述第一格雷码译码器;
所述写指针计数器按二进制从0到m-1以步长为1连续循环计数,
所述写指针计数器的计数值作为所述写指针译码器提供给所述双端口存储器的写端口的写指针;
所述第一格雷码译码器将所述第一状态计数器提供的二进制计数值转换为格雷码;
所述第一格雷码译码器的输出耦合到所述写指针同步单元;
所述第一格雷码译码器的输出耦合到所述满检测单元;
所述异步fifo存储器还包括位于第一时钟域的反向格雷码转换单元,所述反向格雷码转换单元的输入耦合到所述读指针同步单元的输出,所述反向格雷码转换单元的输出耦合到所述满检测单元的输入,所述反向格雷码译码器将所述读指针同步单元输出的读指针的格雷码转换为反向格雷码。
10.一种异步fifo存储器,包括双端口存储器、写地址译码器、读地址译码器、满检测单元、读指针同步单元、空检测单元与写指针同步单元;
所述写指针译码器、满检测单元与读指针同步单元位于第一时钟域;
所述读指针译码器、空检查单元与写指针同步单元位于第二时钟域;
所述写指针译码器耦合到所述双端口存储器的写端口,并向所述双端口存储器的写端口提供写指针;
所述读指针译码器耦合到所述双端口存储器的读端口,并向所述双端口存储器的写端口提供读指针;
其特征在于,
所述写指针译码器包括写指针计数器、第一格雷码生成单元与反向格雷码生成单元;
所述读指针译码器包括读指针计数器与第二格雷码生成单元;
所述读指针计数器与所述写指针计数器各自均按二进制从0到m-1的范围以步长为1连续循环计数,其中m是所述异步fifo存储器的深度;
所述读指针计数器与所述写指针计数器各自还包括作为循环标记的寄存器,每当计数器的计数值从m-1环绕到0时作为循环标记的寄存器翻转;
所述写指针计数器耦合到所述第一格雷码生成单元与所述反向格雷码生成单元;
所述写指针计数器的计数值作为所述写指针译码器提供给所述双端口存储器的写端口的写指针;
所述第一格雷码生成单元将所述写指针计数器的值与循环标记转换为格雷码;
所述反向格雷码生成单元将所述写指针计数器的值与循环标记转换为反向格雷码;
所述第一格雷码生成单元的输出耦合到所述写指针同步单元;
所述反向格雷码译码器的输出耦合到所述满检测单元。
技术总结