篮球计分牌 FPGA 设计 VHDL Quartus

名称:篮球计分牌 FPGA 设计 VHDL Quartus

软件:Quartus

语言:VHDL

功能介绍

本设计实现一个篮球比赛计分牌 FPGA 系统,使用 VHDL 编写并在 Quartus 工程环境下完成编译与仿真。系统面向双队伍比分显示场景,可通过按键选择 A 队或 B 队,并对当前队伍进行加 1 分、加 2 分、减 1 分、减 2 分操作。 比分显示采用六位数码管动态扫描方式,两队比分各占三位,比分范围为 0 到 999。复位后两队比分清零,后续根据按键输入实时更新,适合课程设计、FPGA 数字系统实验、VHDL 模块化设计练习以及数码管显示控制参考。 工程包含顶层连接、计分控制、按键边沿检测和数码管扫描显示等模块,结构清晰,便于理解从按键输入到计分寄存器更新再到数码管输出的完整流程。配套仿真文件和设计文档可帮助用户核对主要模块功能与整体运行逻辑。

运行环境

开发语言:VHDL 开发软件:Quartus 工程文件:top_scoreboard.qpf、top_scoreboard.qsf 主要源码:top_scoreboard.vhd、score_ctrl.vhd、edge_fall.vhd、sevenseg_scan6.vhd 仿真文件:top_scoreboard.vwf、score_ctrl.vwf、edge_fall.vwf、sevenseg_scan6.vwf

设计思路

系统采用模块化设计方式,将篮球计分牌拆分为按键检测、计分控制、顶层连接和六位数码管扫描显示等功能模块。顶层模块 top_scoreboard 负责整合各子模块,将外部时钟、复位、队伍选择和加减分按键信号接入计分逻辑,再把两队比分送往数码管显示模块进行动态显示。 计分核心由 score_ctrl 完成,支持 A、B 两支队伍分别计分,通过 team_sel 选择当前操作队伍。加分按键包含加 1 分、加 2 分,减分按键包含减 1 分、减 2 分,适合篮球比赛中常见的比分修正和计分操作。比分范围限制在 0 到 999,逻辑中加入上下限裁剪,避免减分低于 0 或加分超过显示范围。 按键输入通常会带来机械抖动和持续按下问题,因此工程中设置了边沿检测模块 edge_fall,将按键动作转换为单周期有效脉冲,便于计分模块按一次按键只执行一次加减操作。显示部分由 sevenseg_scan6 实现六位数码管动态扫描,可将 A 队和 B 队的三位比分分别显示,形成完整的篮球比分牌显示控制链路。

模块结构

工程顶层模块为 top_scoreboard,负责连接按键输入、计分控制和显示输出。 score_ctrl:双队伍计分控制模块,完成 A/B 队选择、加减分处理、复位清零和 0..999 范围限制。 edge_fall:按键边沿检测模块,用于将按键动作转换为有效脉冲信号,配合计分模块完成单次触发。 sevenseg_scan6:六位数码管动态扫描模块,用于显示两队三位比分。 top_scoreboard:系统顶层模块,整合各功能模块并形成完整篮球计分牌系统。

演示视频

演示视频展示了篮球计分系统的实际运行效果,可用于直观看到按键计分、队伍选择以及数码管比分显示的联动过程。

仿真图/仿真说明/设计文档图片

设计文档包含工程文件、程序文件、程序编译、RTL 图、仿真图、整体仿真图、按键检测模块、计分控制模块和数码管显示模块等内容,可用于理解模块划分、编译结果、RTL 结构和仿真验证过程。

篮球计分牌 FPGA 设计 VHDL Quartus 设计文档图片 image1.png

篮球计分牌 FPGA 设计 VHDL Quartus 设计文档图片 image10.png

篮球计分牌 FPGA 设计 VHDL Quartus 设计文档图片 image2.png

篮球计分牌 FPGA 设计 VHDL Quartus 设计文档图片 image3.png

篮球计分牌 FPGA 设计 VHDL Quartus 设计文档图片 image4.png

篮球计分牌 FPGA 设计 VHDL Quartus 设计文档图片 image5.png

篮球计分牌 FPGA 设计 VHDL Quartus 设计文档图片 image6.png

篮球计分牌 FPGA 设计 VHDL Quartus 设计文档图片 image7.png

篮球计分牌 FPGA 设计 VHDL Quartus 设计文档图片 image8.png

篮球计分牌 FPGA 设计 VHDL Quartus 设计文档图片 image9.png

部分代码

以下展示顶层模块 top_scoreboard 的部分代码,完整源码请下载压缩包查看。

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

-- 双队伍分数控制器,范围饱和在 0..999
-- team_sel = '0' 操作A队,'1' 操作B队
entity score_ctrl is
  port (
    clk      : in  std_logic;
    rst_n    : in  std_logic; -- 低有效复位
    team_sel : in  std_logic;
    add2_p   : in  std_logic;
    add1_p   : in  std_logic;
    sub2_p   : in  std_logic;
    sub1_p   : in  std_logic;
    score_a  : out unsigned(9 downto 0); -- 0..999 可用10位表示
    score_b  : out unsigned(9 downto 0)
  );
end entity;

architecture rtl of score_ctrl is
  signal sa, sb : unsigned(9 downto 0) := (others => '0');

begin
  process(clk)
  begin
    if rising_edge(clk) then
      if rst_n = '0' then
        sa <= (others => '0');
        sb <= (others => '0');
      else
        -- 默认保持原值,仅在对应按键脉冲时修改
        if team_sel = '0' then
          if add2_p = '1' then
            -- 加2分,带上限裁剪(不超过999)
            if to_integer(sa) + 2 > 999 then
              sa <= to_unsigned(999, sa'length);
            else
              sa <= to_unsigned(to_integer(sa) + 2, sa'length);
            end if;
          end if;
          if add1_p = '1' then
            -- 加1分,带上限裁剪(不超过999)
            if to_integer(sa) + 1 > 999 then
              sa <= to_unsigned(999, sa'length);
            else
              sa <= to_unsigned(to_integer(sa) + 1, sa'length);
            end if;
          end if;
          if sub2_p = '1' then
            -- 减2分,带下限裁剪(不小于0)
            if to_integer(sa) - 2 < 0 then
              sa <= (others => '0');
            else
              sa <= to_unsigned(to_integer(sa) - 2, sa'length);
            end if;
          end if;
          if sub1_p = '1' then
            -- 减1分,带下限裁剪(不小于0)
            if to_integer(sa) - 1 < 0 then
              sa <= (others => '0');
            else
              sa <= to_unsigned(to_integer(sa) - 1, sa'length);
            end if;
          end if;
        else
          if add2_p = '1' then
            -- 加2分,带上限裁剪(不超过999)
            if to_integer(sb) + 2 > 999 then
              sb <= to_unsigned(999, sb'length);
            else
              sb <= to_unsigned(to_integer(sb) + 2, sb'length);
            end if;
          end if;
          if add1_p = '1' then
            -- 加1分,带上限裁剪(不超过999)
            if to_integer(sb) + 1 > 999 then
              sb <= to_unsigned(999, sb'length);
            else
              sb <= to_unsigned(to_integer(sb) + 1, sb'length);
            end if;
          end if;
          if sub2_p = '1' then
            -- 减2分,带下限裁剪(不小于0)
            if to_integer(sb) - 2 < 0 then
              sb <= (others => '0');
            else
              sb <= to_unsigned(to_integer(sb) - 2, sb'length);
            end if;
          end if;
          if sub1_p = '1' then
            -- 减1分,带下限裁剪(不小于0)
            if to_integer(sb) - 1 < 0 then
              sb <= (others => '0');
            else
              sb <= to_unsigned(to_integer(sb) - 1, sb'length);
            end if;
          end if;
        end if;
      end if;
    end if;
  end process;

  score_a <= sa;
  score_b <= sb;
end architecture;

代码文件(付费下载)

📥 付费后此处显示完整工程压缩包下载链接。
1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » 篮球计分牌 FPGA 设计 VHDL Quartus

注册为本站会员,充值100得150,详情咨询客服

目前为止共有 *** 位优秀的会员加入! 立刻加入会员