tag 标签: 独热码

相关博文
  • 热度 32
    2016-5-12 20:11
    1708 次阅读|
    0 个评论
             了解一下状态机中"状态"的各种编码,我们都知道每一个状态需要一个二进制表示,但是状态之间的关系如何,到底该选用"原码""Gray码""独热码"还是好多好多别的码呢.....^^          下面是我自己搜集一些相关信息结合资料书整理的,想深入了解的可以查资料...恩推荐用(需要VPN)Google,维基百科,当然可以百度,Bing...虽然最近度娘口碑差点,仔细找找还是有好多好资料的 先来熟悉一下各种码(至于实际实现效果,自己找个例程验证一下就行了)   原码:最简单的码,就是对每个状态依照二进制按照顺序依次编码(00,01,10,11.............)         顺序二进制编码,即将状态依次编码为顺序的二进制数。顺序二进制编码是最紧密的编码,优点在于它使用的状态向量位数最少,节约了逻辑资源   Gray码:我么都应该知道的哦(数电中卡诺图的化简...不了解的回去翻书),两个顺序状态之间的差别只有一位不同(00.01,11.10..............)          Gray码在发生状态跳转时,状态向量只有一位发生变化。理论上说 Gray状态机在状态跳转时不会有任何毛刺,但Gray码状态机设计中最大的问题是,在状态机很复杂状态跳转的分支很多时,要合理的分配状态编码保证每个状态跳转都仅有 1 位发生变化,你的数电功底一定要好............   独热码:每个状态只有一个比特是高电平"1"(0001,0010,0100,1000..........)了解?!         因为独热码的特性会多用了触发器,但所用组合电路可省一些,因而使电路的速度和可靠性有显著提高,而总的单元数并无显著增加。同时独热码在状态跃迁时仅需要改变状态变量的某一位,在一定程度上简化了比较逻辑,从而减少了毛刺产生的概率   总结         原码和格雷码是压缩状态编码。 若使用格雷编码,则相邻状态转换时只有一个状态位发生翻转,这样不仅能消除状态转换时由多条状态信号线的传输延迟所造成的毛刺,又可以降低功耗。二进制编码、格雷码编码使用最少的触发器,消耗较多的组合逻辑,而独热码编码反之。         独热码编码的最大优势在于状态比较时仅仅需要比较一个位,一定程度上简化了比较逻辑,减少了毛刺产生的概率.当然在需要表示同样的状态数时,独热编码占用较多的位,也就是消耗较多的触发器,但这些额外触发器占用的面积可与译码电路省下来的面积相抵消。还有由于独热码的状态译码简单,可减少组合逻辑且速度较快, 这种编码方式还易于修改,增加状态或改变状态转换条件都可以在不影响状态机的其它部分的情况下很方便地实现。           恩...看着独热码介绍篇幅最多,那么一定在状态设计中就是用独热码吗?实际上,相对于实际设计中,大型设计(状态要几十+吧...就这么定义,虽然很少见)独热码更有效,而一些小型设计中(我们常用的工程中)使用原码和格雷码更有效! 而相对于原码,就面积与速度的折中考虑来说Gray码是最好的选择,至于撒都不考虑了,图方便还是原码好用~~~         最后,我感觉自己说了一大堆没营养的话==不过像我这样比较懒的搜索的人,希望能有所帮助
  • 热度 22
    2016-2-5 15:00
    5459 次阅读|
    0 个评论
    序列检测器 实验目的: 用状态机设计一个序列检测器,实现对序列 10010 的检测。 状态转换图如下: 图 1 序列检测器的状态转换图   对于以上状态图作出如下说明: ( 1 )各箭头上方的数字表示状态跳转条件及相应的输出结果。如: S0—S1 上的 1/0 表示当输入的数据为 1 时,由状态 S0 跳转到状态 S1 ,并且输出为 0 ,表示还未检测到(或未检测完)数据流 10010 。同理,当完整地检测到 10010 时就输出 1 。 ( 2 )从 S0~S5 共有六种状态,在设计程序的时候,通常是采用 3bit 数据类型表示即可,但是,为了适应高速数字电路的应用需求,扩大数据信号的时间窗(时间窗由建立时间和保持时间构成),避免出现不稳定的中间态,故此六种状态采用 6bit 的数据类型表示。 ( 3 )下面描述一下状态跳转的过程: S0 为起始状态(或默认状态),当第一个 bit 到来的时候,判断其是否为 1 ,若为 1 则跳转到 S1 状态,并输出 0 作为标志信号,表示序列检测尚未完成;若为 0 则保持当前状态不变,同时输出标志信号 0 。 若当前状态为 S1 ,当前输入的 bit 为 0 ,则状态机跳转到 S2 状态,并输出标志信号 0 ;若当前输入的 bit 为 1 ,则保持当前状态不变。 若当前状态为 S2 ,当前输入的 bit 为 0 ,则状态机跳转到 S3 状态,并输出标志信号 0 ;若当前输入的 bit 为 1 ,则状态机跳转到 S1 状态,并输出标志信号 0 。 若当前状态为 S3 ,当前输入的 bit 为 1 ,则状态机跳转到 S4 状态,并输出标志信号 0 ;若当前输入的 bit 为 0 ,则状态机跳转到 S0 状态,并输出标志信号 0 。 若当前状态为 S4 ,当前输入的 bit 为 0 ,则状态机跳转到 S5 状态,并输出标志信号 1 ,检测到一个完整的“ 10010 ”序列; 若当前输入的 bit 为 1 ,则状态机跳转到 S1 状态,并输出标志信号 0 。 若当前状态为 S5 ,当前输入的 bit 为 0 ,则状态机跳转到 S3 状态,并输出标志信号 0 ;若当前输入的 bit 为 1 ,则状态机跳转到 S1 状态,并输出标志信号 0 。 除上述跳转过程外,各状态均需加上一条复位跳转路径,即:当复位信号 rst_n 当来的时候,任何状态都跳转到 S0 状态,输出 0 作为标志信号。 按照上面的状态跳转图写状态机,控制状态跳转和信号输出,程序代码如下截图所示: 接下来是写 testbench ,代码如下: 以上 testbench 的目的: ( 1 )产生频率为 50MHz 的时钟信号和复位信号; ( 2 )产生测试需要的比特流序列,该序列为 11100011010010100101100100100010 ,将它们送给序列检测器予以检测。 Quartus 综合所得的状态转换图如下图所示: 图 2 Quartus 综合所得的状态转换图 对比图 2 和图 1 可知,综合后所得的状态转换图与设计要求中的状态转换图一致,转换条件相同。下面,可以直接看仿真结果,仿真结果如图 3 所示: 图 3 仿真结果截图 由图 3 可知, in_data 是我们产生的比特流,它们是 111000110 10010 10010 1 100 10 010 0010 ,与期望的值是一致的。同时,在对比特流进行序列检测的过程中, flag 信号共出现了 4 次高电平,分别是在 i 为 18 与 17 之间、 13 与 12 之间、 7 与 6 之间以及 4 与 3 之间,这与序列 10010 在比特流中的位置是一致的(左起是第 31 位,右起是第 0 位)。故由此可知,序列检测器的检测功能正常。
  • 热度 17
    2016-2-5 14:49
    3337 次阅读|
    0 个评论
    两段式状态机 实验目的: 用两段式状态机描述法设计如图 1 所示的状态图转换图。 图 1 状态转换图 由图 1 可知,状态的跳转和输出信号的控制不仅与复位信号 Reset 有关,还与输入信号 A 有关,同时,输出有 K1 、 K2 两个信号,如果采用一段式状态机描述它则会杂乱无章,甚至会出现漏写语句的情况,故为了描述的状态机条理清晰、缜密,我们决定采用两段式状态机描述该状态转换图,第一段用一个 always 语句块描述状态的跳转,第二段用一个或多个 always 语句块描述输出信号与输入信号或当前状态的关系。需注意:( 1 ) always 的个数不是状态机的段数;( 2 ) always 的个数由输出信号的个数决定,一个 always 块中尽量只对一个输出变量进行赋值(或控制)。代码截图如下: Testbench 代码截图如下: QUARTUS 综合得到的状态转换图如图 2 所示: 图 2 QUARTUS 综合得到的状态转换图 Modelsim 仿真结果如图 3 所示: 图 3 Modelsim 仿真结果截图 由图 3 可知, A 从第 210 ns 开始变为高电平,然后依次产生 101001100110 的序列(以一个时钟周期为基本单位),在 A 的作用下,状态机的状态依次经由 IDLE 、 START 、 CLEAR 向 STOP 跳转,最后由回到 IDLE 状态。在第 290 ns 以前,状态每隔一个时钟周期跳转一次;而在第 290 ns 以后,因为 A 的电平状态变化减慢,故状态每隔两个时钟周期才跳转一次, K1 、 K2 的高电平保持时间也随之增长。 综上所述,采用两段式状态机描述上述状态转换图调理清晰、思维缜密,验证了状态转换的正确性。