格雷码(Gray Code)转二进制码(Binary Code)
学习verilog generate语句时,偶然看到用generate语句来进行格雷码到二进制码转换的代码,就从网上找了一些案例来学习。
下表为几种自然二进制码与格雷码的对照表:
| 十进制数 | 自然二进制数 | 格雷码 | 十进制数 | 自然二进制数 | 格雷码 |
| 0 | 0000 | 0000 | 8 | 1000 | 1100 |
| 1 | 0001 | 0001 | 9 | 1001 | 1101 |
| 2 | 0010 | 0011 | 10 | 1010 | 1111 |
| 3 | 0011 | 0010 | 11 | 1011 | 1110 |
| 4 | 0100 | 0110 | 12 | 1100 | 1010 |
| 5 | 0101 | 0111 | 13 | 1101 | 1011 |
| 6 | 0110 | 0101 | 14 | 1110 | 1001 |
| 7 | 0111 | 0100 | 15 | 1111 | 1000 |
格雷码转换为二进制码算法有以下几种表述形式:
表述一:
二进制格雷码为Gn-1Gn-2...G2G1G0
对应的自然二进制码为Bn-1Bn-2...B2B1B0
其中:最高位保留—Bn-1=Gn-1
其他各位—Bi-1=Gi-1 xor Bi ,i=1,2,...,n-1
表述二:
Bi = ˆG[n-1:i]=G[n-1]ˆG[n-2]ˆ..ˆG[i],i=0,1,...,n-1
表述三:
Bi = ˆ(G>>i),i=0,1,...,n-1
表述一的仿真实例:
源代码:
//http://www.cnblogs.com/adamite/archive/2008/10/20/1314949.html
//example2
module GrayToBinary2 (binarycode, graycode);
parameter n = ; // this module is parameterizable
output reg [n-:] binarycode;
input [n-:] graycode;
integer i;
always @ (graycode)
begin
binarycode[n-]=graycode[n-];
for(i=;i<=n-;i=i+)
binarycode[i-]=graycode[i-] ^ binarycode[i];//比较节省空间
end
endmodule
测试代码:
`timescale 1ns/1ns
module tb_GrayToBinary2; reg [:] gray;
wire [:] bin; GrayToBinary2 dut (bin,gray); initial begin
gray = 'h0;
#;
gray = 'h1;
#;
gray = 'h2;
#;
gray = 'h3;
#;
gray = 'he;
#;
gray = 'h7;
#;
gray = 'hf;
end
endmodule
仿真结果:

modelsim生成的原理图(注意要在vsim后面加上-debugDB选项)

从仿真结果来看,格雷码转二进制码过程中出现错误。开始两次转换出现不定态,而且后面的转换结果也是错误的。是什么原因呢?从算法上看,格雷码的最高位给了二进制码的最高位,这没问题。但是接下来的for循环,从二进制的最低bit位开始,即B0=G0 xor B1 ,i=1,2,...,n-1。此时G0是确定的值,但是B1还未计算出来,是不定值x,因此二者异或结果为不定值x,其他bit以此类推。从modelsim生成的原理图也能看出来,二进制码的次态输出除了取决于格雷码的现态值,还依赖于二进制码的现态值。
将上述算法进行修改,for循环从高bit为开始,结果如下。
表述一修改后的仿真实例:
源代码:
//http://www.cnblogs.com/adamite/archive/2008/10/20/1314949.html
//example2
module GrayToBinary2ex (binarycode, graycode);
parameter n = ; // this module is parameterizable
output reg [n-:] binarycode;
input [n-:] graycode;
integer i;
always @ (graycode)
begin
binarycode[n-]=graycode[n-];
// for(i=1;i<=n-1;i=i+1)
// binarycode[i-1]=graycode[i-1] ^ binarycode[i];//比较节省空间
for(i=n-;i>;i=i-)
binarycode[i-]=graycode[i-] ^ binarycode[i];//比较节省空间
end
endmodule
测试代码:
`timescale 1ns/1ns
module tb_GrayToBinary2ex; reg [:] gray;
wire [:] bin; GrayToBinary2ex dut (bin,gray); initial begin
gray = 'h0;
#;
gray = 'h1;
#;
gray = 'h2;
#;
gray = 'h3;
#;
gray = 'he;
#;
gray = 'h7;
#;
gray = 'hf;
end
endmodule
仿真结果:

modelsim生成的原理图(注意要在vsim后面加上-debugDB选项)

表述二的仿真实例:
源代码:
// Verilog LRM 1364-2005.pdf P184
module gray2bin (bin, gray);
parameter SIZE = ; // this module is parameterizable
output [SIZE-:] bin;
input [SIZE-:] gray; genvar i;
generate
for (i=; i<SIZE; i=i+) begin:bit
assign bin[i] = ^gray[SIZE-:i];
// i refers to the implicitly defined localparam whose
// value in each instance of the generate block is
// the value of the genvar when it was elaborated.
end
endgenerate
endmodule
测试代码:
`timescale 1ns/1ns
module tb_gray2bin; reg [:] gray;
wire [:] bin; gray2bin dut (bin,gray); initial begin
gray = 'h0;
#;
gray = 'h1;
#;
gray = 'h2;
#;
gray = 'h3;
#;
gray = 'he;
#;
gray = 'h7;
#;
gray = 'hf;
end
endmodule
仿真结果:
modelsim生成的原理图(注意要在vsim后面加上-debugDB选项)

表述三的仿真实例:
源代码:
//http://www.cnblogs.com/adamite/archive/2008/10/20/1314949.html
//example1
module GrayToBinary1 (binarycode, graycode);
parameter n = ; // this module is parameterizable
output reg [n-:] binarycode;
input [n-:] graycode;
integer i;
always @ (graycode)
begin
for(i=;i<=n-;i=i+)
binarycode[i]=^(graycode>>i);//比较浪费空间
end
endmodule
测试代码:
`timescale 1ns/1ns
module tb_GrayToBinary1; reg [:] gray;
wire [:] bin; GrayToBinary1 dut (bin,gray); initial begin
gray = 'h0;
#;
gray = 'h1;
#;
gray = 'h2;
#;
gray = 'h3;
#;
gray = 'he;
#;
gray = 'h7;
#;
gray = 'hf;
end
endmodule
仿真结果:

modelsim生成的原理图(注意要在vsim后面加上-debugDB选项)

格雷码(Gray Code)转二进制码(Binary Code)的更多相关文章
- 格雷码Gray Code详解
格雷码简介 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码.格 ...
- 格雷码(Gray code)仿真
作者:桂. 时间:2018-05-12 16:25:02 链接:http://www.cnblogs.com/xingshansi/p/9029081.html 前言 FIFO中的计数用的是格雷码, ...
- LeetCode:Gray Code(格雷码)
题目链接 The gray code is a binary numeral system where two successive values differ in only one bit. Gi ...
- 用硬件(Verilog)实现二进制码和格雷码的转换
格雷码(Gray code)是1880年由法国工程师Jean-Maurice-Emlle Baudot发明的一种编码,是一种绝对编码方式,典型格雷码是一种具有反射特性和循环特性的单步自补码,它的循环. ...
- 构建n位元的格雷码
二进制格雷码的生成 1.什么是格雷码 Gray Code是一个数列集合,每个数使用二进制来表示,假设使用n位元来表示每个数字,那么任两个数之间只有一个位元值不同.log2(16)=4 例如: 生成4位 ...
- 产生n位元的所有格雷码
原文链接:http://blog.csdn.net/beiyeqingteng/article/details/7044471 问题:产生n位元的所有格雷码. 格雷码(Gray Code)是一个数列集 ...
- 解题(GeLeiMa -生成格雷码)
题目描述 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同, 则称这种编码为格雷码(Gray Code),请编写一个函数,使用递归的方法生成N位的格雷码. 给定一个整数n,请返回n位的格雷码 ...
- 格雷码C++递归实现
昨天参加腾讯的笔试,结果答的一塌糊涂,大题第一题是关于格雷码的递归实现的,当时没写出来,今天查了下资料试着用C++实现一下. #include <iostream> #include &l ...
- 原码、反码、补码、BCD码、格雷码
二进制的最高位表示这个二进制的正负符号(0为正,1为负),其余各位数表示其数值本身称为原码. 正数的反码等于原码,负数的反码是在原码的基础上,符号位不变,其余各位取反. 正数的补码等于原码,负数的补码 ...
随机推荐
- python unicode&str 转化
从数据库中取出的值是Unicode编码的 需要转化为str才能正常使用 参考: http://www.mamicode.com/info-detail-308445.html
- Python学习 - 编写一个简单的web框架(一)
自己动手写一个web框架,因为我是菜鸟,对于python的一些内建函数不是清楚,所以在写这篇文章之前需要一些python和WSGI的预备知识,这是一系列文章.这一篇只实现了如何处理url. 参考这篇文 ...
- centos es2.x安装
#把下面这个放到es的server路径下,这个是rpm安装改了下. # # init.d / servicectl compatibility (openSUSE) # if [ -f /etc/rc ...
- linux主要目录的作用
手动敲一遍.算是加强记忆吧~ /:文件系统的入口,也是最高一级的目录 /bin:最基本的且着急用户和普通用户都可以使用的命令放在此目录下,如:ls.cp等 /boot:存放Linux的内核及引导系统所 ...
- Solr4.6从数据库导数据的步骤
http://blog.csdn.net/bruce128/article/details/17796705 Solr4.6有从数据库导数据的功能.导入步骤如下: 1.将下载下来的solr4.6的di ...
- Dollars
uva147: 题意:给你几种钱币,在给你一个钱的数目,问有多少种用这些钱来组成这个数目. 题解:完全背包,不过此时要把钱的数目*100,因为是小数,背包的容量都是整数,然后dp,求出每个容量的数目即 ...
- java中的string字符串中的trim函数的作用
去掉字符串首尾空格 防止不必要的空格导致错误public class test{ public static void main(String[] args) { String str = " ...
- dt dd 如何在同一行上
<style> dl{clear:left;} dt,dd{float:left;} </style> <dl> <dt>test </dt> ...
- iTerm2 + oh my zsh代替mac自带的bash shell
使用Solarized dark配色方案 需要字体menlo for powerline oh-my-zsh主题使用agnoster,这个主题默认的路径是全路径,当路径很长的时候,就会占很长的空间,可 ...
- iOS 沙盒路径操作:新建/删除文件和文件夹
http://blog.csdn.net/totogo2010/article/details/7671144