本文参考:
数字电路基础知识——格雷码和二进制码的转换的算法和Verilog实现_格雷码和二进制的转换电路-CSDN博客
需求:熟悉二进制与格雷码的互转方法
1,4位格雷码转二进制
使用公式法,按位列出二进制的每一位的对应关系
发现
bin3 = gray3
bin2 = gray3 xor gray2 =bin3 xor gray2
bin1 = gray3 xor gray2 xor gray1 = bin2 xor gray1
bin0 = gray3 xor gray2 xor gray1 xor gray0 = bin1 xor gray1
gray2bin
/
/*
组合逻辑 实现格雷码转二进制
*/
/
`timescale 1ns/1ps
module gray2bin #(
parameter WIDTH = 8
)
(
input [WIDTH-1:0] gray_data,
output [WIDTH-1:0] bin_data
);
assign bin_data[WIDTH-1] = gray_data[WIDTH-1];
/*
generate for 中使用组合逻辑
*/
genvar i;
generate
for(i = WIDTH-2;i >= 0;i = i-1) begin:gray2bin_label
assign bin_data[i] = (gray_data[i] ^ bin_data[i+1]);
end
endgenerate
endmodule
2,4位二进制转格雷码
gray3 = bin3
gray2 = bin 2 xor bin3
gray1 = bin 1 xor bin2
gray0 = bin 0 xor bin1
bin2gray
/
/*
公式法 二进制转格雷码
*/
/
`timescale 1ns/1ps
module bin2gray #(
parameter WIDTH = 8
)
(
input [WIDTH-1:0] i_data,
output [WIDTH-1:0] o_datas
);
assign o_datas[WIDTH-1] = i_data[WIDTH-1];
genvar i;
generate
for(i = WIDTH-2;i >= 0;i = i-1) begin :bin2gray_lable
assign o_datas[i] = i_data[i] ^ i_data[i+1];
end
endgenerate
3,仿真代码
使用for 生成 1-2**WIDTH_T 的 二进制数
将二进制数转成格雷码
再将格雷码还原成二进制
testbench_top
`timescale 1ns/1ps
module testbench_top();
//参数定义
localparam WIDTH_T = 8;
localparam number = 2**WIDTH_T;
//接口申明
reg[WIDTH_T-1:0]bin_data_init;
wire[WIDTH_T-1:0]gray_data_init;
wire[WIDTH_T-1:0]bin_data;
gray2bin #(
.WIDTH(WIDTH_T)
)
uut_vlg_design(
.gray_data(gray_data_init),
.bin_data(bin_data)
);
bin2gray #(
.WIDTH(WIDTH_T)
)
bin2gray_design(
.i_data(bin_data_init),
.o_datas(gray_data_init)
);
integer i;
//产生
initial begin
$display("%d\n",number);
for (i = 0;i <= number-1;i = i+1) begin
bin_data_init <= i;
#10;
end
#2000;
$stop;
end
endmodule
4,仿真结果
5,总结注意事项
1,操作步骤,可以先从4位的二进制/格雷码互相转换熟悉公式法方法
2,完成初步的熟悉过程后,再通过端口定义常量方法将位数传递出去
module gray2bin #(
parameter WIDTH = 8
)
(
input [WIDTH-1:0] gray_data,
output [WIDTH-1:0] bin_data
)
localparam WIDTH_T = 8;
localparam number = 2**WIDTH_T;
gray2bin #(
.WIDTH(WIDTH_T)
)
uut_vlg_design(
.gray_data(gray_data_init),
.bin_data(bin_data)
);
3,在generate for 语句中,赋值为组合逻辑的写法
assign bin_data[i] = (gray_data[i] ^ bin_data[i+1]);
4,异或和次方的写法
异或:c = a ^ b;
次方: d = 2**3; //2的3次方
d = $pow(2, 3); // 计算2的4次方,并将结果存储在d中