1. 项目概述
这个基于Verilog HDL和Quartus II平台的抢答器系统设计,是我在一次电子设计竞赛中完成的实战项目。它完美解决了传统抢答器反应速度慢、显示不直观的问题,实现了从信号采集到结果显示的全流程数字化控制。
整套系统由三个核心模块构成:计时模块精确到毫秒级响应,计分模块支持多种计分策略灵活配置,显示控制模块则通过动态扫描驱动LED数码管。所有功能都在Altera Cyclone IV系列FPGA上实现,实测抢答响应时间小于5ms,完全满足各类知识竞赛、课堂互动的严苛要求。
2. 硬件架构设计
2.1 系统整体框图
系统采用典型的FPGA外围电路设计:
code复制 +---------------+
| 按键输入模块 |--[消抖电路]--
+-------+-------+ |
| v
+-------+-------+ +-----+-----+
| LED显示模块 |<------| FPGA主控 |
+-------+-------+ +-----+-----+
^ |
+-------+-------+ |
| 数码管驱动电路 |<------------+
+---------------+
2.2 关键器件选型
- FPGA芯片:EP4CE6E22C8N(Cyclone IV系列)
- 选择理由:6000LEs逻辑单元满足设计需求,内置PLL可生成精准时钟
- 显示器件:4位共阳数码管(SM420561K)
- 驱动电流:每段20mA(需加限流电阻)
- 按键:665mm轻触开关
- 触点寿命:10万次以上
3. Verilog核心模块实现
3.1 计时模块设计
verilog复制module timer(
input clk_50M, // 50MHz主时钟
input reset_n, // 异步复位
input start, // 计时使能
output [15:0] time_out // 当前计时值(ms)
);
reg [31:0] counter;
always @(posedge clk_50M or negedge reset_n) begin
if(!reset_n)
counter <= 32'd0;
else if(start) begin
if(counter >= 32'd49_999) // 1ms计数
counter <= 32'd0;
else
counter <= counter + 1;
end
end
assign time_out = counter / 32'd50_000; // 转换为毫秒值
endmodule
关键参数计算:
- 50MHz时钟周期 = 20ns
- 1ms所需计数 = 1ms/20ns = 50,000次
- 实际采用49,999次计数(从0开始)
3.2 抢答判决逻辑
采用优先级编码器实现:
verilog复制always @(posedge clk_50M) begin
casex(btn_in)
8'bxxxxxxx1: winner <= 3'd0;
8'bxxxxxx10: winner <= 3'd1;
// ...其他位同理
default: winner <= 3'b111; // 无效状态
endcase
end
重要提示:必须添加按键消抖处理,典型消抖时间取20ms
3.3 数码管动态扫描
verilog复制// 分频产生1kHz扫描时钟
always @(posedge clk_50M) begin
if(scan_cnt >= 24'd49_999) begin
scan_cnt <= 0;
scan_pos <= scan_pos + 1;
end else
scan_cnt <= scan_cnt + 1;
end
// 位选信号生成
assign dig_sel = 4'b1111 & ~(1 << scan_pos[1:0]);
4. Quartus II工程配置要点
4.1 引脚分配策略
| 信号名称 | FPGA引脚 | 备注 |
|---|---|---|
| clk_50M | PIN_E1 | 全局时钟输入 |
| btn[0] | PIN_M1 | 选手1抢答按键 |
| seg[7:0] | PIN_xx | 数码管段选 |
| dig_sel[3:0] | PIN_xx | 位选信号 |
4.2 时序约束设置
tcl复制create_clock -name clk_50M -period 20.000 [get_ports clk_50M]
set_input_delay -clock clk_50M 2.000 [get_ports btn*]
set_output_delay -clock clk_50M 5.000 [get_ports seg* dig_sel*]
5. 实测问题与解决方案
5.1 数码管亮度不均
现象:最右侧数码管明显偏暗
原因:动态扫描时位选信号保持时间不足
解决:
verilog复制// 修改扫描分频参数
parameter SCAN_DIV = 24'd9_999; // 改为5kHz扫描频率
5.2 误触发问题
现象:未按键时随机触发抢答
排查步骤:
- 用SignalTap抓取按键信号波形
- 发现电源波动导致假信号
- 增加硬件RC滤波(10kΩ+0.1μF)
6. 系统优化方向
- 无线扩展:添加nRF24L01模块实现远程抢答
- 语音提示:通过PWM驱动蜂鸣器播放提示音
- 网络同步:使用W5500实现多终端分数同步显示
实际调试中发现,当采用更快的扫描频率(如10kHz)时,需要特别注意数码管的响应特性。某次比赛中我们遇到显示残影问题,最终通过调整扫描占空比至70%解决。这个细节在器件手册中往往不会特别说明,需要实际测试验证。