十进制数 | 自然二进制数 | 格雷码 |
---|---|---|
0 | 0000 | 0000 |
1 | 0001 | 0001 |
2 | 0010 | 0011 |
3 | 0011 | 0010 |
4 | 0100 | 0110 |
5 | 0101 | 0111 |
6 | 0110 | 0101 |
7 | 0111 | 0100 |
8 | 1000 | 1100 |
9 | 1001 | 1101 |
10 | 1010 | 1111 |
11 | 1011 | 1110 |
12 | 1100 | 1010 |
13 | 1101 | 1011 |
14 | 1110 | 1001 |
15 | 1111 | 1000 |
格雷码转换二进制码的逻辑关系为:
bin[0] = gray[3] ^ gray[2] ^ gray[1] ^ gray[0]
bin[1] = gray[3] ^ gray[2] ^ gray[1]
bin[2] = gray[3] ^ gray[2]
bin[3] = gray[3]
通过上述4个计算可以等效为:
bin[0] = bin[1] ^ gray[0]
bin[1] = bin[2] ^ gray[1]
bin[2] = bin[3] ^ gray[2]
bin[3] = gray[3]
设计代码
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2020/07
// Design Name:
// Module Name: Test1103
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//////////////////////////////////////////////////////////////////////////////////
module Test1103(gray,bin,clk,inc,rst_n);
parameter size=4;
output [size-1:0] gray,bin;
input clk,inc,rst_n;
reg [size-1:0] gnext,gray,bnext,bin;
integer i;
///////////////////////////////////////////////////////
//时序逻辑
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
gray <= 0;
end
else begin
gray <= gnext;
end
end
///////////////////////////////////////////////////////
//组合逻辑
always @(gray or inc) begin
for(i=0;i<size;i=i+1) begin
bin[i] = ^(gray>>i);
bnext = bin + inc;
gnext = (bnext>>1) ^ bnext;
end
end
endmodule
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2025/08
// Design Name:
// Module Name: GRAY转二进制
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//////////////////////////////////////////////////////////////////////////////////
module Test2508(gray,bin,clk,inc,rst_n);
parameter WIDTH= NUM;
input clk,rst_n;
input [WIDTH-1 : 0] gray;
output [WIDTH-1 : 0] bin;
reg [WIDTH-1 : 0] bin_d;
///////////////////////////////////////////////////////
//组合或者时序都可以,异或位置调换即为bin转gray
integer i;
always @(*) begin
for (i=0; i<WIDTH-2; i++) begin
bin_d[i] = gray[i+1] ^ gray[i];
end
end
assign bin = bin_d;
endmodule
测试代码(Testbench)
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2020/07
// Design Name:
// Module Name: Test1110
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//////////////////////////////////////////////////////////////////////////////////
module Test1110;
reg clk;
reg rst_n;
reg inc;
wire [3:0] gray,bin;
always begin
#10 clk=0;
#10 clk=1;
end
initial begin
clk=0;
inc=0;
rst_n=0;
#100;
rst_n=1;
#20;
inc=1;
end
Test1103 x1(.gray (gray ),
.bin (bin ),
.clk (clk ),
.inc (inc ),
.rst_n(rst_n));
endmodule
仿真波形如下