Verilog——格雷码与二进制码的相互转换
Verilog——格雷码与二进制码的相互转换
定义与作用
-
格雷码是一种相邻数值仅有一个数位发生变化的编码。
-
格雷码被广泛应用于异步FIFO的数据传输中。当数值从一个时钟域传递到另一个时钟域时,仅有一个比特位的翻转十分重要。
格雷码与二进制码的转换
- 3bit位宽数据,二进制和格雷码的对应关系
二进制码 | 000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
---|---|---|---|---|---|---|---|---|
格雷码 | 000 | 001 | 011 | 010 | 110 | 111 | 101 | 100 |
- 4bit位宽数据,二进制和格雷码的对应关系
二进制码 | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 |
---|---|---|---|---|---|---|---|---|
格雷码 | 0000 | 0001 | 0011 | 0010 | 0110 | 0111 | 0101 | 0100 |
二进制码 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
---|---|---|---|---|---|---|---|---|
格雷码 | 1100 | 1101 | 1111 | 1110 | 1010 | 1011 | 1001 | 1000 |
- 二进制码转换为格雷码
位宽W的数据:
最高位相同:graycode[W-1] = bincode[W-1]
其它数位:graycode[i] = bincode[i] ^ bincode[i+1], i∈[0, W-2]
- 格雷码转换为二进制码
位宽W的数据:
最高位相同:bincode[W-1] = graycode[W-1]
其它数位:bincode[i] = graycode[i] ^ bincode[i+1], i∈[0, W-2]
代码实现
1. 二进制码转换为格雷码
//bin2gray.v
`timescale 1ns/1ps
module bin2gray
#(
parameter W = 8 //位宽
)
(
input [W-1:0] bincode,
output [W-1:0] graycode
);
assign graycode = bincode ^ (bincode >> 1);
endmodule
2. 格雷码转换为二进制码
//gray2bin.v
`timescale 1ns/1ps
module gray2bin
#(
parameter W = 8 //位宽
)
(
input [W-1 : 0] graycode ,
output[W-1 : 0] bincode
);
assign bincode[W-1] = graycode[W-1];
generate
genvar i;
for(i = 0; i < W-1; i = i + 1) begin
assign bincode[i] = bincode[i+1] ^ graycode[i];
end
endgenerate
endmodule
3. 联合仿真
//tb_graycode
`timescale 1ns/1ps
module tb_graycode();
localparam WIDTH = 8;
reg [WIDTH-1 : 0] bin_in;
wire [WIDTH-1 : 0] gray_out;
wire [WIDTH-1 : 0] bin_out;
bin2gray
#(
.W (WIDTH )//位宽
)
bin2gray_inst
(
.bincode (bin_in ),
.graycode (gray_out )
);
gray2bin
#(
.W (WIDTH )//位宽
)
gray2bin_inst
(
.graycode (gray_out ),
.bincode (bin_out )
);
integer i;
initial begin
for(i = 0; i < (1<<WIDTH); i = i +1) begin
bin_in = i;
#10;
end
end
endmodule
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期