格雷码(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为负),其余各位数表示其数值本身称为原码. 正数的反码等于原码,负数的反码是在原码的基础上,符号位不变,其余各位取反. 正数的补码等于原码,负数的补码 ...
随机推荐
- Ubuntu软件包管理命令全面集锦
说明:由于图形化界面方法(如Add/Remove... 和Synaptic Package Manageer)比较简单,所以这里主要总结在终端通过命令行方式进行的软件包安装.卸载和删除的方法. 一.U ...
- BZOJ 3107 二进制a+b
Description 输入三个整数\(a, b, c\),把它们写成无前导\(0\)的二进制整数.比如\(a=7, b=6, c=9\),写成二进制为\(a=111, b=110, c=1001\) ...
- [BZOJ 1833] [ZJOI2010] count 数字计数 【数位DP】
题目链接:BZOJ - 1833 题目分析 数位DP .. 用 f[i][j][k] 表示第 i 位是 j 的 i 位数共有多少个数码 k . 然后差分询问...Get()中注意一下,如果固定了第 i ...
- ARM单片机的头文件如何用结构体定义地址
下面我们以ARM Cortex-M0内核单片机LPC1114的头文件lpc11xx.h文件进行说明. 1.先说两句 lpc11xx.h文件是lpc11xx系列单片机包含的头文件.这个文件的作用和51单 ...
- qt实现头像上传功能(朝十晚八的博客,一堆帖子)
http://www.cnblogs.com/swarmbees/p/5688885.html
- delphi 程序是否为控制台编译选项
http://www.birdol.com/article/tag/delphi 编译指令写在哪?: 编译指令可以写在代码页的任何地方, 不过在代码的不同区域有时也会不同; 譬如: {$APPTYPE ...
- bzoj2818
我们先穷举素数p然后令y>x 这样问题就是求这个gcd(x,y)=p (1<=x<y=n)不难发现必须y=kp k∈N* 当y=p时,易知个数为φ(1)当y=2p 个数为φ(2), ...
- asp.net 由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值
看MS给的解决方案:(http://support.microsoft.com/kb/312629/ ) 症状:如果使用 Response.End.Response.Redirect 或 Server ...
- hdu-4638-Group(树状数组)
题意 找到区间里有多少组连续数字串 分析: (转)思路:显然,我们要使得value最大,就要尽量将连续的ID分在一组,所以问题转化为求一个区间中连续ID区间的个数.我们从左往右扫描,依次考虑右端点为i ...
- vijosP1194 Domino
vijosP1194 Domino 链接:https://vijos.org/p/1194 [思路] 矩阵相乘. 参考Matrix67的文章: [代码] #include<cstdio> ...