八 基于FPGA的贪吃蛇游戏设计 (基8fft图)

本文目录导航:

基于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的贪吃蛇游戏设计 (基8fft图)

fpga和51单片机有什么区别

FPGA与51单片机在逻辑设计目标上存在显著差异。

FPGA专注于实现组合逻辑、时序逻辑和状态机的设计,而51单片机是FPGA能够实现的一种设计目标。

这意味着,对于一个熟练掌握HDL语言的人来说,完全可以在FPGA内部构建一个单片机或CPU。

本质上,单片机或CPU可以被视为一个有限状态机。

通常所说的软件,只能在处理器上运行。

换句话说,当设计完成后,通过编写代码让CPU这个有限状态机运行即可。

因此,CPU在本质上属于软件范畴。

即使一个高水平的程序员,也仅是让CPU这个有限状态机按照指令进行运行。

然而,对于FPGA的设计者而言,他们利用FPGA内部的逻辑资源,设计组合逻辑、时序逻辑和状态机。

他们清楚CPU的设计原理和本质,能够灵活地进行电路设计。

FPGA与51单片机在编程方式上也有所不同。

单片机采用传统的软件编程方式,通过编写程序来控制硬件。

而FPGA采用硬件描述语言进行编程,通过描述逻辑电路来实现特定功能。

这种差异使得FPGA在灵活性和可编程性方面具有优势。

51单片机通常用于简单的嵌入式系统中,例如小型控制器和传感器。

FPGA则广泛应用于高速数据处理、图像处理、通信系统等领域。

在这些应用中,FPGA可以实现高速的数据传输、并行处理和复杂的算法实现。

总结来说,FPGA与51单片机在设计目标、编程方式和应用场景上存在明显区别。

FPGA提供了更高的灵活性和可编程性,适用于复杂的应用场景,而51单片机则适用于简单的嵌入式系统。

OpenDev|如何用Verilog写一个可综合的三段式状态机 & VS Code 好用的Verilog辅助插件推荐

由于工作和个人项目的繁忙,我有一段时间没有更新我的专栏了。

现在工作稳定下来,我决定分享近期在FPGA研究中的收获,以此检验自己是否真正掌握所学知识。

我曾惊讶于在巴西,我发现小学生在书店购买物理书籍,尽管他们比美国孩子更早接触物理,但巴西整体物理学家数量却不多。

这就像一个热爱希腊文的学者,看到其他地方的学生对希腊文有深入学习,尽管他们能熟记对话,却无法理解其深层含义。

这提醒我们在设计Verilog状态机时,要确保代码可被EDA软件转化为实际电路,理解Verilog语法类似C,但使用方法却大相径庭。

设计一个高效的三段式状态机(FSM)时,应采用Moore型状态机,输出仅依赖当前状态,避免使用输入或未来状态变量。

首先,你需要列出所有可能的状态,以防止未声明的状态导致死锁。

通常,你可以使用枚举类型或者typedef enum来简化调试过程。

状态机的结构包括同步转移块,固定不变的部分;异步转移块,由s_next控制;以及输出逻辑,这部分应只依赖于模块内部的寄存器。

对于Verilog HDL或SystemVerilog的高级特性,如function和task,应有所了解,但需确保这些特性能在综合时被支持。

在编写和调试过程中,我强烈推荐使用TerosHDL这款插件,它模仿软件开发工具,提供了模块文档自动生成、状态机可视化和项目管理等功能,极大地提高了开发效率。

此外,还有网页版EDA仿真、HDL题库和一些有趣的FPGA学习资源,如FPGA4fun和NANDLAND,这些都对学习和实践非常有帮助。

你可能想看:
« 上一篇
下一篇 »

相关推荐

FreeBasic:强大免费开源的64位basic编译器及应用优势

2025年05月10日

82阅读

脊柱侧弯矫正方法大盘点:运动康复、支具矫正等多种方式

2025年05月09日

88阅读

如何在winForm标题栏去掉标题文字且任务栏图标正常显示

2025年05月09日

86阅读

十一黄金周促销广告词大全,国庆购物狂欢等你来

2025年05月09日

78阅读

关闭快速编辑模式及插入模式,设置控制台指定文字颜色举例

2025年05月09日

63阅读

黄金搭档低糖高钙饮品包装及成分功效全解析,适合人群要知晓

2025年05月09日

91阅读