八 基于FPGA的贪吃蛇游戏设计 (基8fft算法)
本文目录导航:
- 基于FPGA的贪吃蛇游戏设计(八)——状态机设计
- FPGA系统性学习笔记连载_Day16【状态机:一段式、二段式、三段式】 【原理及verilog仿真】篇
- verilog语法学习2:完全掌握有限状态机的写法
基于FPGA的贪吃蛇游戏设计(八)——状态机设计
Verilog语言通过不同的always语句块实现硬件电路的并行执行,但在实际工程中,除了并行执行电路外,有时也需要串行执行的电路。
这时,可以选择有限状态机FSM(Finite State Machine)来实现。
状态机由状态寄存器和组合逻辑电路构成,可以根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定操作的控制中心。
有限状态机主要分为两大类:Mealy状态机:时序逻辑的输出不仅取决于当前状态,还与输入有关;Moore状态机:时序逻辑的输出只与当前状态有关。
贪吃蛇游戏采用的是Mealy状态机模型。
根据代码的设计方式,状态机可以分为一段式、二段式和三段式。
一段式写法是把所有的逻辑(输入、输出和状态)都放在一个always语句块中,这种后期不易维护。
在简单的状态机可以使用。
二段式写法就是有两个always块,把时序逻辑和组合逻辑分隔开来。
时序逻辑里进行当前状态和下一状态的切换,组合逻辑实现各个输入、输出以及状态判断。
这种写法不仅便于阅读、理解、维护,而且有利于综合器优化代码,有利于用户添加合适的时序约束条件,有利于布局布线器实现设计。
在两段式描述中,当前状态的输出用组合逻辑实现,可能存在竞争和冒险,产生毛刺。
要求对状态机的输出用寄存器打一拍,但很多情况下不允许插入寄存器节拍,此时使用三段式描述。
其优势在于能够根据状态转移规律,在上一状态根据输入条件判断出当前状态的输出,从而不需要额外插入时钟节拍。
三段式写法就是有三个always块,一个时序逻辑采用同步时序的方式描述状态转移,一个采用组合逻辑的方式判断状态转移条件、描述状态转移规律,第三个模块使用同步时序的方式描述每个状态的输出。
三段式代码容易维护,时序逻辑的输出解决了两段式组合逻辑的毛刺问题,但是从资源消耗的角度上看,三段式的资源消耗多一些。
这里用一段式状态机来完成游戏的控制过程:关于这四个状态的描述请参考第一篇(整体描述):友晶科技FPGA:基于FPGA的贪吃蛇游戏设计(一)2个设计点提醒:这个cnt_clk计数器这里不能写成cnt_clk=,因为第6秒的时间只有一瞬间,当这个时候没有拨动SW时,其他时刻它就不再去判断SW的情况了。
当游戏结束时,按任意键触发游戏重新开始,cnt_clk和flash_cnt两个计数器清零,不然重新开始的时候会跳过欢迎界面,以及再次游戏结束时蛇不会闪烁。
其实就是要确保在重启状态下,所有的条件要回到与复位时一样。
蛇身方向控制用一个三段式的4状态的状态机来实现。
四个状态分别是上、下、左、右。
状态机第一段:完成初始化状态,以及完成当前状态转换到下一状态的时序逻辑:首先方向一定要初始化,否则方向就会错乱,虽然这里初始化方向是向右,但实际上运行时起步方向的判断是根据key值来判断。
状态机第二段:在当前状态下,根据当前的输入转换为下一状态的组合逻辑。
根据按键进行三个方向的选择,这里是按键按下的时候,信号传导Direct_next,然后由Direct_next送给Direct_r:状态机第三段:根据当前状态和当前输入产生当前输出的时序逻辑:上面这段代码解释如下:

FPGA系统性学习笔记连载_Day16【状态机:一段式、二段式、三段式】 【原理及verilog仿真】篇
在FPGA系统性学习的旅程中,我们继续深入探讨状态机的构建方法,包括一段式、二段式与三段式。
本篇着重于理解状态机的原理以及通过Verilog进行仿真的过程。
在开始之前,欢迎对FPGA有兴趣的朋友们加入交流群,共同探讨学习。
状态机作为FPGA设计中的核心组件,其功能性和灵活性为系统提供了强大的支持。
状态机可以分为摩尔型和米粒型两种,摩尔型输出仅与状态寄存器的状态有关,而米粒型输出则与组合逻辑的输入相关,结合了时序和逻辑的特性。
接下来,我们深入探讨状态机的三种构建方式:一段式、二段式与三段式。
一段式状态机将整个状态转移、输入输出描述集成在一个`always`模块中,实现了状态机功能的紧凑与简洁。
这种设计方式使得状态转移与输出逻辑紧密集成,便于理解与维护。
二段式状态机则进一步将状态转移逻辑与状态输出逻辑分离,采用两个`always`模块分别描述状态转移与输出。
这种设计有助于清晰地区分状态机的不同功能部分,使得代码结构更加清晰。
三段式状态机在二段式基础上,将状态输出逻辑进一步分离,形成三个`always`模块。
这样的设计将状态转移、状态条件判断与状态输出逻辑进行了彻底的分离,使得状态机的结构更为清晰、易于理解和维护。
通过上述状态机的构建方式,我们可以看到,二段式与一段式的主要区别在于将状态转移逻辑与状态输出逻辑分离,而三段式则进一步将状态输出逻辑进行了细化,形成了更清晰的代码结构。
接下来,我们将以自动售货机为例,详细介绍一段式、二段式与三段式的实现方式。
在自动售货机的设计中,我们采用二段式结构,分为状态转移逻辑和状态输出逻辑两个部分,以清晰地描述自动售货机的各个功能。
在实际应用中,我们将通过Verilog仿真脚本来验证状态机的正确性。
仿真结果将作为最终验证状态机设计的重要依据。
为促进学习与交流,我们建立了一个QQ交流群,欢迎对FPGA技术感兴趣的朋友们加入,共同探讨学习。
同时,我们还提供了微信交流群的加入方式,期待在更广泛的平台上与大家共同成长。
通过本篇内容的介绍,您对FPGA中状态机的构建方法以及Verilog仿真的应用有了更深入的了解。
希望您在FPGA设计的道路上越走越远,期待与您在未来的某一天再次相遇,共同探索技术的奇妙世界。
verilog语法学习2:完全掌握有限状态机的写法
有限状态机(FSM)是Verilog中一个核心概念。
本文将对这一概念进行梳理。
一、使用状态机的目的使用状态机是为了实现有序的逻辑操作。
由于Verilog编程通常在硬件平台上运行,而硬件平台支持并行执行。
然而,并非所有任务都适合并行执行,如泡茶过程就需要按顺序进行,因此,状态机通过状态转换来执行特定的顺序逻辑。
二、状态机的结构与分类状态机的四个要素包括:当前输入、当前状态、下一状态、当前输出值。
状态转换由外部输入(如时钟和当前输入)驱动。
根据输入不同,可分为Moore型和Mealy型两种状态机。
Moore型状态机的输出仅与当前状态有关,而Mealy型状态机的输出与当前状态和输入有关。
仿真结果显示,两者均可实现相同功能,但Mealy型状态机的输出与输入变化同步,而Moore型状态机的输出比输入晚一个时钟周期。
三、状态机的书写流程与要点在了解状态机结构和分类后,我们需要掌握其书写流程。
一般步骤包括:设计状态转移图、编写代码、仿真测试。
其中,格雷码和独热码编码方法需要特别注意。
四、状态机的书写方法常用的状态机书写方法包括一段式、两段式、三段式和特殊状态机。
三段式状态机最为推荐,其资源消耗适中,易于维护。
特殊状态机适用于高速状态机。