news 2026/8/19 12:13:35

格雷码:为什么只在异步FIFO里混得开?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
格雷码:为什么只在异步FIFO里混得开?

数据从一个时钟域传到另一个时钟域,时序稍微对不上,就会采到不确定的亚稳态值。这在芯片里是大忌,可能导致整个系统逻辑错乱。

格雷码的设计思路很直接:相邻两个数之间只变一位

十进制 二进制 格雷码 3 011 010 4 100 110 (只变最高位) 5 101 111 (只变最低位)

普通二进制从3到4,三位全跳了。格雷码只动一位。这个特性在跨时钟域场景下有个关键优势:就算采样时机不对,采到了中间翻转的瞬间,最多也就一位出错

而且这个错还不是随便错——要么采到当前值,要么采到下一个值,不会跳出这个范围。

异步FIFO就是靠这个活的

FIFO的读写指针分别在两个时钟域,要判断满空状态,必须把对方的指针同步过来对比。这时候格雷码的优势就炸裂了:

// 写指针(格雷码)同步到读时钟域 always @(posedge rclk) begin rq2_wptr <= rq1_wptr; rq1_wptr <= wptr_gray; // 写指针的格雷码 end // 判断空 assign empty = (rq2_wptr == rptr_gray);

关键点来了:指针采错一次根本不要紧

假设写指针刚从5跳到6,读时钟域采样时正好卡在中间态,可能采成5,也可能采成6。采成5?那就认为FIFO还没写入新数据,多等一拍再读,不会出错。采成6?正好,读取最新数据,也没问题。

因为指针是单调递增的,采样误差最多让判断延迟一个周期,不会导致逻辑错误。FIFO不会因为这一拍的误判就读出脏数据或者溢出。

但普通总线为什么不行?

因为总线传的数据不是连续变化的,采错了后果很严重

一条地址总线,这一拍传0x1000,下一拍传0x8000。如果用格雷码,两个数之间依然多位翻转,采样时碰上中间态,可能采成一个完全错误的地址,比如0x5000。

地址跳变: 0x1000 → 0x8000 即使用格雷码: 多位仍会同时变化 采样出错: 可能得到 0x5000(非法地址)

这个错误是致命的。芯片可能访问到错误的存储位置,读出垃圾数据或者写坏别的数据。这种错误没法容忍,多等一拍也救不回来

格雷码的单比特翻转特性确实优雅,但必须配合两个前提:数据连续变化,且采错一次可以容忍。异步FIFO的指针完美符合这两点,所以格雷码在那里是标配。

但芯片里大部分场景都不满足这两个条件。通用总线只能老老实实用握手协议或者干脆挂异步FIFO来缓冲。看起来笨重,但这才是非连续、不可容错数据的正确解法。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/19 10:20:06

无需训练!用RexUniNLU快速构建智能客服问答系统

无需训练&#xff01;用RexUniNLU快速构建智能客服问答系统 如果你正在为智能客服系统发愁&#xff0c;觉得训练模型太麻烦、标注数据太费时&#xff0c;那么今天介绍的RexUniNLU可能会让你眼前一亮。这是一个来自阿里巴巴达摩院的神奇工具&#xff0c;它能让你不用准备任何训…

作者头像 李华
网站建设 2026/8/17 10:32:50

cv_resnet50_face-reconstruction模型部署:Linux服务器环境搭建教程

cv_resnet50_face-reconstruction模型部署&#xff1a;Linux服务器环境搭建教程 1. 为什么需要在Linux服务器上部署人脸重建模型 最近有好几位做数字人项目的同事问我&#xff0c;怎么把cv_resnet50_face-reconstruction这个模型用到生产环境里。他们试过本地笔记本跑&#x…

作者头像 李华
网站建设 2026/8/16 9:21:10

Phi-3-mini-4k-instruct代码翻译工具开发

Phi-3-mini-4k-instruct代码翻译工具开发实战 你是不是也遇到过这样的场景&#xff1a;手头有一个用Python写的工具脚本&#xff0c;现在需要把它移植到Java项目里&#xff1b;或者接手了一个C的遗留代码库&#xff0c;想用更现代的Rust来重写。传统的手动翻译不仅耗时费力&am…

作者头像 李华
网站建设 2026/8/16 9:24:13

AI编程助手coze-loop实测:3步提升代码可读性

AI编程助手coze-loop实测&#xff1a;3步提升代码可读性 在日常开发中&#xff0c;我们常遇到这样的场景&#xff1a;接手一段“祖传代码”&#xff0c;变量名像天书、函数逻辑绕三圈、注释比代码还少&#xff1b;或是自己写的代码&#xff0c;两周后再看&#xff0c;竟需要重…

作者头像 李华