《FPGA全程进阶---实战演练》第十二章 二进制码与格雷码PK

来源:互联网 时间:2016-01-17

  大家在写程序的时候,可能会听闻,什么独热码,什么格雷码,什么二进制码等等,本节意在解释这几种编码之间的区别和优势以及用verilog怎么去实现,下面先介绍这几种编码的区别。

1 基础理论部分

1.1 独热码

  独热码,在英文文献中称做 one-hot code, 直观来说就是有多少个状态就有多少比特,而且只有一个比特为1,其他全为0的一种码制。

  如,有十六个状态的独热码状态编码应该是:0000000000000001,0000000000000010,0000000000000100,0000000000001000,0000000000010000,0000000000100000 ,……,10000000000000000。但是通常我们为了方便书写,将二进制简化为十六进制表示(从右往左每四位二进制位用一位十六进制数表示),那么,以上十六状态的独热码可以表示成0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, ……, 0x8000。

1.2 格雷码

  在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码。

1.3 二进制码

  二进制代码:由两个基本字符'0'、'1'组成的代码。其中,码元:"一位"二进制代码。码字:N个码元可以组成的不同组合,任意一个组合称一个码字。

1.4 二进制编和格雷码利弊

  二进制编码、格雷码编码使用最少的触发器,消耗较多的组合逻辑,而独热码编码反之。独热码编码的最大优势在于状态比较时仅仅需要比较一个位,从而一定程度上简化了译码逻辑。虽然在需要表示同样的状态数时,独热编码占用较多的位,也就是消耗较多的触发器,但这些额外触发器占用的面积可与译码电路省下来的面积相抵消。

  由于CPLD更多地提供组合逻辑资源,而FPGA更多地提供触发器资源,所以CPLD多使用gray-code,而FPGA多使用one-hot编码。另一方面,对于小型设计使用gray-code和binary编码更有效,而大型状态机使用one-hot更高效。

  关于独热码,我们在使用状态机的时候,会详细解释。为了更进一步说明二进制码和格雷码之间的关系,可以查看下图12.1。

方法一:

图12.1 二进制码与独热码

  上述的方法可以称为递归法,从0~7的高位都是0,后8~15的高位都是1,那么由二进制怎么去实现格雷码,如下图12.2所示。

方法二:适合于编程实现

图12.2 计算格式

  也即对原位进行移位,然后和原位进行求抑或操作。

  那么格雷码怎么去实现二进制呢?且看下图12.3解释:

图12.3

  由上图可以分析得出,最高位是保持不变的,然后以后每一位都要和前几位进行求异或操作。下面我们就用verilog来实现。

2 Verilog代码实现部分

2.1 二进制转格雷码

讲解最重要的代码部分,如图12.4

图12.4 代码实现部分

  最重要的代码一行搞定。请大家看懂。

2.2 格雷码转二进制

  让大家感受一下FPGA的并行的魅力,重要代码如图12.5所示,利用FPGA的并行加速,可以实现其他CPU不能比拟的速度。

图12.5 转换实现部分

3 Modelsim仿真部分

  部分重要代码如图12.6所示

图12.6 仿真程序

  将输入数据封装成一个任务,然后在initial中直接调用任务即可,但要注意,data_init为输入数据的初始化,一定要放在task_reset复位信号的前面,这一点不容忽视。

图12.7为binary2gray仿真的波形。

图12.7 仿真波形

  关于板级仿真,大家可以去利用四位LED或者数码管去实现,这里不再赘述。

  图12.8为testbench代码部分,gray2binary

图12.8 代码实现部分

图12.9为gray2binary仿真的波形

图12.9 仿真波形

相关阅读:
Top