状态机,是我大二在实验室学习时,学长给我们安排的任务之一。那个时候,我还没有学过《数电》,一直搞不明白状态机的意思,做了一周,都没有结果。
任务是检测序列,检测到1011时输出一个高电平。
我们都知道verilog语言依靠不同的always语句块实现了硬件电路的并行执行,但是在工程中,我们不仅要处理并行执行电路,偶尔也会遇到需要串行执行的电路要求。刚开始学习FPGA的话,可能会想到我们可以利用很多很多的使能信号实现,但是这样维护的成本大大增加。状态机就可以完美的实现这一功能。先简单介绍一下状态机的基本概念。
状态机的基本要素是输入、输出和状态。输入是引起状态变化的条件,输出是状态变化引起的变化。状态就是字面理解的意思了,状态机,通俗的说就是因为输入导致状态在不断的变化的硬件电路。
Moore型状态机的输出仅与状态有关,与输入无关。
Mealy型状态机的输入不仅与状态有关,还与输入条件有关。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Oq0qQTjK-1571226216451)(http://img.blog.csdn.net/20180119154529552?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQ2hlcmlzaF94/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]
一段式写法,输入、输出和状态在一个always语句块中,后期不容易维护。
1 | module pro( |
[外链图片转存中…(img-CLvmuOJa-1571226216454)]
二段式写法,分成了组合逻辑和时序逻辑。时序逻辑里作状态的转移,组合逻辑里作输入条件判断和输出。但是组合逻辑输出容易出现毛刺问题。
1 | module pro( |
三段式写法,又将输出写作时序逻辑输出,解决了二段式中毛刺的问题。
1 | module pro( |