概述
目录
一、格雷码简介
二、转换规律
1、二进制转格雷码
2、格雷码转二进制码
三、代码实现
总结
一、格雷码简介
格雷码(Binary Gray Code),是指在一组数的编码中,任意两个相邻的代码只有一位二进制数不同,这使得它在递增或递减的过程中,每次只变化一位。格雷码属于可靠性编码,是一种错误最小化的编码方式,因为,虽然自然二进制码可以直接由数/模转换器转换成模拟信号,但在某些情况,例如十进制的3转换为4时二进制码的每一位都要变,能使数字电路产生很大的尖峰电流脉冲,而格雷码则没有这一缺点,它在相邻位间转换时,只有一位产生变化,它大大地减少了由一个状态到下一个状态时逻辑的混淆。由于这种编码相邻的两个码组之间只有一位不同,引起数字量发生变化时,格雷码仅改变一位,这样与其它编码同时改变两位或多位的情况相比更为可靠,即可减少出错的可能性。但是相对于二进制计数,它也有它的不足,那就是循环技术深度必须是2的N次幂,否则就失去了每位只变化一位的特性。下边给出了深度为16的二进制及格雷码递变表。
Binary Gray
0000 0000
0001 0001
0010 0011
0011 0010
0100 0110
0101 0111
0110 0101
0111 0100
1000 1100
1001 1101
1010 1111
1011 1110
1100 1010
1101 1011
1110 1001
1111 1000
二、转换规律
1、二进制转格雷码
观察上式给出的16组二进制与格雷码的转换表,可以得到以下规律:格雷码的最高位等于二进制码的最高位,格雷码的次高位等于二进制码的最高位与次高位的异或,依次类推得到以下公式:若二进制码的最高位为b[n-1],最低位为b[0],格雷码码的最高位为g[n-1],最低位为g[0],则g[n-1]=b[n-1],g[n-2]=b[n-1]^b[n-2];g[n-3]=b[n-2]^b[n-3]……g[0]=b[1]^b[0];
综上所述,将二进制码整体右移一位,然后再与二进制码本身进行异或,得到该二进制码对应的格雷码。对应公式:g[n-1:0]=(b[n-1:0]>>1)^b[n-1:0];
2、格雷码转二进制码
同理对于格雷码转换二进制可以得到以下规律:二进制码的最高位同样等于格雷码的最高位,二进制码的次高位等于格雷码的次高位异或二进制码的最高位,以此类推得到以下公式,即b[n-1] = g[n-1],b[n-2] = g[n-2]^b[n-1]……b[0]=g[0]^b[1];
三、代码实现
module transform_b_g
#(
parameter N = 8
)
(
input [N-1:0]b ,//输入二进制
output [N-1:0]g ,//输出对应的格雷码
output [N-1:0]bx //将转换后的格雷码再转化成二进制
);
wire true;//判断转换是否正确
assign g = (b>>1)^b;
assign bx[N-1] = g[N-1];
//assign reg1 = (g<<1)^bx;
//assign bx[N-2:0] = reg1[N-1:0];
generate
genvar i;
for(i = N-2;i>=0;i=i-1)begin
assign bx[i] = bx[i+1]^g[i];
end
endgenerate
assign true = (b==bx)?1'b1:1'b0;
endmodule
下面给出仿真的tb测试代码:
`timescale 1ns/1ns
module tb_g();
reg [7:0] bin;
reg clk;
wire [7:0] gray;
wire [7:0] bx ;
parameter M = 8;
initial begin
clk <= 1'b0;
bin <= 8'd0;
end
always #50 clk <= ~clk;
always@(posedge clk)
bin <= bin + 1'b1 ;
transform_b_g
#(
.N(M)
)
u_transform_b_g
(
.b(bin) ,
.g(gray) ,
.bx(bx)
);
endmodule
下图给出仿真结果:
可以发现二进制与格雷码之间转换正确
总结
初次创作,难免文章中存在错误,希望读者能够及时纠正并给予私信,望大家共同进步!
最后
以上就是粗暴柠檬为你收集整理的格雷码与二进制之间的转换一、格雷码简介 二、转换规律 三、代码实现总结的全部内容,希望文章能够帮你解决格雷码与二进制之间的转换一、格雷码简介 二、转换规律 三、代码实现总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复