FPGA 设计算法篇 —— 格雷码编解码原理及实现

前言:在这篇文章中FPGA 设计时序篇 —— 跨时钟域问题及解决方法提到格雷码在跨时钟域的应用,本篇作为对该篇文章的补充,详细介绍格雷码的编解码原理及语法实现。

一、格雷码简介

格雷码,即 Gray code。由于自然二进制码在相邻数据之间可能存在多个bit的变化,比如8和7对应的4bit二进制码分别为:1000,0111,当寄存器的输出在这两个数据简跳转的时候,寄存器的每一位都会发生变化,从而造成不稳定态。

为了解决上面的问题,出现了格雷码编码规则。在格雷码中,所有相邻两数据的二进制表示中只有一位不同。下表为 4bit 自然二进制码,格雷码对应关系。

十进制二进制格雷码
000000000
100010001
200100011
300110010
401000110
501010111
601100101
701110100
810001100
910011101
1010101111
1110111110
1211001010
1311011011
1411101001
1511111000

二、格雷码编、解码方法

1.编码:将自然二进制码转化为格雷码。方法是从自然二进制码的最低位起,将每一bit位 与 左边bit位进行异或运算,最高位不变,公式如下:在这里插入图片描述

2.解码:将格雷码转化为自然二进制码。方法是从格雷码的左边第二位起,将每一bit位 与 左边解码后的bit位进行异或运算,最高位不变,公式如下:
在这里插入图片描述
三、格雷码语法实现

原理方法如上述,但怎样才能在语法中快速实现呢?

1.首先看编码,实际也就是将自然二进制码A向右移一位变成B(右移后高位补0),再将A与B进行以异或运算,而异或运算在FPGA中是最基本的运算,非常容易实现。

接下来分析一下:右移后最高位是否能实现算法。前面提到,编码时最高位保持不变,B的最高位现在为0,当A的最高位为0时,0与0异或的结果为0,满足最高位保持不变;当A的最高位为1时,1与0异或的结果为1,满足最高位保持不变。

奈斯!

代码如下:

module Bin2Gray
#(	parameter DataWidth = 4
)
(	input  [DataWidth-10] iBinary,
	output [DataWidth-10] oGraycode
);

assign oGraycode = (iBinary >> 1) ^ iBinary;

endmodule

2.接着看解码

module Bin2Gray
#(	parameter DataWidth = 8
)
(	input  [DataWidth-10] iGraycode,
	output [DataWidth-10] oBinary
);

assign oBinary = {	 iGraycode[7],
					^iGraycode[7:6],
					^iGraycode[7:5],
					^iGraycode[7:4],
					^iGraycode[7:3],
					^iGraycode[7:2],
					^iGraycode[7:1],
					^iGraycode[7:0],
};

endmodule

这里牵涉到一元约简运算,需要注意下。

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值