关于状态机
一、有限状态机FSM(Finite State Machine)
组成:输入、状态、状态转移条件、输出
两类:
Mealy状态机:时序逻辑的输出不仅取决于当前状态,还与输入有关;
Moore状态机:时序逻辑的输出只与当前状态有关。
设计步骤:
1、逻辑抽象,得到状态转移图:确定输入、输出、状态变量、画状态转移图;
2、状态简化,得到最简的状态转移图:合并等价状态(它们的输入相同,转换到的次态和输出也相同的两个或两个以上的状态);
3、状态编码:binary、gray、one-hot编码方式;(
二进制编码:
优点:属于压缩状态编码,使用的触发器位数少,可以直接比较大小和算术运算。
缺点:译码复杂;相邻状态变换时,多位发生改变,电噪声大,转换速度较慢,易出错
独热码:
优点:状态比较时仅仅需要比较一个位,从而一定程度上简化了译码逻辑,译码简单,减少了毛刺产生的概率。
缺点:速度较慢,触发器资源占用较多,面积较大;
格雷码:
优点:属于压缩状态编码,使用的触发器位数少;相邻状态变换时,仅一位发生改变,电噪声小,转换速度较快;
缺点:译码复杂,没有固定大小,很难直接进行比较大小和算术运算,需要转换为自然二进制码来判断。)
4、用HDL描述。
Coding Style
一段式:
只有一个always block,把所有的逻辑(输入、输出、状态)都在一个always block的时序逻辑中实现。简洁不易维护。
二段式:
有两个always block,把时序逻辑和组合逻辑分隔开来。时序逻辑里进行当前状态和下一状态的切换,组合逻辑实现各个输入、输出以及状态判断。这种写法不仅便于阅读理解维护,而且利于综合器优化代码,利于用户添加合适的时序约束条件,利于布局布线器实现设计,在两端式描述中,当前状态的输出用组合逻辑实现,可能存在竞争和冒险,产生毛刺。
要求对状态机的输出用寄存器打一拍,但很多情况不允许插入寄存器节拍,此时使用三段式描述。其优势在于 能够根据状态的转移规律,在上一状态根据输入条件判断当前状态的输出,从而不需要额外插入时钟节拍。
三段式:
有三个always block,一个时序逻辑采用同步时序的方式描述转移转台,一个采用组合逻辑的方式判断状态转移条件、描述状态转移规律,第三个模块使用同步时序的方式描述每个状态的输出。代码容易维护,时序逻辑的输出解决了两段式组合逻辑的毛刺问题,但是从资源消耗的角度上看,三段式的资源消耗多一些。
always @ (posedge clk or negedge rst_n) begin if (!rst) CS <= IDLE; else CS <= NS; end always @ * begin NS = 'b0; //初始化寄存器,避免生成latch case(CS) IDLE: begin end; S1: begin end; default: NS = 'b0; endcase end always @ (posedge clk or negedge rst_n) begin if(!rst_n) begin end else begin case(CS/NS) //2种写法 ... default: ; endcase end end
-
第一个always块是时序逻辑,负责将next_state赋值给current_state。
-
第二个always块是组合逻辑,根据current_state和输入,计算next_state。
-
第三个always块可能是组合或者时序逻辑,负责产生输出信号
本文作者:大耳毛豆
本文链接:https://www.cnblogs.com/yjxmike/p/18720607
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期