← 异步FIFO设计与仿真

推荐答案 测试一下

格雷码实现指针

题目配图 题目配图
编程题 中等 笔试真题

参考答案

使用格雷码进行计数,首先需要设计一个格雷码计数器。通常有两种方法:一是直接构造格雷码状态机,每次加1时按照格雷码的规律只改变一位;二是采用二进制计数器加格雷码转换,即内部使用二进制计数器,计数结果通过公式 gray = (bit>>1) ^ bit 转换为格雷码输出。在异步FIFO中,读写指针分别采用格雷码计数器,并在各自的时钟域内递增。由于格雷码每步只变化一位,跨时钟域同步时最多出现一位亚稳态,大大降低了多比特同步错误的风险。指针同步后用于空满判断:读空时,同步后的读写格雷码完全相等;写满时,写指针比读指针高一个FIFO深度(假设深度为2^N),格雷码判断满的条件是写指针和读指针的最高位不同,其余位相同(因为格雷码在环绕时高两位变化特殊)。实际设计中,常将同步后的格雷码转换为二进制,然后直接比较数值差。转换公式为:二进制最高位等于格雷码最高位,后续位依次为 bit[i] = gray[i] ^ bit[i+1]。另外,需注意同步器至少打两拍以降低亚稳态概率。格雷码指针的优点是仅一位跳变,使跨时钟域采样更可靠;缺点是计数逻辑稍复杂,且比较时需要转换。

涉及知识点

  • 格雷码编码特性(每步只变化一位)
  • 二进制与格雷码互相转换公式
  • 异步FIFO的读写指针同步方法
  • 亚稳态产生机理与打拍同步
  • FIFO空满判断条件与格雷码比较
  • 格雷码计数器设计实现
登录后反馈错题