基于FPGA的多人抢答器设计(附源码工程)

发布时间:2024-12-13  

功能说明:

1. 抢答器为四人抢答器。


2. 利用六位数码管进行显示抢答器相关信息。


3. 第一个数码管显示抢答器的状态,第二个数码管显示抢到的编号,没有抢答成功前显示数字0;第三至六显示抢答用的时间(以百分秒进行显示)。


4. 板卡默认空闲状态(第一个数码管显示字母A(空闲状态),第二个数码管显示数字0),当主持人按下抢答按钮后,进入抢答状态(第一个数码管显示字母C(抢答状态),第二个数码管显示0,第三至六数码管开始记录时间)


5. 在空闲状态期间,选手按下按键没有作用,当进入抢答状态后,选手谁先按下按键,第二个数码管显示对应的编号(1、2、3、4)。


6. 当选手抢答成功后,进入抢答成功状态(第一个数码管显示F),但是第二个数码管一直显示上一次抢答成功的编号,第三至六显示上一次抢答运行的时间。


7. 主持人按下复位按钮后,再次进入空闲状态,第二个数码显示0,时间清除。


8. 每次主持人按下抢答按钮或者其他四人抢答成功时,蜂鸣器“叮”一声。


使用平台:本次设计应用Altera的平台设计(芯片:EP4CE10F17C8N)。

仿真平台:Modelsim。

作者QQ:746833924

说明:本篇设计中不涉及到IP和原语,代码在其他平台依然可以适用;当其他板卡电路不同时,会导致不同的现象出现,如有需要修改代码请联系作者;如需作者使用的板卡,请联系作者;


设计思想如下:



module responder (  input     wire                clk, // 50MHz input     wire                rst_n,  input     wire                key_reset, // 主持人复位按钮 input     wire                key_start, // 主持人开始抢答按钮  input     wire                key_1, //第一组的抢答按钮 input     wire                key_2, //第二组的抢答按钮 input     wire                key_3, //第三组的抢答按钮 input     wire                key_4, //第四组的抢答按钮  output    wire    [5:0]       sel, //数码管的位选信号 output    wire    [7:0]       seg, //数码管的段选信号  output    wire                beep //蜂鸣器驱动信号);  wire                          flag_reset; //  主持人复位脉冲 wire                          flag_start; // 主持人开始抢答脉冲 wire                          flag_1; //第一组抢答脉冲 wire                          flag_2; //第二组抢答脉冲 wire                          flag_3; //第三组抢答脉冲 wire                          flag_4; //第四组抢答脉冲  wire              [23:0]      show_data; // 显示数据  wire                          flag_beep; // 蜂鸣器“叮”一声的脉冲


key_ctrl模块负责将外部的按键信号进行消抖,并且产生对应边沿变化时的脉冲;responder_ctrl模块负责根据脉冲信号和设计逻辑产生对应数字逻辑;seven_tube_drive(七段数码管驱动)模块负责将responder_ctrl模块产生的数字逻辑显示到数码管上;beep_ctrl模块负责根据一个脉冲驱动蜂鸣器“叮”一声。


key_ctrl模块设计思想为:按键信号是由外部机械式按键产生,每次按下或者抬起时,会产生一定的抖动。如果直接对其进行边沿检测就会导致多次触发。故而需要设计按键消抖,进而对消抖之后的波形进行边沿检测。消抖原理为:外部按键信号发生改变后,如果能够持续20ms,没有新的改变,就认为此次改变不是抖动,而是真正的按下,然后进行采样即可。


// 记录任意边沿之后没有遇到新的边沿的时间长度是否达到20Ms

//---------------------------------------------------------------------------------------

always@(posedgeclk)begin

if(rst_n ==1'b0)

     cnt_20ms <=20'd0;

else

if(pulse_key_negedge ==1'b1||pulse_key_posedge ==1'b1)

       cnt_20ms <=20'd1;

else

if(cnt_20ms >20'd0&&cnt_20ms <T_20ms)

         cnt_20ms <=cnt_20ms +1'b1;

else

           cnt_20ms <=20'd0;

end

// ---------------------------------------------------------------------------------------

// 任意边沿之后没有遇到新的边沿的时间长度达到20Ms,认为按键稳定,此时采样

//--------------------------------------------------------------------------------------

always@(posedgeclk)begin

if(rst_n ==1'b0)

     key_wave <=1'b1;

else

if(cnt_20ms ==T_20ms)

       key_wave <=key_rr;

else

       key_wave <=key_wave;

end

//--------------------------------------------------------------------------------------

// 对消抖之后的按键信号进行边沿检测

//---------------------------------------------------------------------------------------------

initialkey_wave_r =1'b1;

always@(posedgeclk)key_wave_r <=key_wave;

assignflag_neg =(key_wave_r ==1'b1&&key_wave ==1'b0)?1'b1:1'b0;

assignflag_pos =(key_wave_r ==1'b0&&key_wave ==1'b1)?1'b1:1'b0;

//--------------------------------------------------------------------------------------------


responder_ctrl模块的设计思想:首先根据主持人复位、起始脉冲和四组抢答脉冲,确定运行的模式。

reg               [1:0]         state; // 00: 空闲状态  01:抢答状态 10:抢答成功状态 // 根据按键进行状态切换  always @ (posedge clk) begin if (rst_n == 1'b0) state <= 2'd0; else if (flag_reset == 1'b1) state <= 2'd0; else if (state == 2'd0 && flag_start == 1'b1) state <= 2'd1; else if (state == 2'd1 && flag_1234 == 1'b1) state <= 2'd2; else state <= state; end 


根据运行的模式,以及显示的规则。


// 根据状态进行对应的显示 initial show_data[23:20] = 4'ha; always @ (posedge clk) begin if (rst_n == 1'b0)  show_data[23:20] <= 4'ha; else if (state == 2'd0) show_data[23:20] <= 4'ha; else if (state == 2'd1) show_data[23:20] <= 4'hc; else show_data[23:20] <= 4'hf; end


根据状态和外部按键,记录抢到的组号 ;

在空闲状态,显示组号为0;在抢答状态,那个脉冲有效,显示对应的组号;在抢答成功状态,保持抢答成功的组号即可。


 always @ (posedge clk) begin if (rst_n == 1'b0) show_data[19:16] <= 4'd0; else if (state == 2'd0) show_data[19:16] <= 4'd0; else if (state == 2'd1) begin if (flag_1 == 1'b1) show_data[19:16] <= 4'd1; if (flag_2 == 1'b1) show_data[19:16] <= 4'd2; if (flag_3 == 1'b1) show_data[19:16] <= 4'd3; if (flag_4 == 1'b1) show_data[19:16] <= 4'd4; end else  show_data[19:16] <= show_data[19:16]; end


在空闲状态中,10ms计时器清零,10ms的记录次数也清零;在抢答状态中,循环计时10ms,并且记录10ms的次数;在抢答成功状态,保持记录10ms的次数。


// 在抢答状态中,循环记录10ms  always @ (posedge clk) begin if (rst_n == 1'b0) cnt_10ms <= 19'd0; else if (state == 2'd1 && cnt_10ms < T_10ms - 1'b1) cnt_10ms <= cnt_10ms + 1'b1; else  cnt_10ms <= 19'd0; end // 在抢答状态中,记录经过了多少个10ms  always @ (posedge clk) begin if (rst_n == 1'b0) counter <= 32'd0; else if (state == 2'd0) counter <= 32'd0; else if (cnt_10ms == T_10ms - 1'b1) if (counter < 32'd9999) counter <= counter + 1'b1; else counter <= counter; else counter <= counter; end


将记录的10ms的次数,转变为BCD码,输出给数码管的驱动模块。


 // 将记录10ms的个数转换为BCD码输出  always @ (posedge clk) begin if (rst_n == 1'b0) show_data[15:0] <= 16'd0; else show_data[3:0] <= counter%10; show_data[7:4] <= counter/10 % 10; show_data[11:8] <= counter/100 % 10; show_data[15:12] <= counter/1000; end


每次主持人按下抢答按钮(在空闲状态)或者其他四人抢答成功(在抢答状态)时,产生一个蜂鸣器“叮”一声的脉冲。


assign flag_beep = ((state == 2'd0 && flag_start == 1'b1) || (state == 2'd1 && flag_1234 == 1'b1)) ? 1'b1 : 1'b0;


beep_ctrl模块的设计原理为:蜂鸣器为无源蜂鸣器,需要给一定频率的方波才可以出声音。


// 设计原理:外部输入脉冲,蜂鸣器出声音200ms(正好是“叮”一声)。

// 蜂鸣器出声音准备采用500hz的方波来驱动无源蜂鸣器。


首先设计一个脉冲有效后,记录200ms的时间。


// 脉冲拉高后,记录200ms  always @ (posedge clk) begin if (rst_n == 1'b0) cnt_200ms <= 24'd0; else if (flag_beep == 1'b1 && cnt_200ms == 0) cnt_200ms <= cnt_200ms + 1'b1; else if (cnt_200ms > 24'd0 && cnt_200ms < T_200ms - 1'b1) cnt_200ms <= cnt_200ms + 1'b1; else cnt_200ms <= 24'd0; end


在200ms期间,驱动蜂鸣器产生500hz的方波。

// 记录1ms  always @ (posedge clk) begin if (rst_n == 1'b0) cnt_1ms <= 16'd0; else if (cnt_1ms < T_1ms - 1'b1) cnt_1ms <= cnt_1ms + 1'b1; else cnt_1ms <= 16'd0; end // 在200ms期间,每到1ms,beep进行取反  always @ (posedge clk) begin if (rst_n == 1'b0) beep <= 1'b0; else if (cnt_200ms > 24'd0 && cnt_1ms == T_1ms - 1'b1) beep <= ~beep; else beep <= beep; end

以上即为beep_ctrl模块的设计思想;


七段数码管为普通六位一体的共阳极数码,采用动态驱动的方式,在此不再赘述。


下板后,我们也可以使用按键进行主持人复位、主持人抢答开始、四组抢答,观测运行情况。
空闲状态如下:


抢答状态中,百分秒开始运行。



当有抢答按键按下后,进入抢答成功状态,锁定组号和抢答运行的时间。




主持人再次按下复位按键,回到空闲状态,就可以重复以上过程。


下板后,演示视频(链接)如下:
https://www.bilibili.com/video/BV1vnYFeNEfK/?vd_source=b5405faeab8632f02533bcbfc5e52e55
     本设计所有内容(设计代码、设计工程)链接为:

链接:https://pan.baidu.com/s/1PAv-4N10u7K3EZQLdayxlA
提取码:m3xw

END


文章来源于:21IC    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    使用51单片机设计一个带语音报数功能的抢答器原理图;现在市面上的抢答器类型很多,带有语音功能的抢答器不是很多且其价格较贵。本文介绍一款带有语音报数功能的抢答器抢答器由单片机(AT89S52)、语音......
    抢答器控制系统设计案例解析;说到抢答器,大家并不陌生,抢答器一般采用单片机或专用控制板来设计和实现功能,对于搞工控和学习工控的人员来说,那么使用我们手中PLC该如何实现呢?这个问题有没有想过?如若......
    51单片机抢答器设计;任务描述 某企业承担了某抢答比赛抢答器系统的设计,要求如下:①可同时供3名选手参加比赛,他们的编号分别是1、2、3,每名选手各用一个抢答按钮,按钮的编号与选手的编号相对应,分别......
    使用单片机设计抢答器的资料和程序概述;在知识比赛中, 特别是做抢答题目的时候, 在抢答过程中,为了知道哪一组或哪一位选手先答题,必须要设计一个系统来完成这个任务。如果在抢答中,靠视......
    使用51单片机实现抢答器的设计资料和代码说明;在知识比赛中, 特别是做抢答题目的时候, 在抢答过程中,为了知道哪一组或哪一位选手先答题,必须要设计一个系统来完成这个任务。如果在抢答中,靠视......
    单片机抢答器的设计资料详细说明;在知识比赛中, 特别是做抢答题目的时候, 在抢答过程中,为了知道哪一组或哪一位选手先答题,必须要设计一个系统来完成这个任务。如果在抢答中,靠视......
    基于51单片机的多功能八路抢答器设计;1.功能介绍 多功能八路抢答器是基于51单片机来设计的,除了可以实现最基本功能——8路抢答外,还具有自动处理犯规选手,抢答时间调整,还可以进行答题,计分,并且......
    基于FPGA的多人抢答器设计(附源码工程); 功能说明: 1. 抢答器为四人抢答器。 2. 利用六位数码管进行显示抢答器......
    实验21:智力竞赛抢答器;实验目的 (1)熟悉和掌握开发流程和软件使用方法; (2)通过实验理解和掌握原理; (3)学习用描述方法描述。 实验任务 本实验的任务是设计一个智力竞赛,带复......
    51单片机对无线抢答器的设计;#include * 自定义Macro //编码的均为反向编码 #define CLEAR 0x7f //定义清空的反码 #define LED_BEGIN 0x01......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>