FPGA设计实现四人抢答器

题目:

  设计实现一个可容纳四组选手参赛的抢答器系统,每组设一个抢答按钮。答题开始后,由主持人按下“复位”键(开始键)后进入抢答环节,当某个小组抢答成功时,抢答器系统发出半秒的低频音(DO),显示该组别序号并点亮该组“选手指示灯”直至系统复位。此时进入答题计时环节,若超过 30 秒仍未答出,抢答器系统发出 1 秒的高频音(SI)示警。由裁判员按下“复位”键,开始新一轮答题。


一. 模块设计  

  本实验设计实现一个抢答器系统,主要由答题计时模块timer,数码管显示模块display_595,蜂鸣器发声模块buzzer,抢答模块sel,按键消抖模块key_filter和顶层模块responder。

  其中display_595模块中包含对display模块以及hc595_ctrl模块的例化。

  整体模块框图输入输出信号如下图所示:

  输入信号:系统时钟sys_clk, 复位信号sys_rst_n,四路抢答器按键信号key_in[3:0],蜂鸣器驱动信号beepout,数码管显示驱动信号stcp,shcp,ds,oe,以及选手指示灯信号 led_out[3:0]。

二. FPGA硬件电路原理图

1. 六位八段数码管

  其具体使用方法见文章:Altera EP4CE10 征途Pro开发板数码管显示原理(以实现模60计数器为例)-CSDN博客

2. 无源蜂鸣器buzzer

  相对于有源蜂鸣器,无源蜂鸣器的成本更低,声音频率可控。而有源蜂鸣器因其内部自带振荡源,只要加上适当的直流电源即可发声,程序控制较为方便。无源蜂鸣器与有源蜂鸣器不同,因其内部不带震荡源,所以其无法向有缘蜂鸣器那样直接用直流信号驱动,这里需要使用PWM方波才能驱动其发声。

  其具体使用方法见文章:无源蜂鸣器的驱动实验-CSDN博客

3. 按键key

  开发板上使用的机械按键也是按键的一种,特点是:接触电阻小 ,手感好,按键按下或弹起时有“滴答”清脆声;但由于其构造和原理,在按键闭合及断开的瞬间均伴随有一连串的抖动。

       具体按键消抖方法的设计请参阅文章:按键消抖模块设计实现-CSDN博客

三. Verilog程序设计

1. 答题计时模块timer

  当有人抢答时,计时器进入三十秒的倒计时,从30计到00。sel_flag表示抢答信号。

模块内包含一个分频器,产生一秒的标准脉冲clk1。

核心代码如下:

always@( posedge clk1 or negedge sys_rst_n )
	if( sys_rst_n == 1'b0 )
		begin
			timer[7:4] <= 4'd3;
			timer[3:0] <= 4'd0;
		end
	else if( sel_flag != 4'b1111 )
		begin 	
			if( timer[7:4] == 4'd0  &&  timer[3:0] == 4'd0 )
					timer[7:0] <= timer[7:0] ;
			else if( timer[3:0] == 4'd0 )
				begin
					timer[7:4] <= timer[7:4] - 1'b1 ;
					timer[3:0] <= 4'd9;
				end
			else 
				timer[3:0] <= timer[3:0] - 1'b1 ;
		end
	else
		timer[7:0] <= timer[7:0];
	
		
always @(posedge sys_clk or negedge sys_rst_n)
	if(sys_rst_n == 1'b0)
		begin 
			en <= 1'b1 ;
			data <= 4'd0;
		end 
	else if( en )
		begin	
			case(sel_flag)
				4'b1110: 
					begin
						data <= 4'd1;
						en   <= 1'b0;
					end
				4'b1101:
					begin
						data <= 4'd2;
						en 	 <= 1'b0;
					end
				4'b1011: 
					begin
						data <= 4'd3;
						en   <= 1'b0;
					end
				4'b0111: 
					begin
						data <= 4'd4;
						en   <= 1'b0;
					end
				default: data <= 4'd11;
			endcase
		end

2. 蜂鸣器发声模块buzzer

  当有人抢答时,发出半秒的低频音;答题时间超时时,发出一秒的高频音。

核心代码如下:

module buzzer
(

		input 	wire 		sys_clk		,
		input 	wire 		sys_rst_n 	,
		input 	wire [7:0] 	timer		,
		input 	wire [3:0]  sel_flag	,
		
		output 	reg 		beepout 	

);

parameter 	DO 		 = 18'd190840	;
para
  • 25
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是既白呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值