fpga抢答器
- 格式:docx
- 大小:35.84 KB
- 文档页数:9
基于FPGA的抢答器设计
摘要:抢答器使用八个拨码开关,供选手抢答使用。选择共阳数码管显示倒计时和抢答选手号。在每个拨码开关的上方都有LED灯。用一个独立按键独立按键实现复位和抢答开始功能。开始,先十秒倒计时,到零后开始抢答,成功后,显示选手号和对应LED亮。按复主持人通过复位按键清除抢答信息,并重新开始 。直接在开发板板上使用。
关键词:抢答器;数码管;FPGA
1、引言
硬件描述语言(Hardware Description Language )是硬件设计人员和电子设计 自动化EDA工具之间的界面。 其主要目的是用来编写设计文件,建立电子系统 行为级的仿真模型。即利用计算机的巨大能力对用Verilog HDL或
VHDL建模 的复杂数字逻辑进行仿真,然后再自动综合以生成符合要求且在电路结构上可以 实现的数字逻辑Netlist,根据型仿真验证无误后用于制造ASIC 芯片或写入 EPLD和 FPGA 器件中。Verilog HDL是一种硬件描述语言( HDL:Hardware DiscriptionLanguage),是一种以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑 电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。
Verilog HDL就是在用途最广泛的C 语言的基础上发展起来的一种件描述语 言,它是由 GDA(Gateway Design Automation)公司的 PhilMoorby在 1983 年末首 创的,最初只设计了一个仿真与验证工具,之后又陆续开发了相关的故障模拟与 时序分析工具。Verilog HDL的最大特点就是易学易用,如果有C 语言的编程经验,可以在 一个较短的时间内很快的学习和掌握,因而可以把Verilog HDL内容安排在与 ASIC 设计等相关课程内部进行讲授,由于HDL语言本身是专门面向硬件与系统 设计的,这样的安排可以使学习者同时获得设计实际电路的经验。2、整体方案设计
2.1系统总体框图和原理
图 2.1 系统总体框图
抢答器整体电路设计有以下几个目标:
( 1)实现八人抢答器,有人抢答成功后,其他人再抢答无效;
( 2)通过倒计时来提示抢答开始,并在数码管上显示抢答者的序号以及显示相应LED灯·;
( 3)主持人通过复位按键清除抢答信息,并开始 9秒的答题倒计时,
当倒计时结束时,此时可以开始抢答 我们设计的总体方案是将整个任务分成4个部分即分频(延时)部分、抢答模块、倒计时显示模块并LED显示模块。3、功能模块设计
3.1分频模块
因为试验箱上的时钟是40M的,而倒计时模块中要用到1hz 倒计时所以要
对 4M 时钟进行分频产生1hz,进行 9 秒钟倒计时,也可以说是延时程序。
3.2倒计时模块
在倒计时模块中, 当主持人启动倒计时开关(和复位同在一个独立按键)后,
数码管上显示 秒的倒计时 。
3.3抢答模块
抢答模块要具有第一信号鉴别、锁存功能。 第一信号鉴别锁存的关键是准确 判断出第一抢答者并将其锁存,在得到第一信号后, 将输入端封锁, 使其他组的 抢答信号无效,可以用触发器或锁存器实现。设置抢答按钮key[0]、key[1]、 key[2]、key[3]、key[4]、key[5] 、key[6]、key[7]主持人复位信号res。res按一次时,第一信号鉴别、锁存电路、答题计时电路复位;res按一次时,开始抢答,由第 一信号鉴别锁存电路形成第一抢答信号,并进行组别显示。
3.4LED模块
在选手抢答成功,则LED灯亮,没人抢答则灯不亮。
4、硬件设计
4.1数码显示部分
数码管有共阴极和共阳极两种,对于共阳数码管, 字形驱动输出 0 有效,字 位驱动输出 1 有效;而对于共阴数码管则相反,即:字形驱动输出 1
有效,字位驱动输出 0 有效显示器普遍地用于直观地显示数字系统的运行状态和工作数据, 按照材料及产品工艺,单片机应用系统中常用的显示器有发光二极管 LED显 示器、液晶 LCD显示器、 CRT显示器等。 LED显示器是现在最常用的显示器之一, 发光二极管( LED)由特殊的半导体材料砷化镓、磷砷化镓等制成,可以单独使 用,也可以组装成分段式或点阵式 LED显示器件(半导体显示器) 。分段式显示 器( LED数码管)由 7 条线段围成 8
字型,每一段包含一个发光二极管。外加正 向电压时二极管导通,发出清晰的光。只要按规律控制各发光段亮、灭,就可以 显示各种字形或符号。 LED数码管有共阳、共阴之分。
数码管实际上就是八个发光二极管,它们以两种方式连接,如果将其阴极连接在一起,这种方式构成的数码管成为共阴数码管;如果将其阳极连接在一起,这种方式构成的数码管为共阳数码管。 通过 FPGA 的八个控制口即可控制7 段数 码管各种不同显示,以及四个位选通可以控制那位数码管发光。
4.2按键的分配
按键一般都是以电平触发,在实验板中是以按下为高电平,在引脚分配时要 对照好按键分配图进行分配资源。使用八个拨码开关和一个独立按键。
本实验的各个引脚的分配请细看附录,即是 FPGA 芯片中的引脚, 必需与电路板的硬件一一对应。
5、程序分析
5.1各个变量的定义
定义需要各端口,类型,位宽等。
/*********************** 各个变量的定义******************************/
module qsf( buzzer,clk,res,key,seg,out,
DP,LED);/*********声明 *****/
input clk,res;/*********时钟与主判的引脚 *****/
input [7:0]key;/*********** 八个抢答按键 *******/
output reg LED; /***********LED显示 *******/
reg m; /********** 锁存信号 m**********/
output reg[6:0]out; /********** 数码管的 7 段********/
output reg DP; /********** 数码管的 小数点********/
output reg [3:0]seg; /****** 数码管的位选择定义 ******/
reg[30:0] counter;/**********计数存储 ***********/
always@(posedge clk) /*******主时钟上升沿触发 *******/
begin if(res==0)begin s=0; m=0;counter=0;buzzer=1;end/***** 定义初始化 *******/
5.2倒计时模块
开始倒计时从“9”到“0”,LED灯在“8”到“1”显示相应的灯。
case(s)/*******分支语句 *******/
0:begin out=7'b001_0000;seg=4'b0111;/*******倒计时显示“9”*******/
LED=8'b1111_1111;/*******LED灯全灭 *******/
begin if(counter==40000000) begin counter=0;DP=1; s=1;end;/*****显示1秒*****/
else begin counter=counter+1;end end end;/*****不到一秒继续显示*****/
5.2倒计时模块
开始抢答,由第 一信号鉴别锁存电路形成第一抢答信号,并进行组别显示。抢答模块程序如下:
/************m初值为 0,有按键按下即锁定 *************/
if(key[0]&&!m)begin
out=7'b111_1001;seg=4'b0111;LED=8'b0000_0001;m=1;end
/************m没有被锁定,“1”键按下,显示“1”,对应“1”的LED灯亮 ,锁定m*************/
5.3整体的调试
各个模块部分调试都无问题后进行整体调试,进行程序调试、仿真、下等,
最后进行观察电路板上的现象,如果不成功,在进行程序的更改,调试等。
调试过程遇到的问题及解决方案:
(1)、在实验的开始阶段,对所写的代码进行了波形仿真,发现波形仿真的结果是错的,再进行程序更改,经过多次修改,仿真才逐步达到理想状态。然后进行其他方面的工作。
(2)、 在连接各个模块的时候要注意各个输入、输出的引脚约束,只要各个引脚约束与引脚互相匹配, 才能实现正确的结果。
(3)、电路通电后,倒计时开始,数到“0”后可以抢答,但不能锁定,即其他按键按下也会有显示,失去抢答功能;经分析后,只要加一个锁定信号m 即可,m 的初值为“0”,有按键按下后进行锁定,再有其他按键按下无效,只能进行下一 局的的抢答。
6、总结
实现了倒计时开始,数码管显示选手号数,以及对应LED亮的功能,程序上采用一个过程,顺序执行的结构,一个分支语句,和常见if语句,整体上看,程序简单,效率高。也存在缺点,功能单一,如主持人,不能自由设置抢答时间。硬件上看高低电位和敏感性信号,以及硬件本身的好坏。数码管只调用一个位的状态,不能随时切换高低位。
1.引脚约束
/***时钟clk,res复位***/
NET "clk" LOC =B8; NET "res" LOC = A7;
/***key,8个按键***/
NET "key[0]" LOC = N3; NET "key[1]" LOC = E2; NET "key[2]" LOC = F3;NET "key[3]" LOC =
G3; NET "key[4]" LOC = B4; NET "key[5]" LOC = K3; NET "key[6]" LOC = L3; NET "key[7]" LOC
= P11;
/***out,7个段选DP,小数点seg位选***/