0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

采用米利型的状态机电路设计

西西 来源:博客园 作者: zxl2431 2020-09-08 14:06 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1.0 序列检测器电路设计

设计一个序列检测器电路,功能是:检测出串行输入数据Sin中的4位二进制序列0101(自左至右输入),当检测到该序列时,输出Out=1;没有检测到该序列时,输出Out=0(注意考虑序列重叠的可能性,如010101,相当于出现两个0101序列)。

经过分析,首先可以确定采用米利型状态机设计该电路。因为该电路在连续收到信号0101时,输出为1,其他情况下输出为0,所以采用米利型状态机。

其次,确定状态机的状态图,该电路必须能记忆所收到的输入数据0、连续收到前两个数据01.。。可见至少要是个状态,分别用S1,S2,S3,S4,再加上电路初始态S0。根据要求可以画出状态图:

采用米利型的状态机电路设计

观察该图可以看出,当状态机处以S2、S4的时候,如果输入Sin = 1,则电路会转移到相同的次态S0,如果输入Sin = 0,则电路会转移到相同的次态S3,且两种情况下输出Out都为0。所以,S2、S4为等价状态,可用S2代替S4,于是得到简化的状态图:

如果用CPLD/FPGA器件实现状态机,则逻辑综合器会自动化简状态机。

利用Verilog HDL描述状态图主要包括:

(1) 利用参数定义语句parameter描述状态机中各个状态的名称,并指定状态编码。

(2) 用时序的always块描述状态触发器实现的状态存储。

(3) 使用敏感表和case语句(也可以采用if-else语句)描述状态转换逻辑。

(4) 描述状态机的输出逻辑。

这个电路我试着用3种方式来描述,看看他们的差别在哪里。

(1) 单个always块描述状态机方法(应该避免的写法)

生成的RTL视图:

采用米利型的状态机电路设计

State模块里面其实就是一个状态机:

采用米利型的状态机电路设计

仿真结果有时会出错:

采用米利型的状态机电路设计

在每个clk上升沿读取数据,可以看到是0101,在285ps时输出oOut应该是高电平,但不是,这是为什么了?再看下面一张图

采用米利型的状态机电路设计

这张是对的,为什么有时对又是错了,如果是这样那就失去了它的意义了。

对序列检测器电路用单个always块的描述的逻辑存在一个隐含的错误,即输出信号oOut的描述存在错误。其原因是:oOut信号是由状态机的当前状态和输入信号共同决定的,它是一个纯组合逻辑电路,如果当前状态不变,而输入信号变了,oOut信号应立即发生变化,而不是等到时钟上升沿来了才变化。因此,单个always块描述状态机的写法仅仅适用于穆尔型状态机。这虽然是个问题,但是跟我出现的问题貌似没有什么直接关系,郁闷。。。继续思考。

在实际应用中,为了消除组合逻辑输出信号中的毛刺,在时序允许的情况下,通常允许米利型状态机中输出信号通过寄存器输出。但是单个的always块的描述方法将状态转换判断的组合逻辑和状态触发器转移的时序逻辑混合编写在同一个always块中,不符合将时序和组合逻辑分开描述的代码风格(Coding Style),而且在描述当前状态时还要考虑下一个状态的逻辑,整个代码的结构不清晰,不利于修改和维护,不利于时序约束条件的加入,不利于综合器对设计的优化。所以不推荐使用单个always块的描述方式。

必须为自己的粗心大意买单,还说输出有时会出错原来状态图都是错了,不经意的一眼,看来不能随便啊。case语句后的 S1:当条件满足时(iSin == 1‘b1)时会跳到S2否则还会停留在S1。改过来看看正确的状态机就不会出错了。太粗心了!

正确的状态机:

采用米利型的状态机电路设计

(2) 两个always块描述状态机的方法(推荐写法)

值得注意的是Next_state = 2’bxx;对状态的默认赋值有3种方式:(1) 全部设置成不定状态(x); (2) 设置成预先规定的初始状态; (3) 设置成FSM中的某一有效状态。设置成不定状态(x)的好处是:(1) 在仿真时可以很好地考察所设计的FSM的完备性,若设计的FSM不完备,则进入任意状态,仿真时容易发现;(2) 综合器对代码进行综合时,会忽略没有定义的状态触发器向量。

生成的RTL视图:

采用米利型的状态机电路设计

和上面的比较了一下,少了个D触发器,这是为什么呢?并且仿真的结果也不一样了。仿真图:

采用米利型的状态机电路设计

当然新的问题也就随之而来:

采用米利型的状态机电路设计

我们可以明显的看到这种写法和上面写法的区别,最重要的是:输出oOut不在是在clk上升沿来的时候才能发生变化,它是一个纯组合逻辑电路只要输入条件满足输出就立马发生改变。随着毛刺的出现,毛刺是一个很重要的问题,很值得我们认真思考。为什么会出现毛刺了,我们可以清楚的看到这时次态是完全由组合逻辑电路决定的,时序电路做的事情仅仅是在clk上升沿来的时候把,把次态赋给现态。在445ps时在S1状态,输出为0、在455ps时在S2状态,输出为0、在465ps时在S3状态,此时就算clk的posedge不来,只要iSin == 1,输出同样会为1,正如上图,但在这里,clk 的上升沿和iSin 的高电平是同时来的,所以,在 iSin 的高电平来的那一瞬间,输出oOut = 1,就在同时状态装换到S2,输出oOut = 0;

这就导致了上面毛刺的产生。怎么解决这个问题呢?我们来看看第三种方法。

(3) 3个always块描述状态机(推荐写法)

分析一下代码,我们很容易看出:第一个always块采用同步时序逻辑方式描述状态转移(在电路框图的中间框),第二个always块采用组合逻辑方式描述状态转移规律(一般是第一个方框),第三个always块描述电路的输出信号,在时序允许的情况下,通常让输出信号经过一个寄存器再输出,保证输出信号中没有毛刺。

综合后的RTL视图,就跟第一版程序是一样的了,又有了D触发器,仿真结果和第一版也是一样的,但是两版代码的风格(Coding Style)是不一样的。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 逻辑电路
    +关注

    关注

    13

    文章

    504

    浏览量

    44970
  • 检测器
    +关注

    关注

    1

    文章

    988

    浏览量

    51000
  • D触发器
    +关注

    关注

    3

    文章

    185

    浏览量

    50478
  • 状态机
    +关注

    关注

    2

    文章

    505

    浏览量

    30025
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    bootm/booti命令内部是怎么一步步把内核拉起来的?——do_bootm_states状态机

    导读:无论使用 bootm、booti 还是 bootz,最终都会汇聚到同一个核心函数 ——do_bootm_states()。这是一个基于位掩码的状态机,控制着从镜像解析到内核跳转的每一个环节。理解它的状态转换,就掌握了 U‑Boot 引导内核的 "中央控制器"。
    的头像 发表于 09-13 14:16 543次阅读
    bootm/booti命令内部是怎么一步步把内核拉起来的?——do_bootm_states<b class='flag-5'>状态机</b>

    QCW5004+5007:收发分离无线HDMI硬件配对状态机底层工程解析

    双芯分离架构+HDMI线缆直连硬件配对状态机作为独特切入视角,发射端QCW5007完成HDMI信号采集与H.264硬件编码,接收端QCW5004实现无线码流接收解码与HDMI输出,无需物理配对按键,依靠HDMI直连链路完成收发设备绑定,固件原生支持一对四广播、多对一切换两类
    的头像 发表于 09-09 11:14 105次阅读

    压电执行器上电和掉电怎么控制?软启动、残余电荷、放电路径与故障状态机设计

    负载端真实电压、机械回退和放电时间,而不是只查看软件变量? 因此,合理架构通常包括:硬件放电路径、受限电压斜坡、实际输出或负载端电压监测、机械安全边界,以及覆盖正常与故障过程的状态机。这里最值得讨论
    发表于 09-04 10:46

    状态机编码没错,输出为何还会冒窄脉冲?

    状态机编码没错,输出为何还会冒窄脉冲? 状态机状态序列正确,不代表由状态位和输入组合译码出的外部控制信号没有传播延迟毛刺 功能仿真里状态
    的头像 发表于 08-25 11:47 150次阅读
    <b class='flag-5'>状态机</b>编码没错,输出为何还会冒窄脉冲?

    深入 FSoE 状态机:从 Reset 到 Data,安全通信的五步握手

    承载了什么安全机制。但这些字段如何协同工作、在什么时机被赋值?答案就藏在 FSoE 通信状态机之中。本文将深入分析 FSoE 的五个通信状态,逐一说明每个状态中 Master 和 Slave 在做什么,以及为什么会这样设计。
    的头像 发表于 07-24 16:06 187次阅读
    深入 FSoE <b class='flag-5'>状态机</b>:从 Reset 到 Data,安全通信的五步握手

    工业级一键开关机电路设计——EH2730应用笔记

    工业级一键开关机电路设计——EH2730应用笔记 1. 前言 在工业设备电源设计中,开关机电路虽然逻辑简单,但在实际工程中往往因为细节处理不当而导致系统可靠性下降。本文以ELITECHIP
    发表于 07-21 11:39

    状态机卡死的常见问题和整改方案

    上周调一个电机驱动的状态机,逻辑写完跑起来,前几个状态切换还挺顺,到第4个状态突然就卡那儿了,死活不出来。回头检查代码——状态A跳B、B跳C、C跳D,每个跳转条件都写得清清楚楚,单独调
    的头像 发表于 07-02 11:20 739次阅读

    放大电路设计

    这是我设计的三极管放大电路,但噪声很大。现在是三管并联模式,去掉两个只剩一个噪声依旧不会变,这是为什么?电路设计是出现了什么问题吗?
    发表于 04-13 12:54

    TDK PLEC69电感:小身材大能量的电源电路利器

    的PLEC69电感,采用薄膜工艺和金属磁性材料,为电源电路设计带来了新的解决方案。今天,我们就来深入了解一下这款电感。 文件下载: TDK PLE69B薄膜功率电感器.pdf 电感特性:紧凑尺寸下的卓越性能 1. 高电感与小尺
    的头像 发表于 12-25 14:05 849次阅读

    睿远研究院丨IO-Link规范解读(十一):ISDU状态机与EVENT事件

    上篇我们介绍了ISDU的典型编码格式和应用案例,本篇我们就来详细介绍下,ISDU的状态机,并把EVENT事件的逻辑,给大家好好解析下。 1主站ISDU状态机 如上图所示,ISDU的状态机的核心
    的头像 发表于 11-29 18:28 5251次阅读
    睿远研究院丨IO-Link规范解读(十一):ISDU<b class='flag-5'>状态机</b>与EVENT事件

    什么是状态机

    状态,这样用 20 个状态同样能实现这个状态机,而且只需要一个 unsigned char 的变量就足够了,每次击键都会引发状态迁移,每
    发表于 11-27 08:15

    嵌入式开发为何经常用到状态机架构

    一个管脚电平跳变或者一个串口数据,让整个程序都不动的情况也让我非常纠结,如果事件一直不发生电平跳变,你要等到世界末日么? 如果应用状态机编程思想,程序只需要用全局变量记录下工作状态,就可以转头去干别的
    发表于 11-25 07:08

    睿远研究院丨IO-Link规范解读(八):M-Sequence Type 与消息处理状态机

    丢弃,减少后端工作量。 那么今天我们就来深入研究下,消息处理模块中提到的各类M-Sequence,以及主从站的消息处理状态机!   1 M-Sequence Type 上回讲到主站发出来的MC和CKT
    的头像 发表于 11-07 16:18 7260次阅读
    睿远研究院丨IO-Link规范解读(八):M-Sequence Type 与消息处理<b class='flag-5'>状态机</b>

    睿远研究院丨IO-Link规范解读(六):主从站状态机解析

    前言 书接上文,今天我们就来好好聊聊主从站的DL-Mode状态机,还请各位童鞋前排坐好! 1主站状态机解析 主站的DL-Mode状态机有5个大状态,也是我们很熟悉的 建立通信、开始、预
    的头像 发表于 10-28 17:34 6719次阅读
    睿远研究院丨IO-Link规范解读(六):主从站<b class='flag-5'>状态机</b>解析

    PFC电路与BOOST电路设计实例分享

    PFC电路与BOOST电路设计实例资源下载 传统的AC-DC变换器和开关电源,其输入电路普遍采用了全桥二极管整流,输出端直接接到大电容滤波器。虽然不可控整流器
    发表于 10-23 16:15 20次下载