智力竞赛抢答器的Verilog HDL建模
一、设计任务与要求
智力竞赛抢答器Verilog HDL要求有5组参赛者进行抢答,有五个抢答信号进行抢答。当有抢答选手按下抢答键后系统能够快速准确的判断是那一组选手按下了抢答信号,由于系统比较小,速度比较快一般不会有同时按下的可能,所以只有五种状态,然后系统能够根据这五种状态进行适时的显示和提示。本系统设计的是以数码管显示对应选手的编码,并且显示选手之前对应的LED灯。当有选手按下以后就对抢答信号进行锁存,其他选手的输入无效。然后就是对抢答进行时间限制了,根据设定的时间进行倒计时,当倒计时完成还没有人抢答的时候系统发出警报声音提示时间已经到了。当有选手在设定的时间里面完成抢答后,系统自动停止计时。系统需要主持人进行控制,当主持人按下开始以后才能抢答,否则抢答无效。还有清除复位键,抢答完成以后按复位键即可清除已有的状态。通过Verilog HDL建模实现系统的各个模块功能,最后将系统连接完成,进行编译仿真。
二、方案设计与论证 2.1方案论证
本系统采用Verilog HDL语言进行建模,总共分为五个模块,分别是抢答模块,锁存器模块,计数模块,声音产生模块、声音信号控制模块。抢答模块有三个输入,分别是抢答信号,清除信号,和使能信号。抢答模块有五组选手进行抢答,当使能信号有效以后,抢答信号其中一个有效则进行抢答锁存,然后输出抢答以后的各种状态,并且显示。计数模块可以进行倒计时,在使能信号有效的时候进行倒计时,然后发出控制信号控制声音控制模块,进行声音警报。
方案一:采用单片机来实现智力竞赛抢答器。基于单片机的智力竞赛抢答器的工作原理是采用单片机最小系统,用程序查询方式采用动态显示组号。主持人按下开始抢答键才可以抢答。主持人没有按下开始抢答按纽(start),有人抢答则抢答违规,报警并显示组号,主持人按下开始抢答开关重新抢答。主持人按下开始抢答按纽(P3.0),蜂鸣响声提示,数码管30秒倒计时抢答,蜂鸣器响声提
示并显示他的组号,30秒内有人抢答则最后五秒倒计时警报。单片机最小系统、抢答按键模块(一位数码显示)、显示模块、显示驱动模块、抢答开关模块、蜂鸣器音频输出模块。基于单片机的智力竞赛抢答器硬件原理图如下:
图一:基于单片机的智力竞赛抢答器
通过软件设计能够完成任务要求的基本功能,软件可以采用C语言编写,由于系统不是很大编写难度不是很大,通过然间查询方式,查询是否有抢答按键按下,当有抢答按键按下的时候系统开始通过数码管DS1显示抢答选手的编码,LED等(D1~D5)显示对应选手面前的LED灯。同时系统开始倒计时,计时器部分可以通过单片机定时器中断实现,当定时器计时完成后还没有抢答则进行报警5s,表示抢答结束。用单片机实现的智力竞赛抢答器是基于软件和硬件的电路,实现起来比较简单,但是在运行时候由于单片机采用的是软件查询的方式,系统在运行的时候要一步一步查询软件的执行,耗时比较多。
方案二、采用FPGA来实现智力竞赛抢答器,用Verilog HDL语言进行建模,然后将各个模块按照设计的方案相连接,进行电路仿真分析通过以后就可以下载到FPGA板通过相应引脚的连接即可以实现电路的功能。FPGA的使用非常灵活,同一片FPGA通过不同的编程数据可以产生不同的电路功能。通过FPGA设计
电路首先要建立各个模块,本系统可以通过一个抢答模块,锁存模块,计数模块以及声音控制模块等来实现电路的功能,通过各个模块之间的相互连接就能够建立一个完整的电路系统了。系统的整体框图如下图所示:
图二:基于FPGA智力竞赛抢答器
通过综合分析以后,得到的RTL图如下:
图三:RTL图
2.2 综合分析
综合以上分析我们可知FPGA和单片机都可以实现智力竞赛抢答器这一系统,但是FPGA运行速度快 FPGA内部集成锁项环,可以把外部时钟倍频,核心频率可以到几百M,而单片机运行速度低的多.在高速场合,单片机无法代替FPGA,在这一系统中当选手进行抢答的时候,要求系统的运行速度较快,否则当有两个选手抢答的时间相差不是很大的时候,对于单片机系统通过查询方式占用很大的系统资源,运行速度比较慢,会造成抢答判断错误。单片机IO口有限,而FPGA动辄数百IO,可以很容易用不同IO连接各外设。所以我们选用FPGA来实现智
力竞赛抢答器,用Verilog HDL语言实现编程。
三、模块设计及程序清单
本次设计的抢答器系统由5部分模块组成,分别是:选手抢答模块、锁存模块、计数模块、声音警报模块、声音信号控制模块。
3.1 抢答模块
抢答模块主要完成两个功能,一是准确的判断出第一位抢答者,二是当选手抢答后送出声音使能信号,作为下个模块的声音的触发信号。其Verilog HDL源程序如下:
case (player) //选手抢答信号 5'b00001 : //五位抢答信号判断 begin
y1 <= 1 ; y2 <= 5'b00001 ; ea <= 1'b0 ; end ??
default : //没有相符合的信号时则执行此句
begin end
y1<= 0; y2=5'b00000; ea<=1;
endcase
相关推荐: