格雷码与二进制码的转换

Gray Code是1880年由法国工程师Jean-Maurice-Emlle Baudot发明的一种编码,是一种绝对编码方式,典型格雷码是一种具有反射特性和循环特性的单步自补码,它的循环、单步特性消除了随机取数时出现重大误差的可能,它的反射、自补特性使得求反非常方便。格雷码属于可靠性编码,是一种错误最小化的编码方式,因为,虽然自然二进制码可以直接由数/模转换器转换成模拟信号,但在某些情况,例如从十进制的3转换为4时二进制码的每一位都要变,能使数字电路产生很大的尖峰电流脉冲。而格雷码则没有这一缺点,它在相邻位间转换时,只有一位产生变化。它大大地减少了由一个状态到下一个状态时逻辑的混淆。由于这种编码相邻的两个码组之间只有一位不同,因而在用于风向的转角位移量-数字量的转换中,当风向的转角位移量发生微小变化(而可能引起数字量发生变化时,格雷码仅改变一位,这样与其它编码同时改变两位或多位的情况相比更为可靠,即可减少出错的可能性。

但格雷码不是权重码,每一位码没有确定的大小,不能直接进行比较大小和算术运算,也不能直接转换成液位信号,要经过一次码变换,变成自然二进制码,再由上位机读取。解码的方法是用‘0’和采集来的4位格雷码的最高位(第4位)异或,结果保留到4位,再将异或的值和下一位(第3位)相异或,结果保留到3位,再将相异或的值和下一位(第2位)异或,结果保留到2位,依次异或,直到最低位,依次异或转换后的值(二进制数)就是格雷码转换后自然码的值.

异或:异或则是按位“异或”,相同为“0”,相异为“1”。

一般的,普通二进制码与格雷码可以按以下方法互相转换:
  二进制码->格雷码(编码):从最右边一位起,依次将每一位与左边一位异或(XOR),作为对应格雷码该位的值,最左边一位不变(相当于左边是0);
  格雷码-〉二进制码(解码):从左边第二位起,将每位与左边一位解码后的值异或,作为该位解码后的值(最左边一位依然不变).
  数学(计算机)描述:
  原码:p[0~n];格雷码:c[0~n](n∈N);编码:c=G(p);解码:p=F(c);书写时从左向右标号依次减小.
  编码:c=p XOR p[i+1](i∈N,0≤i≤n-1),c[n]=p[n];
  解码:p[n]=c[n],p=c XOR p[i+1](i∈N,0≤i≤n-1).

四位二进制码和格雷码互转程序

module bin_gray (Binary,Gray);//4bit Binary code to Gray code
input [3:0] Binary;
output [3:0] Gray;
reg [3:0] data_reg;
always @(Binary)
begin
data_reg[3]=Binary[3];
data_reg[2]=Binary[3]^Binary[2];
data_reg[1]=Binary[2]^Binary[1];
data_reg[0]=Binary[1]^Binary[0];
end
assign Gray=data_reg;
endmodule

测试代码

`timescale 1ns / 1ps
module bin_gray_tb;
reg [3:0] Binary;
wire [3:0] Gray;
initial
begin
Binary=0;
#5 Binary=4‘b0001;
#10 Binary=4‘b0010;
#15 Binary=4‘b0011;
#20 Binary=4‘b0100;
#25 Binary=4‘b0101;
#30 Binary=4‘b0110;
#35 Binary=4‘b0111;
#40 Binary=4‘b1000;
#45 Binary=4‘b1001;
#50 Binary=4‘b1010;
#55 Binary=4‘b1011;
#60 Binary=4‘b1100;
#65 Binary=4‘b1101;
#70 Binary=4‘b1110;
#75 Binary=4‘b1111;
#80 Binary=4‘b1111;
#90 $stop;
end
bin_gray bin_gray1(.Binary(Binary),.Gray(Gray));

四位格雷码和二进制码转换

module gray_bin (Gray,Binary);//4bit Gray code to Binary code
input [3:0] Gray;
output [3:0] Binary;
reg [3:0] data_reg;
always @(Gray)
begin
data_reg[3]=Gray[3];
data_reg[2]=Gray[2]^data_reg[3];
data_reg[1]=Gray[1]^data_reg[2];
data_reg[0]=Gray[0]^data_reg[1];
end
assign Binary=data_reg;
endmodule

测试代码

`timescale 1ns / 1ps
module gray_bin_tb;
reg [3:0] Gray;
wire [3:0] Binary;
initial
begin
Gray=0;
#5 Gray=4‘b0001;
#10 Gray=4‘b0011;
#15 Gray=4‘b0010;
#20 Gray=4‘b0110;
#25 Gray=4‘b0111;
#30 Gray=4‘b0101;
#35 Gray=4‘b0100;
#40 Gray=4‘b1100;
#45 Gray=4‘b1101;
#50 Gray=4‘b1111;
#55 Gray=4‘b1110;
#60 Gray=4‘b1010;
#65 Gray=4‘b1011;
#70 Gray=4‘b1001;
#75 Gray=4‘b1000;
#80 Gray=4‘b1000;
#90 $stop;
end
bin_gray bin_gray1(.Gray(Gray),.Binary(Binary));
endmodule

时间: 2024-10-14 05:23:05

格雷码与二进制码的转换的相关文章

格雷码与二进制码互相转换

参考百科:http://baike.baidu.com/link?url=mr53i-76Ue3cGMnqWwG_lam8Zfwbfhdk8JnHEHhEU0nfzpIZ8l583KdcTIahIQIoSTYtL02DpWnt4goCByUQ9a 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码. 二进制码→格雷码(编码): 此方法从对应的n位二进制码字中直接得

Gray code---hdu5375(格雷码与二进制码,普通dp)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5375 题意就是:给你一串二进制码,里面可能含有'?'这个既可以表示0又可以表示1, 让我们把这个二进制串转成格雷码串,转换之后的串中如果第 i 位为 1 那么就加上对应给出的a[i],求最大加的结果ans: 例如: 00?0 1 2 4 8 二进制串可以是      0000或者0010 转化成格雷码之后是0000或者0011 0000价值总和为0: 0011的价值总和为a[3]+a[4]=12;

格雷码与二进制码转化成格雷码

在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),格雷码由0和1组成,由二进制码演化而成. 格雷码生成方法如下: 1位格雷码有两个码字 (n+1)位格雷码中的前2n个码字等于n位格雷码的码字,按顺序书写,加前缀0 (n+1)位格雷码中的后2n个码字等于n位格雷码的码字,按逆序书写,加前缀1 举例如下: 1位格雷码: 0 1 2位格雷码: 总共有2^2个码字,前一半的码字为1位的格雷码按顺序书写加前缀0,后一半的码字为1位格雷码逆序书写加前缀1

systemC构建格雷码和二进制的转换

废话不多说,直接上实现: simulus是gray码信号发生器的实现: simulus.h: include "base.h"    #ifndef SIMULUS  #define SIMULUS    const unsigned int size=4;    SC_MODULE(simulus){      //   signal drivers       sc_out<sc_uint<size> > gray ;            void prc

格雷码的产生方式以及其与二进制码的关系

格雷码也是一种可以用来计数的编码方式,它在加1的过程中只有一位发生变化,这样就可以简化硬件实现,因此许多速度传感器,绝对位置传感器等会采用格雷码计数. 此外由于给雷码的特性,一次变化过程只改变一位,相比普通二进制计数,加1后可能变化多位,更加安全.因此在数字电路的状态机的状态计数采用格雷更加安全,且易于实现. 格雷码可以按照如下方式产生 0  取镜像 0 加符号  00   取镜像  00   加符号 000  ..... 1              1              01    

连环锁 格雷码知识+大数

连环锁 题目抽象:某个格雷码到另一个格雷码最少需要的转换步数. 思路:直接求出对应得十进制,相减取绝对值. 当n=2时变换的序列为00,01,11,10 当n=3时变换的序列为000,001,011,010,110,111,101,100 …… 仔细观察发现这正是格雷码,相邻两个状态只有一位不同(实际上题目描述已经说了这个条件)! 十进制数 自然二进制数 格雷码 0 0000 0000 1 0001 0001 2 0010 0011 3 0011 0010 4 0100 0110 5 0101

HDU HDU 5375 Gray code(二进制和格雷码)

Description: The reflected binary code, also known as Gray code after Frank Gray, is a binary numeral system where two successive values differ in only onebit (binary digit). The reflected binary code was originally designed to prevent spurious outpu

格雷码的实现

问题:产生n位元的所有格雷码. 格雷码(Gray Code)是一个数列集合,每个数使用二进位来表示,假设使用n位元来表示每个数字,任两个数之间只有一个位元值不同. 例如以下为3位元的格雷码: 000 001 011 010 110 111 101 100 . 如果要产生n位元的格雷码,那么格雷码的个数为2^n. 假设原始的值从0开始,格雷码产生的规律是:第一步,改变最右边的位元值:第二步,改变右起第一个为1的位元的左边位元:第三步,第四步重复第一步和第二步,直到所有的格雷码产生完毕(换句话说,已

《FPGA全程进阶---实战演练》第十二章 二进制码与格雷码PK

大家在写程序的时候,可能会听闻,什么独热码,什么格雷码,什么二进制码等等,本节意在解释这几种编码之间的区别和优势以及用verilog怎么去实现,下面先介绍这几种编码的区别. 1 基础理论部分 1.1 独热码 独热码,在英文文献中称做 one-hot code, 直观来说就是有多少个状态就有多少比特,而且只有一个比特为1,其他全为0的一种码制. 如,有十六个状态的独热码状态编码应该是:0000000000000001,0000000000000010,0000000000000100,000000