跨时钟域处理方法
慢->快 | 快->慢 | |
---|---|---|
单bit | 在快时钟域同步打拍,将信号同步到快时钟域 | 展宽后同步打拍 |
多bit | 异步FIFO | 异步FIFO+握手信号 |
一.打两拍
- 适用于单bit跨时钟域处理
- 所谓的打两拍就是定义两级寄存器实现延时
那为什么是打两拍,不是打一拍,打三拍?
- 打拍的作用:第一拍是异步信号转同步信号,第二拍及以后是防止亚稳态传递。理论来说,打两拍也不是完全消除亚稳态,只是降低了亚稳态出现的概率。触发器进入亚稳态的时间计算可以用参数MBTF计算,其公式如下
其中MBTF的值越大,亚稳态出现的概率越小。而打拍可以增大MBTF的值。
简而言之就是:打一拍仍然有很大概率出现亚稳态,打两拍出现亚稳态概率不大,打三拍相较于打两拍亚稳态出现的概率更低,但是除非超高频没必要
二.异步双口RAM
- 这个比较好理解,就是用时钟1来写入,时钟2来读出。可以使用异步FIFO实现同样的目的。
三.格雷码转换
- 在异步双口RAM操作时,写入RAM后要在读时钟下判断写地址,当写地址大于某个值时再去读取RAM。如果直接打两拍,在高速环境下容易出错。那么更稳妥的方法就是先把RAM的写地址转换为格雷码,再将这个转换后的格雷码打两拍,最后在读时钟域恢复为十进制。在FIFO中也是一样,转换格雷码能够有效降低指针在跳变时出现的亚稳态风险,冒险现象。
- 格雷码是和FIFO,双口RAM结合使用的
补充格雷码知识点
-
规律如下:
1.最右边一位取反
2.从右往左第一个0变为1
(重复上述两个操作) -
二进制如何转换为格雷码
1.格雷码中的最高有效位(最左边)等同于二进制数中相应的最高有效位。
2.从左到右,加上每一对相邻的二进制编码位,从而得到下一个格雷码位,舍去进位。
-
格雷码如何转为二进制
1.二进制码的最高有效位(最左边)等同于格雷码中相应的最高有效位。
2.将所产生的每个二进制码位加下一个相邻位置的格雷码位,从而得到下一个二进制位。舍去进位。
参考:
1.https://cloud.tencent.com/developer/article/1664923
2.https://blog.csdn.net/Hide_in_Code/article/details/126600563?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169692141116800225522215%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=169692141116800225522215&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-126600563-null-null.142^v95^insert_down1&utm_term=单bit跨时钟域为什么打两拍不是打一拍&spm=1018.2226.3001.4187
3.https://www.zhihu.com/question/43571892
4.https://blog.csdn.net/fpga_start/article/details/122652715?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169692603816800225524240%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=169692603816800225524240&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-122652715-null-null.142^v95^insert_down1&utm_term=格雷码&spm=1018.2226.3001.4187