这是一篇转载的文章,但是个人理解笔者将前两个always块结构搞错了,自行纠正了一下。
原文链接 https://www.jianshu.com/p/5eee434ab24d
1. 三段式要求
有限状态机采用三段式风格,即三个always块描述状态机.
第一个时序逻辑always块用来描述当前状态.(current state) 寄存器的复位和变化.
第二个组合逻辑always块用来描述下一状态的转移(next state logic)
第三个always块用来描述输出.(output logic) 组合or时序 均可.
优点:书写清晰,组合与时序分离设计,易于综合,且在一定程度上避免了状态转移和输出等组合逻辑中的毛刺.
2. 状态机状态信号命名方法
当前状态命名为current_state,下一状态命名为next_state.
主要目的是为了提高状态机的可读性,为分析逻辑功 能提供方便,也可以是cstate or nstate.
3.编码方式
准则:使用参数赋值状态
两种常用的编码方式:二进制编码及独热码编码
二进制编码占用的位数少,但其状态跳变需要额外的译码电路,这样的编码方式会对状态机的运行速度有所限制,可以满足一般的设计要求。
独热码编码,以n bit表示n个 状态,这样编码的译码部分可以做到最简,工作频率可以做到较高,相对于二进制而言,需要更多的位。
建议使用的独热码,电路的速度和可靠性有显著的提高,但注意:存在多余的状态,就有一些不可到达的状态,需要在case语句的最后,加default分支,以确保能回到IDLE状态。
4.状态机设计的注意事项
设计的状态跳转条件是否充分
状态跳转条件都不满足的情况下,状态机如何工作
未定义的状态应如何设计
状态机跳转设计中,是否受外部信号的影响
5.三段式的写法
组合逻辑always块:(负责状态的跳转)、
always@(current_state or else signal)(敏感列表中存放对状态跳转有影响的信号)
begin
next_state=x; (初始化,使得系统复位进入正确的状态)
case(current_state)
s1: if(.....)
next_state=s2
.
.
.......
endcase
end
时序逻辑always块:
always@(posedge clk or negedge rst)
if(!rst)
current_state<=IDLE;
else
current_state<=next_state;
描述输出的always块可以是组合的也可以是时序的;
6.典型的序列检测状态机写法:
作者:喜欢萝莉的逗逼青年
链接:https://www.jianshu.com/p/5eee434ab24d
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。