名称:基于FPGA的电子抢答器的设计Verilog代码Quartus仿真
软件:Quartus
语言:Verilog
代码功能:
基于FPGA的电子抢答器
(1)主持人有一个控制选手抢答的开关:只有当主持人按下该键时选手才能抢答;在按开始按钮前抢答属于违规。参赛者在抢答中,按下分配给他们的按钮。每个按钮可以连接到FPGA的不同输入端口[7],这样可以区分来自不同参赛者的按键输入。
(2)当按钮被按下时,鉴于输入信号可能会因为机械抖动而产生多次波动。这种“抖动”会导致FPGA误判按键被多次按下。因此,通过去抖动算法使用采样和计时器来滤除短暂的噪声信号[8]。抢答器具有定时抢答功能,且一次抢答的时间设定为20秒。以FPGA实现抢答时间限制,在规定时间内未抢答则自动锁定,当主持人启动“开始”键后,数码管开始倒数计时,直到为零,若仍没人抢答则该轮抢答轮空,设备自动显示加0,并开启下一轮[9]。
(3)在FPGA通过并行处理逻辑,检测到按键被按下的瞬间后,启动一个定时器。这个过程能够指明哪个按钮最早被触发,从而确定抢答的优先级。这可以通过设置一个状态机来实现跟踪每个按钮的按下状态,并计算按下的时间[10]。一旦确定顺序,系统可以生成相应的信号,便于后续处理。
(4)当某个按钮被成功确认按下时,FPGA会驱动显示LED灯模块来显示该参赛者的编号。当选手抢答成功后,可以开始回答问题,如果回答正确,主持人按下按键,为该选手加一分,然后进行下一轮抢答。在有人抢答后,系统通过音效模块发出提示音,通知全部参与者抢答结果。
演示视频:
1、工程文件
2、程序文件
3、程序编译
4、RTL图
5、testbench
6、仿真图
整体仿真图
按键消抖模块
控制模块
计时模块
分数控制模块
数码管显示模块
部分代码展示:
//按键消抖模块
module key_debounce(
input clk,
input key_in,//输入
output key_negedge//按键下降沿
);
// inner signal
reg [1:0] key_in_r=0;
wire pp;
reg [19:0] cnt_base=0;
reg key_value_r=1;
reg key_value_rd=1;
//内部信号
always@(posedge clk)
key_in_r<= {key_in_r[0],key_in};
// 检测有输入有没有变化
assign pp = key_in_r[0]^key_in_r[1];
//延迟计数器
always@(posedge clk)
if(pp==1'b1)
cnt_base <= 20'd0;
else
cnt_base <= cnt_base + 1;
//输出
always@(posedge clk)
//if(cnt_base==20'hfffff)//仿真时减小计数器为f
if(cnt_base==20'h0000f)
key_value_r <= key_in_r[0];
488