verilog实现二进制和格雷码互转实现二进制和格雷码互转
最近在看数电,看到了格雷码,阎石那本书介绍转换方法为:每一位的状态变化都按一定的顺序循环。不理
解,然后在网上搜了下,蛮多人写怎么转换的。然后发现John的《数字设计原理与实践》(原书第四版)中讲
了两个方法特别实用。
1.什么是格雷码?
对于做FPGA的来说,格雷码一般是用来定义状态机,有什么优势,我前面写的FSM中需注意事项一文中有提到。格雷码的特
点:相邻的两个数之间只有一位不同。这就是格雷码存在的意义。
2.转换方法
二进制转为格雷码方法有两个:方法1比较适用于笔试,考试等;方法二适用于代码编程,主要是为了做课程设计这类的。
方法一:递归法,我喊作:顺序逆序递归法
1. 1位格雷码有2个码字:0和1
2. (n+1)位格雷码中的前2^n(2的N次方)个字码等于n位格雷码的码字,按顺序书写,加前缀0.
3. (n+1)位格雷码中的后2^n(2的N次方)个字码等于n位格雷码的码字,但按逆序书写,加前缀1.
解释说明:
之所以称此方法为递归,是因为对于任意位的二进制的格雷码最终都将归结于1位二进制的格雷码的求解。上图就是根据已知
的3bit二进制的格雷码,求4bit二进制的格雷码,此时的n为3,所以2^3=8,所以0-7 的格雷码为0+3bit格雷,8-15的格雷码为
1+逆序3bit格雷码。
方法二:向左异或法
1. 对n位二进制或格雷码的码字,将数位从右到左,从0到n-1编码。
2. 如果二进制码字的第i位和第i+1位相同,则对应的格雷码码字的第i位为0,否则为1.
(当i+1=n,二进制码字的第n位被认为是0)
解释说明:
就那四位二进制数4'b0010举例,二进制第0位为0,第1位为1,异或结果为1,所以格雷码的第0位为1;二进制第1位为1,第
2位为0,异或为1,所以格雷码的第1位为1;二进制第2位为0,第3位为0,异或为0,所以格雷码的第2位为0;二进制的第3
位为0,二进制没有第4位,所以第4位默认为0,异或为0,所以格雷码第3位为0。。。结果4'b0010的格雷码为0011。
verilog代码实现:
//pro : binary to gray
//data: 2014-04-23 kb129
//info: this is a pro exe that change the binary data to gray
module binary_gray(
binary,
gray