IC常用知识9-Verilog状态机小结

FSM:是时序电路设计中常用的一种设计方式,尤其适用于控制模块。在RTL级设计时,可以将设计分为数据部分和控制部分,其中数据部分通常是功能单元,设计容易。而控制部分通常可以用FSM来实现。实践证明,在执行速度方面,状态机要优越于CPU。
状态机由状态寄存器和组合逻辑电路构成,寄存器用于存储状态,组合逻辑电路用于状态译码和产生输出信号。

1. FSM的分类

根据输出信号产生的机理不同,分为Moor型和Mealy型

  1. Moor型:输出只与当前状态有关,因此当输入变化时还必须等到由输入引起状态的变化才能使输出改变
    image.png
  2. Mealy型:输出是在输入变化后立即变化的,不依赖时钟信号的同步;而Moor型的输出在输入变化时,还必须等待时钟信号的到来才能改变。因此Moor型比Mealy型状态机多等待了一个时钟周期。
  • 根据状态机的转移是否受到时钟的控制,有分为同步状态机和异步状态机,在实际应用中,通常都将状态机设计成同步方式。
    image.png

2. FSM的设计流程

  1. 根据系统要求建立状态转换图
  2. 根据状态转换图编写Verilog代码
  3. 利用EDA工具进行仿真验证

3. Moor型和Mealy型状态机的区别

  1. Moor型的输出只与当前状态有关,而Mealy型的输出还与输入相关。
  2. Moor型输入对输出的影响要到下一个时钟周期才能体现出来,而Mealy型输入的变化会直接体现出来
  3. 在实现相同功能的情况下,Mealy型状态机所需要的状态数比Moor型少

4. 编码方式

  1. 顺序编码:缺点是每次从进行状态跳转的时候,可能有多个位发生变化,容易产生毛刺,出现逻辑错误。
  2. 格雷码:可以节省逻辑单元,但是需要的组合逻辑较多
  3. 热码:需要的触发器数量较多,但是可以有效节省和简化组合逻辑电路,提高状态转换速率。对与门逻辑缺乏,而触发器数量较多的FPGA期间来说,采用热码是很好的解决方案。

5. 状态机的描述方式

  1. 一段式状态机
    在一个always语句中描述FSM中的次态逻辑,状态寄存器和输出逻辑
    image.png

  2. 两段式状态机
    一个always语句描述次态逻辑,一个描述状态切换以及输出逻辑
    两段式状态机的缺点是容易产生输出容易产生竞争冒险现象

  3. 三段式状态机
    一个always语句描述次态逻辑,一个描述状态切换,一个描述输出逻辑。
    image.png
    注意:三段式状态机有个问题,当三段式状态机的输出基于nextstate描述时,无法用同一个输入信号即触发当前状态跳转,又控制当前状态输出正确逻辑。第三段使用nextstate和state的区别在于,当状态跳转时,基于nextstate的输出是立刻变化的,而基于state输出会延迟一个周期,其他情况都一样,应该根据自己的时序要求,选择用nextstate还是state。所以当我们写序列检测器的时候,用的cur_state并且用assign时都是在检测出110之后,如果我们用always块进行输出,那么应该采用next_state,使能信号拉高的。而不是在检测出0之后就立即拉高。最后的总结就是如果是米利状态机,要想在0的时候变化,最好用assign+state;摩尔状态机的话,assign+next_state;如果想在0之后变化,米利:always+state;摩尔:assign+state或者always+next_state;

6. 什么时候使用状态机

  1. 电路需要有记忆功能的时候就可以用状态机,也就是说有状态转换图,比如计数器,连续序列110检测,自动贩卖机。其中计数器是比较特殊的情况,因为它的状态跳转是固定的情况,与输入无关,并且每种状态维持的时间相同,因此可以用一个count 计数就可以表示出所有的状态。
  2. 如果状态依赖于时钟,并且每次都是确定的,可以通过计数器来完成,输出的判断可以通过count <= max && cout >= min,比如交通灯和计数器都属于这种情况,也就是可以不用状态机来实现,因为他们的转态切换与输入关系不大,除了复位之外,但是我们建议用状态机来实现,因为判断的效率不高。
  3. 标准的使用状态机的例子是序列检测和自动贩卖机,首先,与状态与时钟无关,无法计数;其次,状态的切换与输入有关;最后状态的切换还与当前状态有关,也就是有记忆功能。
  4. 各种传输协议都是用状态机实现的

6. 小结

image.png

情况1:if (in == 1’b1) current <= s1;//结果如上图所示

//情况2
always @ (current) begin
	if (current == s3)
		out <= 1'b1;
	else
		out <= 1'b0;
end
//情况3
always @ (posedge clk) begin
	if (current == s3)
		out2 <= 1'b1;
	else
		out2 <= 1'b0;
end

总结来说,主要有以下结论

  1. 在时序电路中,如果用来判断的语句是输入信号,是不需要打拍的,如第一种情况。如果用来判断的语句已经是一个输出的寄存器,则是要打一拍的,如情况3,其实相当与两个触发器连接了,明显要打一拍,而一个触发器的输出是不需要打拍的
  2. 在组合逻辑电路中,也是不需要打拍的,如情况2。
  3. 阻塞赋值和非阻塞赋值与打拍是没有关系的,要根据阻塞和非阻塞赋值的原理进行分析,但是要打拍,肯定是用非阻塞赋值。

7. 相关简答题

7.1 在组合电路中不用非阻塞赋值的原因

  1. 会产生锁存器,而锁存器对电路是不利的,因为锁存器对毛刺敏感,不能异步复位,所以上电后处于不确定的状态;
  2. 不利于静态时序分析;
  3. PLD器件的基本单元是查找表和触发器,因此生成锁存器更加占用资源。而在时序电路中用非阻塞复制,产生的是触发器,所以组合电路不是不能用非阻塞赋值,而是用了不利于电路。

7.2 一段式状态机和二段式状态机,三段式状态机分别对应的优缺点

  1. 一段式的缺点是代码看起来比较冗余,不利于阅读和维护
  2. 二段式的缺点是输出由组合逻辑驱动,可能会产生毛刺,不利于时序分析和优化。

7.3 状态机的三要素

输入,输出和状态
还有一种说法是四要素,分为现态,次态,条件,动作

参考链接:
https://www.cnblogs.com/lifan3a/articles/4583577.html
https://www.cnblogs.com/lueguo/p/3283400.html

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值