news 2025/12/29 10:11:32

篮球计时器FPGA设计:Verilog语言实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
篮球计时器FPGA设计:Verilog语言实现

篮球计时器fpga设计 verilog语言编写 支持quartus,modelsim,vivado设计 1.数码管显示每小节12分钟倒计时 2.数码管显示24s倒计时 3.数码管显示两队比分 4.按键加分(加一,加二,加三) 5.设有小节比赛开始结束按键,按下后,12分钟计数器重新计数,分数仍然保持不变 6.全局结束按键,按下后一切归零 7.暂停按键,按下后24s和12分钟计时器均暂停计时

在FPGA开发的世界里,实现一个篮球计时器是个有趣且具有实际应用价值的项目。今天咱就唠唠如何用Verilog语言打造一个满足多种需求的篮球计时器,并且它还能在Quartus、Modelsim、Vivado等常见设计平台上运行。

1. 数码管显示每小节12分钟倒计时

首先,咱们得有个计数器来记录时间。12分钟也就是$12\times60 = 720$秒,咱们用Verilog写个计数器模块。

module count_12min ( input wire clk, // 时钟信号 input wire rst, // 复位信号 input wire start, // 开始信号 output reg [9:0] sec // 秒数,最大720,10位足以 ); always @(posedge clk or posedge rst) begin if (rst) begin sec <= 10'd720; // 复位时初始化为12分钟 end else if (start) begin if (sec > 10'd0) begin sec <= sec - 1; // 每秒减1 end end end end

这段代码定义了一个count_12min模块,它接收时钟clk、复位rst和开始start信号。在时钟上升沿或者复位信号有效时,会根据条件对sec进行操作。复位时,sec被初始化为720,开始计时后,如果sec大于0,每秒减1。

2. 数码管显示24s倒计时

类似地,对于24秒倒计时,我们也写个计数器。

module count_24s ( input wire clk, input wire rst, input wire start, output reg [4:0] sec_24 // 秒数,最大24,5位足以 ); always @(posedge clk or posedge rst) begin if (rst) begin sec_24 <= 5'd24; end else if (start) begin if (sec_24 > 5'd0) begin sec_24 <= sec_24 - 1; end end end end

这个count_24s模块和前面12分钟倒计时的模块思路一样,只是计时范围变成了24秒。

3. 数码管显示两队比分

比分显示也得有计数器。咱们假设每队比分最多99分。

module score_counter ( input wire clk, input wire rst, input wire add_1, // 加1分信号 input wire add_2, // 加2分信号 input wire add_3, // 加3分信号 output reg [5:0] score // 比分,最大99,6位足以 ); always @(posedge clk or posedge rst) begin if (rst) begin score <= 6'd0; end else begin if (add_1) begin score <= score + 1; end else if (add_2) begin score <= score + 2; end else if (add_3) begin score <= score + 3; end end end end

scorecounter模块根据add1add2add3信号来增加比分,复位时比分清零。

4. 按键加分(加一,加二,加三)

前面比分计数器模块里已经体现了按键加分的逻辑,当对应的add1add2add_3信号有效时,比分就会相应增加。在实际电路连接中,这些信号就来自按键。

5. 设有小节比赛开始结束按键,按下后,12分钟计数器重新计数,分数仍然保持不变

我们得在顶层模块里处理这个逻辑。假设我们有个顶层模块basketball_timer

module basketball_timer ( input wire clk, input wire rst_global, // 全局复位 input wire rst_quarter, // 小节复位 input wire start_quarter, // 小节开始 input wire pause, // 暂停 input wire add_1_team1, add_2_team1, add_3_team1, input wire add_1_team2, add_2_team2, add_3_team2, output wire [9:0] sec_12min, output wire [4:0] sec_24, output wire [5:0] score_team1, output wire [5:0] score_team2 ); count_12min u1 ( .clk(clk), .rst(rst_quarter), .start(start_quarter), .sec(sec_12min) ); count_24s u2 ( .clk(clk), .rst(rst_global | pause), .start(1'b1), .sec_24(sec_24) ); score_counter u3 ( .clk(clk), .rst(1'b0), .add_1(add_1_team1), .add_2(add_2_team1), .add_3(add_3_team1), .score(score_team1) ); score_counter u4 ( .clk(clk), .rst(1'b0), .add_1(add_1_team2), .add_2(add_2_team2), .add_3(add_3_team2), .score(score_team2) ); endmodule

在这个顶层模块里,count12min模块的复位信号连接到rstquarter,当小节复位按键按下,12分钟计数器重新计数。而比分计数器的复位信号一直为0,保证分数不会因为小节复位而清零。

6. 全局结束按键,按下后一切归零

在顶层模块里,count24s模块的复位信号连接了rstglobal,当全局结束按键按下(rstglobal有效),24秒计数器复位。同时比分计数器也可以通过修改代码,在rstglobal有效时复位,就能实现全局结束按键按下后一切归零。

module score_counter ( input wire clk, input wire rst, input wire rst_global, // 新增全局复位信号 input wire add_1, input wire add_2, input wire add_3, output reg [5:0] score ); always @(posedge clk or posedge rst or posedge rst_global) begin if (rst_global) begin score <= 6'd0; end else if (rst) begin score <= 6'd0; end else begin if (add_1) begin score <= score + 1; end else if (add_2) begin score <= score + 2; end else if (add_3) begin score <= score + 3; end end end end

7. 暂停按键,按下后24s和12分钟计时器均暂停计时

在顶层模块里,count_24s模块的复位信号连接了pause,当暂停按键按下,pause信号有效,24秒计数器暂停计时。对于12分钟倒计时模块,我们可以稍微修改下代码。

module count_12min ( input wire clk, input wire rst, input wire start, input wire pause, // 新增暂停信号 output reg [9:0] sec ); always @(posedge clk or posedge rst) begin if (rst) begin sec <= 10'd720; end else if (start &&!pause) begin // 只有start有效且pause无效时才计时 if (sec > 10'd0) begin sec <= sec - 1; end end end end

这样就实现了暂停按键按下后,24秒和12分钟计时器均暂停计时的功能。

通过这些Verilog模块的组合,咱们就实现了一个功能丰富的篮球计时器,并且能在常见的FPGA设计平台上大展身手啦!

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

自监督学习SimCLR:TensorFlow 2.x复现

自监督学习SimCLR&#xff1a;TensorFlow 2.x复现 在当今深度学习的浪潮中&#xff0c;一个核心矛盾日益凸显&#xff1a;模型能力越强&#xff0c;对标注数据的依赖就越深。然而&#xff0c;人工标注成本高昂、周期漫长&#xff0c;尤其在医疗、工业检测等专业领域&#xff0c…

作者头像 李华
网站建设 2025/12/27 18:38:46

MLIR在TensorFlow编译栈中的作用与价值

MLIR在TensorFlow编译栈中的作用与价值 在今天的工业级AI系统中&#xff0c;一个看似简单的问题却异常棘手&#xff1a;如何让一个在服务器上训练好的深度学习模型&#xff0c;高效、稳定地跑在从数据中心GPU到手机端NPU的各类硬件上&#xff1f;这不仅仅是“换个设备运行”那么…

作者头像 李华
网站建设 2025/12/27 18:36:39

构建稳健高效的AI智能体:7种核心模式详解(收藏版)

本文深入探讨AI智能体的设计模式&#xff0c;区分工作流&#xff08;遵循预定义路径&#xff09;与智能体&#xff08;具有更高自主权&#xff09;。系统介绍3种工作流模式&#xff08;提示链、路由、并行化&#xff09;和4种智能体模式&#xff08;反思、工具使用、规划、多智…

作者头像 李华
网站建设 2025/12/27 18:36:34

通义千问Qwen模型TensorFlow版开发设想

通义千问Qwen模型TensorFlow版开发设想 在大模型日益深入产业落地的今天&#xff0c;一个关键问题摆在面前&#xff1a;如何让像通义千问这样的先进语言模型&#xff0c;真正稳定、高效地运行在银行客服系统、医疗问诊平台或智能制造调度中心这类对可靠性要求极高的生产环境中&…

作者头像 李华
网站建设 2025/12/27 18:36:00

西门子S7 - 1500之1511PLC自动配料系统开发探秘

西门子S7-1500系列&#xff0c;1511PLC 自动配料系统 PID程序控阀门开度 &#xff0c;模拟量转换 &#xff0c;博途画面 &#xff0c;程序完整 &#xff0c;适合程序参照和学习&#xff0c;博图15及以上可以打开 特殊商品在自动化生产领域&#xff0c;西门子S7 - 1500系列PLC凭…

作者头像 李华