格雷码是一种循环二进制编码,特点是相邻数变化时只有一位数据跳变。

  • 4位二进制和格雷码对应如下:
1、二进制到格雷码转换
  • Verilog实现
1
2
3
4
5
6
7
8
9
10
11
12
module bin_to_gray 
#(
parameter WIDTH = 4
)
(
input [WIDTH-1:0] in,
output [WIDTH-1:0] out
);

assign out = in ^ (in >> 1);

endmodule
  • 仿真波形:
2、格雷码转二进制
  • Verilog实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
module gray_to_bin
#(
parameter WIDTH = 4
)
(
input [WIDTH-1:0] in,
output [WIDTH-1:0] out
);

// assign out[0] = ^in[3:0];
// assign out[1] = ^in[3:1];
// assign out[2] = ^in[3:2];
// assign out[3] = in[3];

genvar i;
generate
assign out[WIDTH-1] = in[WIDTH-1];
for(i=0; i<WIDTH-1; i=i+1) begin
assign out[i] = ^in[WIDTH-1:i];
end
endgenerate
  • 仿真波形: