状态机

本文探讨了状态机设计的一些关键点,包括时序输出的重要性、case语句中default的处理以及输出进程应为时序。强调了在default中保持信号值不变的策略,以及如何避免信号抖动对状态机的影响。同时,提到了状态机的安全状态转移策略,确保能够有限步数内回到IDLE状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、状态机最好用时序输出,这样时序性能好。在这种情况下:

(1)为了不延时,使用NextState做触发。

这样是保证了在输入改变后的上升沿,输出会反映输入的变化。

从输入改变到这一个上升沿这个过程是不可避免的,在做状态机时序设计的时候要考虑这一点。

(如果是组合输出的话,输入会立即反映到输出上来。但是,决定状态转移的输入还是会延迟到上升沿才起作用,这是因为State这个变量是时序的。如果State也做成组合的,那么就做成了一个异步状态机,异步状态机实现复杂)

总结一下:

在一个状态下,对一个时序输出,那么它能看到的输入是上一个时钟沿的输入;对一个组合输出,那么它能看到的输入是当前的输入。

(2)第一个状态(通常是Rst或者IDLE)在程序的开始是进入不进去的,导致信号初始值没法赋。这样就需要一个冗余的状态,用于让信号尽快进入原计划的第一个状态,否则信号初始值长时间不确定会比较危险。

 

 

2、case里面的default的处理。

在default里面,要将信号的值保持,而不要将所有信号都复位。因为下载到板子里之后,很多信号会有抖动,如果case没有覆盖所有二进制的可能时,很容易触发default。如果default是将所有信号复位的话,那么这个信号就变成0了。如果这个信号可以在后来自行回复自己的值,那么没有关系。但是很多信号都没有这个自动回复的功能。举例说明:

       这个情况的影响对于状态机的第二个进程影响还不是很大,因为虽说default将NextState变为了IDLE(复位了),但是State并没有发生变化,所以NextState仍然可以回复到正常的值,并不影响整个状态机的运转。

       但是这个情况对于第三个进程就影响很大了。因为这里面除了有一些output之外,还会有一些内部寄存器的信号。这些信号一般是在很多分支中要保持值不

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值