格雷码(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为负),其余各位数表示其数值本身称为原码. 正数的反码等于原码,负数的反码是在原码的基础上,符号位不变,其余各位取反. 正数的补码等于原码,负数的补码 ...
随机推荐
- 在Adobe Reader中保存PDF表单数据的方法
通常,Adobe Reader 用户填写表单后,是无法保存所填表单的副本的.但是,对于 Reader 8 和更高版本的用户,您可以扩展其权限,使他们可以完成此操作.如果您使用的是 Acrobat Pr ...
- 解读为什么有符号的char可表示范围是-128~+127
问:为什么有符号的char可表示范围是-128~+127? 要明白这个问题,首先要明白一下几点: 对于char和int计算机中以补码形式存在. 严格来说计算机就是傻逼,它只知道某个位上是0还是1. 我 ...
- 练习2 A - ASCII码排序
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description 输入三 ...
- A题 - A + B Problem
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description Cal ...
- iOS开发-网络框架-b
网络框架(以下称NJAFNetworking)是基于AFNetworking框架的简单封装,基本功能包括POST请求,GET请求,上传文件,下载文件,网络状态,缓存等. 为什么要使用NJAFNetwo ...
- hadoop各版本下载
http://hadoop.apache.org/ Download Hadoop from the release page. http://hadoop.apache.org/releases.h ...
- [BZOJ 2007] [Noi2010] 海拔 【平面图最小割(对偶图最短路)】
题目链接:BZOJ - 2007 题目分析 首先,左上角的高度是 0 ,右下角的高度是 1.那么所有点的高度一定要在 0 与 1 之间.然而选取 [0, 1] 的任何一个实数,都可以用整数 0 或 1 ...
- AltiumDesigner导入AutoCAD文件DXF,DWG格式
最近有个朋友给了个AutoCAD的文件,需要我画个板子,结构什么的参见AutoCAD的文件,百度了下,得知protel是可以导入AutoCAD的DXF,DWG格式的文件的,那么AltiumDesign ...
- autotrace显示Statistics很多信息为0(转)
一朋友使用autotrace查看数据库执行计划发现结果如下,Statistics中很多信息为0,这个肯定是不正常现象,什么都可以为0,consistent gets也不可能为0. SQL> se ...
- mangos搭建
github地址:https://github.com/mangos/MaNGOS MaNGOS 是( Massive Network Game Object Server) 的缩写.由于暴雪公司对类 ...