格雷码(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为负),其余各位数表示其数值本身称为原码. 正数的反码等于原码,负数的反码是在原码的基础上,符号位不变,其余各位取反. 正数的补码等于原码,负数的补码 ...
随机推荐
- Bootstrap 和 LESS
Bootstrap 简介 什么是 Bootstrap? Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的 ...
- PHP Mysql类【转】
前几天没事在网上转发现了一个类,记录下来: <?php Class DB { private $link_id; private $handle; private $is_log; privat ...
- #module-django.db.models
Models A model is the single, definitive source of information about your data. It contains the esse ...
- 机器学习实验报告:利用3层神经网络对CIFAR-10图像数据库进行分类
PS:这是6月份时的一个结课项目,当时的想法就是把之前在Coursera ML课上实现过的对手写数字识别的方法迁移过来,但是最后的效果不太好… 2014年 6 月 一.实验概述 实验采用的是CIFAR ...
- 使用windows live writer 编辑博客日志
使用Windows Live Writer 编辑日志 一 意义 写博客日志是个需要坚持的好习惯.使用Windows Live Writer,能不受网页自带编辑器限制. Markdown支持.安装mar ...
- TortoiseSVN 的分支合并操作
今天对svn的分支合并有了兴趣,所以对新建了一个项目练练手. 在网上找了一篇文章做指导: http://www.open-open.com/lib/view/open1346982569725.htm ...
- 【转】近百个Android优秀开源项目
近百个Android优秀开源项目 Android开发又将带来新一轮热潮,很多开发者都投入到这个浪潮中去了,创造了许许多多相当优秀的应用.其中也有许许多多的开发者提供了应用开源项目,贡献出他们的智慧 ...
- BZOJ 3884 上帝与集合的正确用法
Description 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做"元". 第二天, 上帝创造了一个新的元素,称作&quo ...
- BZOJ 1208 宠物收养所
Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特 ...
- 简化 Django
http://www.oschina.net/translate/simplifying-django 尽管Django的流行和普及, 一些开发者仍然认为她是一个过时的web开发框架, 仅仅适合内容丰 ...