1、状态机最好用时序输出,这样时序性能好。在这种情况下:
(1)为了不延时,使用NextState做触发。
这样是保证了在输入改变后的上升沿,输出会反映输入的变化。
从输入改变到这一个上升沿这个过程是不可避免的,在做状态机时序设计的时候要考虑这一点。
(如果是组合输出的话,输入会立即反映到输出上来。但是,决定状态转移的输入还是会延迟到上升沿才起作用,这是因为State这个变量是时序的。如果State也做成组合的,那么就做成了一个异步状态机,异步状态机实现复杂)
总结一下:
在一个状态下,对一个时序输出,那么它能看到的输入是上一个时钟沿的输入;对一个组合输出,那么它能看到的输入是当前的输入。
(2)第一个状态(通常是Rst或者IDLE)在程序的开始是进入不进去的,导致信号初始值没法赋。这样就需要一个冗余的状态,用于让信号尽快进入原计划的第一个状态,否则信号初始值长时间不确定会比较危险。
2、case里面的default的处理。
在default里面,要将信号的值保持,而不要将所有信号都复位。因为下载到板子里之后,很多信号会有抖动,如果case没有覆盖所有二进制的可能时,很容易触发default。如果default是将所有信号复位的话,那么这个信号就变成0了。如果这个信号可以在后来自行回复自己的值,那么没有关系。但是很多信号都没有这个自动回复的功能。举例说明:
这个情况的影响对于状态机的第二个进程影响还不是很大,因为虽说default将NextState变为了IDLE(复位了),但是State并没有发生变化,所以NextState仍然可以回复到正常的值,并不影响整个状态机的运转。
但是这个情况对于第三个进程就影响很大了。因为这里面除了有一些output之外,还会有一些内部寄存器的信号。这些信号一般是在很多分支中要保持值不