news 2026/5/5 3:21:23

FPGA学习笔记-拔河游戏电路设计

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
FPGA学习笔记-拔河游戏电路设计

要求:
设计拔河游戏电路,用按键与LED表示输入与输出。

(1)初始时,16个LED中间的两个点亮,然后游戏双方不停按动按键,点亮的两个LED向按动按键慢的一方移动;

(2)每按动一下按键,LED向对方移动一格;

(3)只要LED移动到头,游戏结束;

(4)工作时钟100Hz即可;

1 翻译

16 个 LED 上有两颗相邻亮点(一段“绳子中心标记”),两个人分别按左右按键:

  • 左边玩家按一下→ 亮点整体向右移动 1 格(朝对方移动)

  • 右边玩家按一下→ 亮点整体向左移动 1 格

  • 亮点移动到最左/最右边界 →游戏结束
    题目里“向按键慢的一方移动”就是在描述:谁按得少/慢,中心就会被对方“拉”向自己这边。


2 4个关键技术点

  1. 时钟:板上一般 50MHz/100MHz,但题目说“工作时钟 100Hz 即可”
    → 用分频做一个100Hz tick(10ms 一拍)用于按键扫描/游戏逻辑。

  2. 按键消抖:机械按键会抖动,不消抖会一次按出很多下
    → 10ms 扫描下,用“连续 N 次采样一致”当作稳定。

  3. 边沿检测:只想要“一次按下=一个脉冲”
    → 稳定后的按键做pressed_pulse(上升沿/下降沿取决于按键高低有效)。

  4. 位置寄存器:用一个数pos表示“两颗亮点里左边那颗LED的位置”

  • LED 共 16 个,编号 0..15

  • 两颗相邻亮点 =led[pos]led[pos+1]

  • 初始中间两颗亮:pos=7(亮 7 和 8)

边界:pos只能在 0..14

  • pos=0(亮 0,1)或pos=14(亮 14,15) → game_over

3 游戏逻辑(核心,写成规则翻译成代码)

在每个tick_100hz时刻:

  • game_over=1:保持不动(可选:闪烁)

  • 否则:

    • left_pulse=1right_pulse=0pos = pos + 1

    • right_pulse=1left_pulse=0pos = pos - 1

    • 两个都按/都不按 → 不动(公平,建议这样写)

  • 更新后若pos==0 || pos==14game_over=1
    这套规则和题目(2)(3)完全对齐,而且实现简单稳定。

4 代码

通过网盘分享的文件:tug_game.v.zip
链接: https://pan.baidu.com/s/1LLpMb-XqueEtLLwRipXWEQ 提取码: 1234

默认按键低有效(没按=1,按下=0),LED 默认高有效(1 亮)。如果你板子相反,改参数就行。

5 个文件:

  • clk_tick.v:分频产生 100Hz tick

  • key_debounce_edge.v:按键消抖 + 按下脉冲(1 次按下=1 个 pulse)

  • tug_game.v:拔河核心逻辑(pos + game_over + 可选闪烁)

  • led_encode.v:pos→16LED 两点亮

  • tug_top.v:顶层连接

  • tb_tug_top.v:测试平台

5 仿真结果


5.1错误1

5.1调试

波形里同时观察:

  • tick_100

  • left_pulse

  • pos

你会发现现象是这种错位:

  • tick_100在某一拍为 1

  • left_pulse反而是在tick_100 后一拍才冒出来(或者反过来)
    → 所以pos一直不动。

原因:

pos 不加 1 的原因基本可以锁定了:
tug_game是在if (tick_100)这 1 个 clk 的瞬间更新 pos,但left_pulse在另一个 always 块里同一拍才“生成出来”,tug_game那一拍读到的还是旧值 0。
到下一拍left_pulse才变成 1,但此时tick_100已经回到 0,于是if(tick_100)不成立——这一按键就被“错过”了。

这就是典型的:单周期脉冲 + 不同 always 块 + 还用 tick 再门控 导致的漏采样。

5.2结果分析

仿真开始后,系统首先经历复位阶段,rst_n处于无效状态时,各寄存器被初始化:位置寄存器pos被置为7(4'b0111),表示初始亮点位于 LED 的中间区域;同时game_over0,表明游戏未结束;显示控制blink初始为1,允许 LED 正常显示。由此,输出led对应出现两颗相邻点亮,且与pos=7相一致(即led[pos]led[pos+1]置亮),体现了“初始时 16 个 LED 中间两个点亮”的题目要求。

进入正常工作后,系统内部节拍信号tick_100按 100Hz 周期性产生窄脉冲,用作按键消抖模块的采样时钟。此时,原始按键输入key_left在测试平台驱动下呈现周期性“按下—松开”的动作序列;由于按键消抖采用“连续多次采样一致才判稳”的策略,稳定状态信号left_stable并不会与key_left同步瞬变,而是在连续若干次tick_100采样确认后才翻转。当left_stable从 0 变为 1 的瞬间,消抖模块输出一次性事件脉冲left_pulse(单次按动仅产生一个脉冲),该脉冲作为“有效按键事件”的唯一标志供游戏逻辑使用。

在每次left_pulse出现后,游戏核心逻辑立即对位置寄存器pos执行加 1 更新,表现为pos从初始的0111(7)依次递增为1000(8)、1001(9)、1010(10)、1011(11)、1100(12)、1101(13)、1110(14),位置变化呈现严格的“一次按动移动一格”的离散步进特性。与此同时,LED 输出led也同步更新:两颗相邻亮点随pos的递增整体向右平移,且始终保持“相邻两灯同时点亮”的规则,即每次位置变化后,亮点从(pos,pos+1)平移到(pos+1,pos+2),实现了“亮点按按键向对方移动”的题目要求。

pos递增到14(4'b1110)时,亮点已经抵达最右边界(点亮 LED14 与 LED15),此时逻辑触发结束条件:game_over由 0 置为 1,系统进入“游戏结束锁定态”。在锁定态下,即使后续仍出现按键动作与脉冲事件,位置寄存器pos也不再更新,保持在边界值不变,从波形上可见pos在达到1110后保持恒定,符合题目“只要 LED 移动到头,游戏结束”的要求。

此外,由于设计中启用了结束闪烁功能(BLINK_ON_OVER=1),在game_over=1之后,显示控制信号blink开始按设定频率翻转,从而使 LED 显示呈现周期性明灭效果:当blink=1时 LED 正常显示边界亮点;当blink=0时 LED 输出被整体熄灭或显示抑制。该现象在波形后段可以观察到blink的翻转变化,进一步证明“结束后进入提示状态(闪烁)”的逻辑链路工作正常。

综上,该波形完整覆盖并验证了关键功能链路:复位初始化 → tick_100 采样消抖 → 按下事件生成 left_pulse → pos 单步移动 → LED 两点同步平移 → 到达边界置位 game_over 并锁死 → 结束闪烁提示,符合拔河游戏课设的功能要求。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 8:28:05

XXL-JOB与AI结合:智能调度任务的新时代

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个基于XXL-JOB的智能任务调度系统,集成AI模型(如Kimi-K2)进行任务优先级动态调整和异常预测。系统应包含:1. 实时监控任务执行…

作者头像 李华
网站建设 2026/5/5 1:53:40

Linux命令效率提升:告别重复输入的技巧

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 设计一个Linux命令效率优化工具,能够分析用户的历史命令记录,自动推荐命令别名设置、常用命令组合和脚本优化建议。提供一键应用功能,帮助用户快…

作者头像 李华
网站建设 2026/4/30 8:45:45

艺术品版权登记:GLM-4.6V-Flash-WEB提取创作元素特征

艺术品版权登记:GLM-4.6V-Flash-WEB提取创作元素特征 在数字艺术爆发式增长的今天,一幅AI生成的画作可能只需几秒就能诞生,但它的“身份认证”却往往需要数天甚至更久。当创作者上传作品时,等待人工填写描述、审核构图风格和比对历…

作者头像 李华
网站建设 2026/4/25 9:36:38

GLM-4.6V-Flash-WEB如何实现低延迟视觉理解?技术揭秘

GLM-4.6V-Flash-WEB如何实现低延迟视觉理解?技术揭秘 在智能客服、自动化审核和交互式内容分析日益普及的今天,用户对AI系统的“反应速度”提出了近乎苛刻的要求。我们不再满足于一个能看懂图片但要等三五秒才回答的模型——尤其是在网页端或移动端场景中…

作者头像 李华
网站建设 2026/4/24 22:54:44

用Microsoft Barcode Control 16.0快速构建条码验证工具原型

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 快速生成一个条码验证工具的原型,使用Microsoft Barcode Control 16.0实现以下核心功能:1) 支持多种条码类型扫描;2) 验证条码有效性&#xff1…

作者头像 李华
网站建设 2026/4/23 14:01:10

APPDATA目录是什么?新手必读指南

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 制作一个交互式教程,逐步引导用户了解APPDATA目录的结构和用途。教程应包括简单的文件操作示例,如创建、读取和删除APPDATA中的文件,使用Python…

作者头像 李华