大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。
今天给大侠带来“FPGA学习系列 altera"系列,持续更新。此学习心得是本人之前所写,所用设计软件为Quartus II 13.1,现Quartus II 新版本已更新到19 ,以下仅供初学者学习参考。后续会更新其他系列,敬请关注。话不多说,上货。
状态机描述时关键是要描述清楚几个状态机的要素,即如何进行状态的转移,每个状态的输出是什么,状态转移的条件。具体描述时方法各种各样,最常见的有三种描述方式:
1. 一段式:整个状态机写到一个always模块里面,在该模块中即描述状态转移,又描述状态的输入和输出。
2. 两段式:用两个always模块来描述状态机,其中一个always模块采用同步时序描述状态转移,另一个模块采用组合逻辑判断状态转移条件,描述状态转移规律以及输出。
3. 三段式:在两个always模块描述的方法基础上,使用三个always模块,一个always模块采用同步时序描述状态转移,一个always模块采用组合逻辑判断状态转移条件,描述状态转移规律,另一个always模块描述状态输出(可以用组合逻辑电路输出,也可以用时序逻辑电路输出)。
一般而言,推荐的FSM(有限自动状态机)描述方法是后两种。这是因为:FSM和其他的设计一样,最好使用同步时序方式设计,以提高设计的稳定性,消除毛刺。状态机实现后,一般来说,状态转移部分是同步时序电路而状态的转移条件的判断是组合逻辑。
第二种描述方法同第一种描述方法相比,将同步时序和组合逻辑分别放到不同的always模块中实现,这样做的好处不仅仅是便于阅读、理解、维护,更重要的是利于综合器优化代码,利于用户添加合适的时序约束条件,利于布局布线器实现设计。在第二种方式的描述中,描述当前状态的输出用组合逻辑实现,组合逻辑很容易产生毛刺,造成设计的不稳定。
第三种描述方式与第二种相比,关键在于根据状态转移规律,在上一状态根据输入条件判断当前状态的输出,从而在不插入额外时钟节拍的前提下,实现了寄存器输出。
对于刚开始学习FPGA的读者,笔者建议设计FSM时,先设计成为一段式,设计实现了以后,再将FSM改成两段式或者三段式。故此,笔者的设计中将以一段式为主。
如果还是有不明白的读者可以发邮件到我邮箱或者加群询问。
END