【Verilog编程】格雷码与二进制的互转

`timescale 1ns/1ps module gray_to_bin( input wire [3:0] gray, output reg [3:0] bin ); integer i; always @(*)begin for(i=0;i<=3;i=i+1)begin bin[i]=^(gray>>i); end end endmodule

`timescale 1ns/1ps module bin_to_gray( input wire [3:0] bin, output reg [3:0] gray ); always @(*)begin gray=bin^(bin>>1); end endmodule
https://zhuanlan.zhihu.com/p/620610923
在跨时钟域处理(一)中,我们介绍了针对单bit信号的跨时钟域处理方法—使用DFF打两拍,然而这个方法对多bit的数据并不管用。
首先,我们知道,使用DFF打两拍可以基本消除亚稳态的问题,但是无法保证采样得到的数据是正确的,因此,如果现在要采样的是一个多bit的跨时钟域信号,比如4bit信号,那么由于建立时间和保持时间的违例,虽然在打两拍之后可以得到一个稳定的数据,但该数据的每一个bit都不一定是正确的,所以其可能的值有2 4 = 16 2^4=162
4
=16种,这显然是无法接受的,因此,对于多比特信号的跨时钟域处理,不能照搬。
一种可以解决多bit跨时钟域信号传输的方法就是格雷码。
https://blog.csdn.net/qq_40268672/article/details/123018083
一篇文章我们介绍了单Bit数据跨时钟域传输的两种不同的方法。这一篇文章我们将分析连续数值的多Bit数据传输。在介绍具体处理方法之前我们先介绍格雷码。
格雷码(又称循环码):
1、相邻的两个编码之间只有一位是不一样的。
2、当第N位从0变到1时,之后的数的N-1位会关于前半段对称,而比N位高的是相同的。
利用格雷码的第一个特点我们可以将多位连续的数值进行编码后用打两拍的方式直接跨时钟域传输。因为相邻的两个数值的格雷码只有一位发生变化,那么在进行跨时钟域传输的时候我们可以将其看做单Bit数据传输,因为其他位都是不变的因此是稳定的。所以传输过程中也不会出现错误数值,即使发生变化的那一位数据在一次打拍后是亚稳态但是在两次打拍后基本上可以说亚稳态的概率很低很低了,所以我们认为它消除了亚稳态。进而可以实现跨时钟域传输。
当然这个方法传输的时候也有很多的限制,比如快时钟传输到慢时钟的时候,如果时钟过快很有可能会导致一些快时钟域的数据在传输的过程中发生数据丢失。但是在慢时钟传递到快时钟用它来传递多Bit却是极好的选择。所以在一些特定场景下格雷码有着巨大的作用,例如在异步FIFO的读写指针在进行跨时钟域传输就是利用的格雷码进行的(具体细节我们下一讲在详细介绍)。
https://zhuanlan.zhihu.com/p/161681621
https://zhuanlan.zhihu.com/p/149861619?from_voters_page=true
https://fpga.eetrend.com/blog/2023/100574170.html
posted on 2025-09-05 17:12 taylorrrrrrrrrr 阅读(4) 评论(0) 收藏 举报