前言
学习说明此文档为本人的学习笔记,注重实践,关于理论部分会给出相应的学习链接。
学习视频:是根据野火FPGA视频教程——第十九讲
https://www.bilibili.com/video/BV1nQ4y1Z7zN?p=3
理论学习
关于理论学习请参考《数字电子技术基础》相关笔记:
《数字电子技术基础》6.4 时序逻辑电路——设计方法(FSM)有限状态机_追逐者-桥的博客-优快云博客时序逻辑电路设计——有限状态机(FSM)
https://blog.youkuaiyun.com/ARM_qiao/article/details/124461906状态机(FSM),也称为同步有限状态机,Mealy型、Moore型状态机(输出与输入无关)
实战演练一
一、设计规划
1.1 实验目标
可乐机每次只能投入1枚1元硬币,且每瓶可乐卖3元钱,投入3个硬币就可以让可乐机出一瓶可乐,如果投币不够3元放弃投币需要按复位键,否则之前的投币不能退回。
二、程序设计
2.1 波形图绘制
X表示输入:1投入1元硬币,0不投入硬币
Y表示输出:1出可乐,0不出可乐
S0、S1、S2状态:投入0元(初始状态)、投入1元、投入2元、投入3元。

2.2 代码编写
状态编码定义方式:
在低速系统中
- 状态机个数 <4个,二进制码
- 状态机个数 4—24个,独热码
- 状态机个数 >4个,格雷码
在高速系统中,无论个数均推荐使用独热码。

状态机代码写法有一段式、二段式、三段式:
一段式指的是在一段状态机中使用时序逻辑既描述状态的转移,也描述数据的输出;
二段式指在第一段状态机中使用时序逻辑描述状态转移,在第二段状态机中使用组合逻辑描述数据的输出;
三段式指在第一段状态机中采用时序逻辑描述状态转移,在第二段在状态机中采用组合逻辑判断状态转移条件描述状态转移规律,在第三段状态机中描述状态输出,可以用组合电路输出,也可以时序电路输出。
老的一段式、二段式、三段式各有优缺点,其中一段式在描述大型状态机时会比较困难,会使整个系统显得十分臃肿,不够清晰;二段式状态机的好处是其结构和理想的理论模型完全吻合,即不会有附加的结构存在,比较精简,但是由于二段状态机的第二段是组合逻辑描述数据的输出,所以有一些情况是无法描述的,比如输出时需要类似计数的累加情况,这种情况在组合逻辑中会产生自迭代,自迭代在组合逻辑电路中是严格禁止的,而且第二段状态机主要是描述数据的输出,输出时使用组合逻辑往往会产生更多的毛刺,所以并不推荐。所以衍生出三段式状态机,三段状态机的输出就可是时序逻辑了,但是其结构并不是最精简的了。三段式状态机的第一段状态机是用时序逻辑描述当前状态,第二段 状态机是用组合逻辑描述下一状态,如果把这两个部分进行合并而第三段状态机保持不变,就是我们现在最新的二段式状态机了。这种新的写法在现在不同综合器中都可以被识别出来,这样既消除了组合逻辑可能产生的毛刺,又减小了代码量,还更加容易上手,不必再去关心理论模型是怎样的,仅仅根据状态转移图就非常容易实现。