大家好,又见面了,我是你们的朋友全栈君。
近日学习用到异步FIFO,故写下这篇博客记录学习心得。
在我看来,异步FIFO的设计注意事项大体分为两点:
- 亚稳态的处理
- 空满状态的判断
第一,来说一下亚稳态。亚稳态是指触发器无法在某个规定时间内达到一个可确认的状态。在FIFO的设计中,产生的原因主要由两点:一是逻辑电平的误判,也就是如果通过二进制作为指针来判断空满状态,因二进制数值变化引起的位数变化大,对电路的危害也随之增加,故在本设计中使用个格雷码。二是信号和时钟之间不满足要求,即建立时间和保持时间未满足,在这里通过打两级寄存器来消除亚稳态使信号稳定。
第二,关于空满状态的判断,常使用的方法为附加位比较法。对于二进制指针而言,FIFO的满状态时写指针比读指针多循环了一次,而且两个数只是最高位不同,其余各位都相同。那么我就可以这样判断,如果读指针和写指针的最高位不同,而其他位都相同时,此时的状态为满状态。FIFO的空状态时写指针和读指针相同,那么此时读指针和写指针相等。这样读指针和写指针就变成了一个n位指针,其中低n-1位时用来存放FIFO存储器的地址,可以用来对2^(n-1)个存储单元寻址,而最高位则用来辨别空满状态。
但是格雷码在判断空满状态时和二进制有出入。当格雷码由7到8时(0100到1100),可以看到指针的附加位改变,但是地址位并未变化,这是因为格雷码是一种镜像码造成的。所以我们需要附加位和地址位分开循坏,此时就需要既能产生n位格雷码又能产生n-1位格雷码的计数器,这种计数器被称为“两重格雷码计数器”。格雷码指针的空状态也是判断读指针和写指针是否相等。但是判断满状态和二进制指针有很大不同。首先应该明白数据存入的顺序并不是按照000递增开始的,而是随机的。例如一次写入数据是从十进制的地址6开始,连续写入8个数据,地址指向14,这是存储器存满8个数据,应该产生满状态输出。地址6的格雷码0101,地址14的格雷码1001。假如从十进制的地址2开始,结束地址指向10,此时地址2的格雷码为0011,地址10的格雷码为1111,观察两次例子,起始地址和结束地址的格雷码后两位都相同,前两位的异或值相等,并且起始地址和结束地址的首位是不同的。那么4位格雷码判断满状态就可以分为3步:首先后两位相同,然后前两位的异或值相等,最后首位不同。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/129143.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...