verilog状态机以及编码详解
在Verilog中最常用的编码方式有:
1、二进制编码(Binary)
2、格雷码(Gray-code)编码
3、独热码(One-hot)编码
二进制码和格雷码是压缩状态编码。
若使用格雷编码,则相邻状态转换时只有一个状态位发生翻转,这样不仅能消除状态转换时由多条状态信号线的传输延迟所造成的毛刺,又可以降低功耗。
二进制编码也可称连续编码,也就是码元值的大小是连续变化的。
如S0=3'd0,S1=3'd1,S2=3'd2,S3=3'd3....
格雷码的相邻码元值间只有一位是不同的,如S0=3'b000,S1=3'b001,S2=3'b011,S3=3'b010....
独热编码即 One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候,其中只有一位有效。
虽然使用较多的触发器,但由于状态译码简单,可减少组合逻辑且速度较快, 这种编码方式还易于修改,增加状态或改变状态转换条件都可以在不影响状态机的其它部分的情况下很方便地实现。另外,它的速度独立于状态数量。与之相比,压缩状态编码在状态增加时速度会明显下降。
独热码值每个码元值只有一位是'1',其他位都是'0',如S0=3'b001,S1=3'b010,S2=3'b100
二进制编码、格雷码编码使用最少的触发器,消耗较多的组合逻辑,而独热码编码反之。独热码编码的最大优势在于状态比较时仅仅需要比较一个位,从而一定程度上简化了译码逻辑。虽然在需要表示同样的状态数时,独热编码占用较多的位,也就是消耗较多的触发器,但这些额外触发器占用的面积可与译码电路省下来的面积相抵消。
为了进一步提高独热编码的速度,可以使用并行 CASE语句"即在case(1‘b1) 后添加综合器可以辨认的并行CASE注释语句。注意:并行CASE 只推荐在独热编码时使用,在二进制编码和格雷编码时使用有时反而会增大面积降低速度。
在CPLD中,由于器件拥有较多的地提供组合逻辑资源,所以CPLD多使用二进制编码或格雷码,而FPGA更多地提供触发器资源,所以在FPGA中多使用独热码编码。当然,这并不是说在FPGA中就非得用独热编码,在CPLD中不能用独热编码,一般的,对于小型设计(状态数小于4)使用二进制编码,当状态数处于4-24之间时,宜采用独热码编码,而大型状态机(状态数大于24)使用格雷码更高效。
在设计状态机时有几种状态编码方法:二进制,格雷码(gray)和独热码(one hot code)。他们各有各的优点
独热 格雷 二进制
4'b0001 2'b00 2‘b00
4'b0010 2'b01 2’b01
4'b0100 2'b11 2‘b10
4'b1000 2'b10 2’b11
one hot,独热嘛,一看就明白,就是只有一位是高电平。独热码 使用的触发器较多,但可减少实现状态机的组合逻辑数目,减少复杂性,提高系统的速度,即工作时钟频率可以做到最高。格雷码是使用最小数目的触发器来编码状态机,但形成的组合逻辑比较复杂。使用独热码编码时,会出现很多未使用的状态,而使用二进制编码和格雷码编码时,如果状态机的状态数不是2的指数次方时,也会出现未使用状态。格雷码每个相邻的状态切换只有一个bit的信号跳变,适用于异步握手的情况,比如异步FIFO的指针计数。
这个是参考别人的内容
在数字逻辑设计中最常用的有三种编码方式:二进制,格雷码 Gray,独热编码One-hot One hot
编码使用一组码元,每一个码元仅有1bit有效,例如
IDLE = 0001,
WRITE = 0010,
READ = 0100,
WAIT = 1000
这种编码的译码部分可以最简,因此可以总结出One-hot编码的特点:
组合逻辑最少,触发器最多,工作时钟频率可以做到最高。
FPGA的一个最小结构单元(CLB/LE)中含有查找表(实现组合逻辑)和DFF(实现时序逻辑),布局布线最好的结果是同一个结构单元中的查找表和DFF都使用,但是大部分情况是仅使用其中一种资源,这样另外的资源就是闲置而浪费。而CPLD中DFF资源本来就很少,由此可见One-hot编码更适合于FPGA设计,而不适合CPLD设计,在CPLD中应该选择二进制编码。
IC设计中,应该综合考虑。因为One-hot编码使用DFF会大大增加设计面积(die
size),因此在时序可以满足的条件下尽可能使用二进制编码。就面积与速度的折中考虑来说Gray码是最好的选择,当然Gray码还有其他很多好的特性,暂时不属于这次讨论的范畴。一般的综合工具对状态机进行综合时都可以让用户对这三种编码进行选择。基本依据就以上所说
verilog状态机以及编码详解相关推荐
- Python字符编码详解
Python字符编码详解 转自http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html Python字符编码详解 本文简单介绍了各种常用的 ...
- 数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C++模板实现
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...
- (38)System Verilog类class复制详解
(38)System Verilog类class复制详解 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog类class复制详解 5)结语 ...
- (34)System Verilog类的多对象详解
(34)System Verilog类的多对象详解 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog类的多对象详解 5)结语 1.2 F ...
- (35)System Verilog类静态变量详解
(35)System Verilog类静态变量详解 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog类静态变量详解 5)结语 1.2 F ...
- (17)System Verilog枚举类型enum详解
(17)System Verilog枚举类型enum详解 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog枚举类型enum详解 5)结语 ...
- (15)System Verilog结构体struct详解
(15)System Verilog结构体struct详解 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog结构体struct详解 5) ...
- 字符、字符集和字符编码详解(一文扫清疑惑)
前言 字符.字符集和字符编码时常看见,之前也看过一些博文,看得迷迷糊糊地,看过即忘,今天有幸碰到一篇能让我醍醐灌顶的文章,整理一下相关知识点与大家分享! 原博文地址:字符集编码详解(学习,看一篇就够了 ...
- 字符编码详解及由来(UNICODE,UTF-8,GBK)
字符编码详解及由来(UNICODE,UTF-8,GBK) 各种字符编码方式详解及由来(ANSI,UNICODE,UTF-8,GB2312,GBK) - 2009-01-29 09:53 一直对 ...
最新文章
- ui产品小结 - 包含小程序 前端等
- 一些有用的ABAP程序和函数组
- linux修改mysql默认大小写配置,linux下设置mysql不区分大小写
- 在Java 7中处理文件
- 对xml操作的主要方法[轉]
- 云服务器预装什么系统好,云服务器预装什么系统好
- C++按键模拟/刷屏器
- c语言 求圆周长 圆面积 圆球表面积 圆球体积 圆柱体积
- 程序员的奋斗史(三十三)——人在囧途之应聘篇(三)
- 前端的性能优化-笔记
- FPGA 名词解释(FPGA WORD EXPLANATION )
- 在移动硬盘上装双系统(一个Ventory+微PE,一个Win10家庭版)
- 解决vue3-print-nb打印二维码定位(qrcode.vue) 问题
- 年度新旗舰南卡Runner Pro4骨传导耳机评测,解放双耳,运动不设限
- 【Houdini】使用Houdini的Karma渲染器渲染流体
- 一个关于计算分批进货按照先进先出规则的商品成本统计算法(js版本)
- COMSOL初级学习之一
- 重定向和转发的区别+使用情景
- [Hox库状态管理思考 二] 类实现组件的数据订阅
- 机器学习和数据比赛资料汇总(转载)
热门文章
- 什么叫pmt测试分析_圆偏振发光光谱仪——南方科技大学分析测试中心设备介绍第51期...
- python引入redis_实操演练解读非关系型数据库—Redis
- 银行家算法检测死锁c语言,[算法]操作系统进程调度与通信算法 Dijkstra银行家算法 C语言实现 | 李大仁博客...
- 仿京东显示隐藏密码明文案例(字体图标实现)
- 2018CCPC网络赛
- angularJs的spa页面切换以及ngRoute模块
- 函数宏定义 与函数自定义
- C++练习题(数组1)
- bzoj 4818: [Sdoi2017]序列计数(DP+矩阵快速幂)
- opencv 创建调色板