《FPGA全程进阶---实战演练》第十二章 二进制码与格雷码PK
大家在写程序的时候,可能会听闻,什么独热码,什么格雷码,什么二进制码等等,本节意在解释这几种编码之间的区别和优势以及用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 仿真波形
《FPGA全程进阶---实战演练》第十二章 二进制码与格雷码PK的更多相关文章
- 《FPGA全程进阶---实战演练》第四章之实验平台软硬件使用简介
本章主要是讲解读者在进行FPGA逻辑设计之前的准备工作,需要下载Quartus II软件和 Modelsim 软件,一个是用来进行FPGA逻辑设计,一个是用来对逻辑进行理论分析与验证. 1.1 qua ...
- 《FPGA全程进阶---实战演练》第五章 基于74HC595的LED操作
1基础理论部分 1.1分频 分频,是的,这个概念也很重要.分频是指将一单一频率信号的频率降低为原来的1/N,就叫N分频.实现分频的电路或装置称为“分频器”,如把33MHZ的信号2分频得到16.5MHZ ...
- 《FPGA全程进阶---实战演练》第二十一章 细说低速与高速电路设计之电阻 电容 电感 磁珠
1.1 什么是高速电路 信号的最高频率成分是取决于有效频率,而不是周期频率. 高速电路的定义是根据信号的有效频率来计算的,在现实世界中,任何信号都是由多个频率分量的正弦波叠加而成的.定义各正弦波分 ...
- 《FPGA全程进阶---实战演练》第十一章 VGA五彩缤纷
1基础理论部分 VGA(video graphics array)即视频图形阵列,是IBM在1987年随PS/2一起推出的使用模拟信号的一种视频传输标准.VGA相比与现在的视频传输接口来说已经过时,不 ...
- 《FPGA全程进阶---实战演练》第四章之Quartus II使用技巧
技巧1:“新”技能 hierarchies警告寻找 在编译之后,警告中“hierarchies”这个单词大家估计都很熟悉了,一看到这个警告,基本上就是例化时出现的问题.一般例化时,要是哪个连线没引出, ...
- 《FPGA全程进阶---实战演练》第二十一章 电源常用类型:LDO和 DCDC
高速电路中的电源设计 高速电路中的电源设计大概分为两种,一种是集总式架构,一种是分布式架构.集总式架构就是由一个电源输入,然后生成多种所需要的电压.如图1所示.这种架构会增加多个DC/DC模块,这样成 ...
- 《FPGA全程进阶---实战演练》第七章 让按键恢复平静
1基础理论部分 A:“怎么按键按下去之后,结果不正常?”,B:“按键你消抖了吗?”A:“消什么抖,还要消抖?”, B:“先检测按键变化,然后消抖过滤波动信号,最后输出稳定信号”,A:“我好像漏掉了什 ...
- 《FPGA全程进阶---实战演练》第二十一章之 几种常用电平分析及特性
TTL,CMOS以及LVTTL,LVCMOS TTL和CMOS是数字电路中两种常见的逻辑电平,LVTTL和LVCMOS是两者低电平版本.TTL是流控器件,输入电阻小,TTL电平器件速度快,驱动能力大, ...
- 《FPGA全程进阶---实战演练》第三章之PCB叠层
1.双面板 在双层板设计layout时,最好不要不成梳状结构,因为这样构成的电路,回路面积较大,但是只要对较重要的信号加以地保护,布线完成之后将空的地方敷上地铜皮,并在多个过孔将两个地连接起来,可以弥 ...
随机推荐
- iOS求职之C语言面试题
1.static有什么用途?(请至少说明两种) 1)限制变量的作用域 2)设置变量的存储域(堆,主动分配内存也是堆) 1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变. 2) ...
- [jk]服务器远控卡及kvm切换器
远控卡的需求 经常我们有这么一个需求,那就是某一台器服务器突然宕机,不能启动,而机房却在外地.解决这个问题的方法有两种,一是联系机房人员,二是通过idrac卡远程连接.我们必须根据事情的轻重缓急,来选 ...
- webBrowser获取取Cookie不全的解决方法
//取当前webBrowser登录后的Cookie值 [DllImport("wininet.dll", CharSet = CharSet.Auto, Set ...
- 真机提示Undefinedsymbolsforarchitecturearm64
转自:http://www.haodaima.net/art/2830860 iOS程序模拟器手机运行都正常,archiving出错:Undefined symbols for architectur ...
- android应用开发-从设计到实现 3-3 Sketch静态原型设计
Sketch静态原型设计 对于静态原型的设计,我们使用Sketch. 启动Sketch后,我们将看到相似例如以下的界面, 工具栏 它的顶部是工具栏, 能够通过菜单条View -> Customi ...
- 如何使用KVM 虚拟机安装RHEL7系统
KVM(基于内核的虚拟机)是标准的RHEL内核中内置的完整的虚拟化解决方案.它可以运行多款未经修改的Windows和Linux虚拟客户机操作系统.RHEL中的KVM系统管理程序通过libvirtAPI ...
- 【SimpleMsgPack.NET】发布一个msgpack协议C#版本的解析开源库
这两年一直都关注这IOCP在网络通信这方面的应用,当然数据的传递是经常需要的.今年接触了MsgPack格式,发现他用来做传输时数据打包真是太爽了.因为他可以直接打包二进制数据,不需要任何的转换.有人会 ...
- Unique constraint on single String column with GreenDao
转:http://stackoverflow.com/questions/22070281/greendao-support-for-unique-constraint-on-multiple-col ...
- 【转】Linux mysql停止失败的解决办法 Stopping MySQL database server mysqld [fail]
root@ubuntu:/# /etc/init.d/mysql stop * Stopping MySQL database server mysqld [fail] root@ubuntu:/# ...
- java中的数据结构[copy]
转自http://developer.51cto.com/art/201107/273003.htm java版数据结构与算法,希望对你有帮助. 线性表,链表,哈希表是常用的数据结构,在进行Java开 ...