此博客为个人博客,不涉及商业用途,仅提供学习参考,内容均来自个人原创以及互联网转载和摘录。
此博客上带有原创标识的文章、图片、文件等,未经本人允许,不得用于商业用途以及传统媒体。
本文首发于CSDN,版权所有,禁止转载。
如需转载,请在评论区留言或私信申请,经同意后可转载,否则属于侵权行为。
原博客链接:https://blog.csdn.net/qq_38305370
原博主昵称:城外南风起
————————————————
格雷码(Gray Code)相邻的2个数值之间只会有一位发生变化,其余各位都相同。在异步FIFO中,跨时钟域传输读写指针会使用格雷码,从而大幅降低亚稳态概率,具体原因可以参考我的文章《跨时钟域传输的黄金搭档:异步FIFO与格雷码》。
格雷码的原理和编码方式可参考[1]。
本文以3bit数据为例。
二进制码转格雷码
代码:
module bin2gray(
input [2:0] bin,
output [2:0] gray
);
reg[2:0] gray,temp;
always @(*) begin
temp = (bin >> 1);
gray[2] = bin[2];
gray[1:0] = temp[1:0] ^ bin[1:0];
end
endmodule
格雷码转二进制码
代码:
module gray2bin(
input [2:0] gray,
output [2:0] bin
);
assign bin[2] = gray[2];
generate
genvar i;
for(i=0;i<2;i=i+1) begin:g2b
assign bin[i] = gray[i]^bin[i+1];
end
endgenerate
endmodule
testbench
代码:
`timescale 1ns / 1ps
module bin2gray_tb();
reg [2:0] bin_data;
wire [2:0] gray_data;
wire [2:0] out;
initial
begin
bin_data = 0;
#200 $stop;
end
always #10 bin_data = bin_data + 1;
bin2gray bin2gray0(
.bin(bin_data),
.gray(gray_data)
);
gray2bin gray2bin0(
.bin(out),
.gray(gray_data)
);
endmodule
仿真波形
参考文献
[1]梅媛,沈祖斌.格雷码的来源以及格雷码的应用[J].科技视界,2016(27):204+200.
————————————————
感谢您的阅读,如果您有收获,请给我一个三连吧!
如果您觉得这还不够,可以点击 打赏 按钮,告诉我: 你币有了!
我是城外南风起,欢迎关注我的公众号【木叶芯】。
木叶飞舞之处,火亦生生不息。