如何用Verilog实现猫狗过河的?

摘要:源代码地址:https:github.compenggeoncatanddog 效果演示见: https:www.bilibili.comvideoBV1n24y147S1 警告: 仅给出了实验过程的源代码,需手动复制粘贴至
源代码地址:https://github.com/penggeon/catanddog 效果演示见: https://www.bilibili.com/video/BV1n24y147S1 警告: 仅给出了实验过程的源代码,需手动复制粘贴至自己项目中。 主模块默认名为 catanddog,若需使用请自行修改。 设计课题的任务要求 任务描述 一个人要将 1 只狗、 1 只猫、 1 只老鼠渡过河,独木舟一次只能装载人和一只动物,但猫和狗不能单独在一起,而猫和老鼠也不能友好相处,试模拟这个人将三只动物安全渡过河的过程。 基本要求 1、 SW6 作为整机开关, SW6=0 为关机状态, 点阵、 数码管和发光二极管为全灭状态; SW6=1 时,启动游戏,在 8× 8 点阵显示猫、狗、鼠均在左岸的情况(如图 3-1 所示),其中红色方块表示猫, 绿色方块表示狗, 黄色方块表示鼠; 数码管 DISP1-DISP0显示渡河次数,启动时显示“00”; LD15 和 LD0 显示独木舟所在位置, LD15 亮表示独木舟在左岸, LD0 亮表示独木舟在右岸,启动时独木舟在左岸; 2、 BTN0 为复位键,任何时候按下复位都重新启动游戏; 3、 BTN7 代表猫, BTN6 代表狗, BTN5 代表鼠,按下对应的按键表示带该动物过河,同时点阵上显示过河动画。 例如按下 BTN6 选择狗,点阵按图 3-2 所示过程显示过河动画,每秒切换一幅图案; 4、 带某动物过河时要求独木舟和该动物在河的同侧, 如果不在同侧,则按键无效; 5、 BTN4 代表独木舟单独往返,按下后在 LD0~LD15 上显示渡河过程,根据独木舟当前所在位置,依次点亮 LD0~LD15 或 LD15~LD0,每 0.25 秒切换一个 LED; 6、 在数码管 DISP1-DISP0 显示渡河次数, 带动物过河或者独木舟单独往返渡河次数均加 1; 7、 将三只动物全部带到右岸则游戏成功, LD0~LD15 全亮表示成功,按 BTN0 可重新启动游戏; 8、 如果出现猫和鼠或者猫和狗单独在河的某侧,则游戏失败, LD0~LD15 全灭表示失败,按 BTN0 可重新启动游戏。 提高要求 1、 游戏难度可以设置,不同难度要在不同的渡河次数之内完成游戏,在规定步数内未完成游戏则为失败; 2、 在不同情况下播放不同的音效或乐曲; 3、 自拟其它功能。 系统设计(设计思路、总体框图、分块设计) 设计思路 模块化设计,自顶向下设计,自下向上实现。 时钟分频模块将1kHz时钟分频为4Hz与0.25Hz供其他模块使用,消抖模块将按钮经过消抖输出有效短脉冲信号,计数器模块产生需要的计数器供其他模块使用,LED模块、点阵模块、数码管模块、蜂鸣器模块实现底层功能,Main模块实现主要的游戏逻辑。 总体框图 分块设计 顶层模块 顶层模块负责各自模块之间的连接 主模块 Main模块,负责主要逻辑的实现。 包括按下各个按钮后标志位的更新、游戏状态实时更新,正常游戏时猫、狗、鼠位置变量的变换即过河动画,复位键按下后标志位置初始值、位置变量置零等操作。 时钟分频模块(系列) 时钟频率选用1kHz,项目中需要采用其他频率时钟,故而进行时钟分频。 包括divide_4Hz,divide_025Hz两个时钟分频模块,分别产生4Hz时钟与0.25Hz时钟。 计数器模块(系列) 项目设计中需要各种计数器,故将计数器单独拿出,封装为了不同的模块。 包括Counter_8,Counter_2,Counter_2_025Hz,Counter_8_4Hz四个计数器模块,前两者分别是1kHz时钟下产生的模8计数器与模2计数器,后两者分别是0.25Hz时钟下产生的模8计数器与模2计数器。 消抖模块 由于机械按键按下后可能会产生抖动,导致一次的按键按下事件被识别为多次按键按下,故按键信号均需经过消抖模块进行处理。该项目利用debounce模块进行消抖。 LED模块 LED模块采用组合逻辑设计。 第一步判断开机拨码sw6,sw6为0时输出信号全为0,sw6为1时继续判断。 第二步判断难度设置拨码sw5,sw5为1时根据counter_2_025Hz计数器输出信号来实现LED的闪烁效果,表示此时正处于难度设置中,sw5为0时继续判断。 第三步判断游戏状态标志位,若成功,则LED输出信号全为1,若失败,则LED输出信号全为0,若正在处于游戏中,则根据Main模块的输出信号cnt_canoe来判断此时的独木舟处于何处,并正确显示。 点阵模块 点阵模块采用组合逻辑设计。 第一步判断开机拨码sw6,sw6为0时行信号输出为1,列信号输出为0,sw6为1时继续判断。
阅读全文