FPGA学习笔记---二进制码、独热码、格雷码分析对比
在Verilog学习中常用的编码方式有二进制编码(Binary)、格雷码(Gray-code)编码、独热码(One-hot)编码,对于新手来说,搞不清楚编码为什么要分这么多格式?统一用一种格式不好吗?那么现在就来看看这三种编码的区别和应用。
先看看这三种编码的定义
二进制码
格雷码
独热码
下面看看十进制数0---7用三种编码如何表示
十进制数 |
二进制 |
独热码 |
格雷码 |
0 |
3’b000 |
8’b0000_0001 |
3’b000 |
1 |
3’b001 |
8’b0000_0010 |
3’b001 |
2 |
3’b010 |
8’b0000_0100 |
3’b011 |
3 |
3’b011 |
8’b0000_1000 |
3’b010 |
4 |
3’b100 |
8’b0001_0000 |
3’b110 |
5 |
3’b101 |
8’b0010_0000 |
3’b111 |
6 |
3’b110 |
8’b0100_0000 |
3’b101 |
7 |
3’b111 |
8’b1000_0000 |
3’b100 |
在Modelsim中显示波形如下:
展开二进制码波形
二进制码用3个bit可以表示出十进制数0---7,消耗的触发器比较少,每次数字变化时,状态位会出现多位同时变化。
展开独热码波形
独热码用8个bit来表示十进制数0---7,也就是说用一个bit的高电平来表示一个数字,每次数字发生变化时,状态位2位同时变化。
bit[0]为高电平代表数字1,bit1[1]为高电平代表数字2,bit[2]为高电平代表数字3,依次类推。
展开格雷码波形
格雷码用3个bit来表示十进制数0---7,每次数字发生变化时,状态位只有一位发生变化。
展开全部波形
下面分析一个这三种编码在数字变化时,状态变化情况。
二进制码
二进制码由001变化到010时,变化波形如下:
此时bit[1]由低电平变为高电平,bit[0]由高电平变为低电平。理想情况下bit[0]和bit[1]同时跳变,但是在实际电路中会存在延时,那么bit[0]和bit[1]跳变时有先后顺序,假如bit[0]由高电平变为低电平后,bit[1]延迟了一段时间才由低电平变为高电平。
那么在bit[1]延时的这点时间内,bit[0]和bit[1]就会同时为低电平,那么输出的数据就会变成3'b000,这个0在电路中就相当于一个毛刺。
假如bit[1]由低电平变为高电平后,bit[0]延时了一段时间才由高电平变为了低电平,那么在bit[0]延时的这段时间内,输出数据就会变成3'b011,如果系统响应速度非常快的话,那么在数字1到2跳变时,就会出现一次3。造成代码中的逻辑错误。
独热码
独热码数字由2、3变化时,bit[1]由高电平变为低电平,bit[2]由低电平变为高电平。
在由数字2变为数字3时,理想情况下bit[2]和bit[3]要同时变化,但是在实际电路中存在延时。bit[2]和bit[3]电平变化时会有先后顺序。
假如bit[2]由低电平变为高电平后,bit[1]延迟了一段时间才由高电平变为低电平。
这样在很短的一段时间内就会出现bit[1] 和bit[2]同时为高电平的情况,根据独热码的特点,为高电平时代表数据有效,那么在这段时间内说明数字2和3同时有效。如果系统反应速度比较快的话,就会导致逻辑上的错误。相当于电路中出现了毛刺。
格雷码
格雷码在数字变化时,相邻两个数字之间每次只会有一个bit位的电平发生改变
由图上可以看书,数字1、2、3变化时,每次只有一个bit的电平发生改变,这样在实际电路中,bit电平变化时就算存在延时,也不会出现在数字变化过程中出现其他数字,造成程序逻辑或者时序上的错误。也就是说格雷码可以避免电路产生毛刺。
通过上面对三种编码的分析,可以总结出这三种编码的优缺点。
二进制编码:
优点:属于压缩状态编码,使用的触发器位数少,可以直接比较大小和算术运算。
缺点:译码复杂;相邻状态变换时,多位发生改变,电噪声大,转换速度较慢,易出错;
独热码:
优点:状态比较时仅仅需要比较一个位,从而一定程度上简化了译码逻辑,译码简单,减少了毛刺产生的概率。
缺点:速度较慢,触发器资源占用较多,面积较大;
格雷码:
优点:属于压缩状态编码,使用的触发器位数少;相邻状态变换时,仅一位发生改变,电噪声小,转换速度较快;
缺点:译码复杂,没有固定大小,很难直接进行比较大小和算术运算,需要转换为自然二进制码来判断。
在实际应用中,根据自己系统情况,选择适合自己的编码方式。
FPGA学习笔记---二进制码、独热码、格雷码分析对比相关推荐
- 小梅哥FPGA学习笔记
小梅哥FPGA学习笔记 一.38译码器 功能: 译码器其任一时刻的稳态输出,仅仅与该时刻的输入变量的取值有关,它是一种多输入多输出的组合逻辑电路,负责将二进制代码翻译为特定的对象(如逻辑电平等).38 ...
- FPGA学习笔记(八):ASK调制解调的仿真
笔记八是ASK调制解调的仿真实现. ASK调制解调的实现原理:首先使用MATLAB产生存储基带波形的coe文件,再让ROM读取coe文件输出基带波形,然后DDS产生正弦波信号作为载波信号,接下来使用乘 ...
- FPGA学习笔记之Altera FPGA使用JIC文件配置固化教程
FPGA学习笔记之Altera FPGA使用JIC文件配置固化教程 很多做过单片机的朋友都知 道,我们在对MCU烧写完程序固件后,那么该程序固件就存储在了该MCU内部.即使MCU断电了再重新上电,程序 ...
- Ui学习笔记---EasyUI的EasyLoader组件源码分析
Ui学习笔记---EasyUI的EasyLoader组件源码分析 技术qq交流群:JavaDream:251572072 1.问题1:为什么只使用了dialog却加载了那么多的js http: ...
- FPGA学习笔记(七): DSB调制解调的仿真
笔记七是DSB调制解调的仿真实现. DSB调制解调的实现原理:首先使用DDS产生低频正弦波信号作为调制信号,再用DDS产生高频信号作为载波信号,然后使用乘法器将两者相乘产生DSB信号,DSB信号与载波 ...
- FPGA学习笔记(1)简单的时序逻辑电路——流水灯
FPGA学习笔记(1)简单的时序逻辑电路--流水灯 编程语言为Verilog HDL 原理 (1)设计一个计数器,使开发板上的4个LED状态每500ms翻转一次.开发板上的晶振输出时钟频率为50MHz ...
- FPGA学习笔记(八)同步/异步信号的打拍分析处理及亚稳态分析
系列文章目录 一.FPGA学习笔记(一)入门背景.软件及时钟约束 二.FPGA学习笔记(二)Verilog语法初步学习(语法篇1) 三.FPGA学习笔记(三) 流水灯入门FPGA设计流程 四.FPGA ...
- FPGA学习笔记_ROM核调用与调试
FPGA学习笔记 ROM核调用与调试 1. ROM存储器IP核的使用 2. 创建.mif文件 3. In system memory content editor内存查看工具的使用 4. Signal ...
- FPGA 学习笔记:Vivado 2020.2 MicroBlaze MIG 测试 DDR3 篇尾
FPGA 学习笔记:Vivado 2020.2 MicroBlaze MIG 测试 DDR3 篇一 FPGA 学习笔记:Vivado 2020.2 MicroBlaze MIG 测试 DDR3 篇二 ...
最新文章
- DotNetCore跨平台~System.DrawingCore部署Linux需要注意的
- IE再次曝出安全漏洞 微软表示正在调查
- Mybatis Generator的使用
- 软件项目经理需具备什么样的技术水平?
- 【NLP】词嵌入基础和Word2vec
- sublime text2快捷键
- java线程实现排序_【多线程实现快速排序】
- 用PD进行数据库建模经验总结
- Dubbo系列(1)_背景介绍和基本情况
- Ubuntu 10.04 安装在 VMware Workstation 7 后,键盘无反应的解决方法
- 发现了学XML最好的素材
- [纯前端]打造自己的ORK管理软件
- 三个数比较大小函数调用c语言,C语言程序系列第四弹–max函数判断三个数的大小...
- Ubuntu20.04代理设置
- java tibco client,TIBCO EMS 8.5.1 安裝 (Linux)
- 【latex】Latex文献报错 Something‘s wrong--perhaps a missing \item. \end{thebibliography}
- 张量(Tensor)的降维与升维
- 学习笔记:星火第一讲-使用Apollo 学习自动驾驶
- 【系统运维-Linux】使用U盘安装Linux
- 【MySQL】插入语句汇总
热门文章
- zend studio一些常用配置
- LAMP环境搭建过程中出现的问题——基于VM虚拟CentOS-5.6
- usage: git remote add [options] name url -f, --fetch fetch the remote branches ...
- Django之form组件is_valid校验机制
- C语言原码、反码、补码
- spring cloud 学习(6) - zuul 微服务网关
- Struts(十四):通用标签-form表单
- WPF 浏览文件夹,获取其路径
- c#与获得文件夹路径,站点目录
- Linq lambda表达式经验总结