数字竞赛抢答器课程设计Verilog语言实现样本.docx
《数字竞赛抢答器课程设计Verilog语言实现样本.docx》由会员分享,可在线阅读,更多相关《数字竞赛抢答器课程设计Verilog语言实现样本.docx(9页珍藏版)》请在冰豆网上搜索。
![数字竞赛抢答器课程设计Verilog语言实现样本.docx](https://file1.bdocx.com/fileroot1/2023-1/9/a6e47e78-b097-4056-84ac-e338d83e3ab1/a6e47e78-b097-4056-84ac-e338d83e3ab11.gif)
数字竞赛抢答器课程设计Verilog语言实现样本
可编程器件与应用课程设计报告
姓名:
XXX
学号:
XXXXXXXXXX
专业班级:
信息XXX
题目:
数字式竞赛抢答器
指引教师:
一、绪论
背景:
随着电子技术发展,可编程逻辑器件(PLD)浮现,使得电子系统设计者运用EDA(电子设计自动化)软件,就可以独立设计自己专用集成电路(ASIC)器件。
可编程逻辑器件是一种半导体集成器件半成品。
在可编程逻辑器件芯片中按一定方式(阵列形式或单元阵列形式)制作了大量门、触发器等基本逻辑器件,对这些基本器件恰本地连接,就可以完毕某个电路或系统功能。
数字式竞赛抢答器控制系统是工厂、学校和电视台等单位举办各种智力竞赛等娱乐活动中经常使用重要基本设备之一。
当前设计抢答器办法诸多,例如用老式PCB板设计、用PIC设计或者用单片机设计。
而用Verilog可以更迅速、灵活地设计出符合各种规定抢答器,优于其她设计办法,使设计过程达到高度自动化。
本文简介4路数字式竞赛抢答器基于Verilog语言、以EDA技术作为开发手段、采用CPLD(复杂可编程逻辑器件)作为控制核心设计而成。
与老式设计相比较,不但简化了接口和控制,也提高了系统整体性能和工作可靠性,具备电路简朴、成本低廉、操作以便、敏捷可靠等长处。
意义:
数字式竞赛抢答器作为一种电子产品,早已广泛应用于各种智力和知识竞赛场合,但当前所使用抢答器存在分立元件使用较多,导致每路成本偏高,而当代电子技术发展规定电子电路朝数字化、集成化方向发展,因而设计出数字化全集成电路多路抢答器是当代电子技术发展规定。
二、实现方案
设计规定:
1、设计一种可容纳4组参赛数字式抢答器,每组设一种按钮,供抢答使用。
2、抢答器具备第一信号鉴别和锁存功能,使除第一抢答者外按钮不起作用。
3、设立一种主持人“复位”按钮。
4、主持人复位后,开始抢答,第一信号鉴别锁存电路得到信号后,有批示灯显示抢答组别,扬声器发出2~3秒音响。
5、设立一种计分电路,每组开始预置5分,由主持人记分,答对一次加1分,答错一次减1分。
6、设立犯规电路,对超时答题(例如1分钟)组别鸣笛示警,并由组别显示电路显示出犯规组别,该轮该选手退出,由裁判员重新发令,其她人再抢答。
设计方案:
此设计问题可分为第一信号鉴别、锁存模块,答题计时电路模块,计分电路模块和扫描显示模块四某些。
第一信号鉴别锁存模块核心是精确判断出第一抢答者并将其锁存,在得到第一信号后,将输入端封锁,使其她组抢答信号无效,可以用触发器或锁存器实现。
设立抢答按钮K1、K2、K3、K4,主持人复位信号judge,蜂鸣器驱动信号buzzout。
judge=0时,第一信号鉴别、锁存电路、答题计时电路复位,在此状态下,若有抢答按钮按下,鸣笛示警并显示犯规组别;judge=1时,开始抢答,由第一信号鉴别锁存电路形成第一抢答信号,进行组别显示,控制蜂鸣器发出声响,并启动答题计时电路,若计时时间到,主持人复位信号还没有按下,则由蜂鸣器发出犯规示警声。
计分电路是一种相对独立模块,采用十进制加/减计数器、数码管数码扫描显示,设立复位信号Reset、加减分信号add_min,加减分状态键key_state,Reset=0时所有得分回到起始分(5分),且加、减分信号无效;Reset=1时,由第一信号鉴别、锁存电路输出信号选取进行加减分组别,当key_state=1时,按一次add_min,第一抢答组加1分;当key_state=0时,每按一次add_min,则减1分。
如下为每个模块设计过程。
三、程序及仿真
/******************************************************************
顶层模块信号定义:
clk:
基准时钟输入信号;k1,k2,k3,k4:
抢答按钮输入信号;seg:
数码管段输出引脚;
sl:
数码管位输出引脚;add_min:
加减分按键;key_state:
加减分模式选取按键;
reset:
初始5分设立键信号;judge:
裁判员抢答开始键信号;o5:
超时信号;
o1、o2、o3、o4:
抢答组别LED显示输出信号;buzz:
示警输出信号;******************************************************************/
module
qiangdaqi(clk,k1,k2,k3,k4,seg,sl,add_min,key_state,reset,judge,o1,o2,o3,o4,o5,buzz,vg,sel);
inputclk,k1,k2,k3,k4,add_min,key_state,reset,judge;
output[7:
0]seg;output[3:
0]sl;outputregsel;outputo1,o2,o3,o4,o5,vg;outputbuzz;
reg[3:
0]vg=0010;wireo1,o2,o3,o4;wire[3:
0]s1,s2,s3,s4;
/*模块引用*/
selQ1(clk,k1,k2,k3,k4,judge,o1,o2,o3,o4,o5,buzz);//调用抢答信号锁存显示电路
countQ2(clk,o1,o2,o3,o4,add_min,key_state,reset,s1,s2,s3,s4);//调用计分电路
dledQ3(seg,sl,s1,s2,s3,s4,clk);//调用数码管显示电路
endmodule
/****************************************************************
信号锁存电路信号定义:
CLK:
时钟信号;K1、K2、K3、K4、K5、K6:
抢答按钮信号;
out1、out2、out3、out4、out5、out6:
抢答LED显示信号;
judge:
裁判员抢答开始信号;buzzout:
示警输出信号;flag:
答题与否超时标志;
****************************************************************/
modulesel(clk,k1,k2,k3,k4,judge,out1,out2,out3,out4,out5,buzzout);
inputclk,k1,k2,k3,k4,judge;outputout1,out2,out3,out4,out5,buzzout;
regout1,out2,out3,out4,out5,block,buzzout;reg[32:
0]count;
reg[27:
0]counter;regflag;
always@(posedgeclk)
begincounter=counter+1;//裁判员发开始抢答信号,初始批示灯灭,蜂鸣器禁声
if(!
judge)begin{out1,out2,out3,out4,out5,block}<=6'b111110;
count=0;flag=0;end
elsebeginif(!
k1)//第一组别按键与否按下
beginif(!
block)
beginout1=0;//点亮第一组别批示灯
block=1;//封锁别组抢答信号
count=1;//第一组已按下按钮,可启动答题计时器
endend
elseif(!
k2)//第二组别按键与否按下
beginif(!
block)
beginout2=0;block=1;count=1;end
end
elseif(!
k3)//第三组别按键与否按下
beginif(!
block)
beginout3=0;block=1;count=1;end
end
elseif(!
k4)//第四组别按键与否按下
beginif(!
block)
beginout4=0;block=1;count=1;end
end
end/*答题计时开始,并判断与否答题超时*/
if(count!
=0)
beginif(count==32'hc11e7a00)//如果答题时间到了1分钟,亮犯规灯
begincount=0;out5<=0;flag=1'b1;end
elsebegincount=count+1;end
end
end////蜂鸣器发声
always@(counter[7])
if(flag==1)buzzout=!
(counter[11]&counter[22]&counter[27]);
elsebuzzout=1'b0;
endmodule
/**************************************************************
去键盘抖动信号定义:
clkin:
基准时钟输入信号;
clkout:
周期为20ms信号输出;
*************************************************************/
modulef_1M(clkin,clkout);
Inputclkin;outputclkout;
regclkout;reg[18:
0]count;
always@(negedgeclkin)
if(count==19'd500000)
begincount<=19'd000000;clkout<=~clkout;end
elsecount<=count+1'b1;
endmodule
/**************************************************************
计分电路信号定义:
clk:
时钟信号;c1,c2,c3,c4:
抢答组别输入信号;add_min:
加减分按钮;
key_state:
加减分标志按钮;reset:
初始5分设立信号;
count1:
第一组得分输出;count2:
第二组得分输出;
count3:
第三组得分输出;count4:
第四组得分输出;
*************************************************************/
modulecount(clk,c1,c2,c3,c4,add_min,key_state,reset,count1,count2,count3,count4);
inputclk,c1,c2,c3,c4,add_min,key_state,reset;output[3:
0]count1,count2,count3,count4;
reg[3:
0]count1,count2,count3,count4;wireclk0;regkeyout;
f_1Mf_1Ma(clk,clk0);//引用获得20毫秒子模块
always@(negedgeclk0)
keyout=add_min;
always@(posedgekeyout)//依照相应组别加减分
beginif(!
reset)//初始化各组起始分数
{count1,count2,count3,count4}=16'h5555;
if(!
key_state)//key_state为低电平,选组别减分模式
beginif(!
c1)//第一组别减1分,最高分为10分,最低分为0分
beginif(count1!
=4'b0000)count1=count1-1;end
if(!
c2)//第二组别减1分,最高分为10分,最低分为0分
beginif(count2!
=4'b0000)count2=count2-1;end
if(!
c3)//第三组别减1分,最高分为10分,最低分为0分
beginif(count3!
=4'b0000)count3=count3-1;end
if(!
c4)//第四组别减1分,最高分为10分,最低分为0分
beginif(count4!
=4'b0000)count4=count4-1;end
endelse//key_state为高电平,选组别加分模式
beginif(!
c1)//第一组别加分,最高分为10分,最低分为0分
beginif(count1>9)count1=0;
elsecount1=count1+1;end
if(!
c2)//第二组别加分,最高分为10分,最低分为0分
beginif(count2>9)count2=0;
elsecount2=count2+1;end
if(!
c3)//第三组别加分,最高分为10分,最低分为0分
beginif(count3>9)count3=0;
elsecount3=count3+1;end
if(!
c4)//第四组别加分,最高分为10分,最低分为0分
beginif(count4>9)count4=0;
elsecount4=count4+1;endendend
endmodule
/******************************************************************
数码管显示电路信号定义:
clk:
时钟信号;seg:
数码管段输出引脚;sl:
数码管位输出引脚;
score1:
第一组得分输入;score2:
第二组得分输入;
score3:
第三组得分输入;score4:
第四组得分输入;
******************************************************************/
moduledled(seg,sl,score1,score2,score3,score4,clk,vg);
output[7:
0]seg;output[3:
0]sl;outputreg[3:
0]vg=0010;
inputclk;input[3:
0]score1,score2,score3,score4;
reg[7:
0]seg_reg;//定义数码管段输出寄存器
reg[3:
0]sl_reg;//定义数码管位输出寄存器
reg[3:
0]disp_dat;//定义显示数据寄存器
reg[16:
0]count;//定义计数器寄存器
always@(posedgeclk)//定义clock信号上升沿触发
begincount=count+1;//计数器值加1
end
always@(count[14:
13])//定义显示数据触发事件
begincase(count[14:
13])//选取扫描显示数据
2'h0:
disp_dat=score1;//在个位数码管上显示第一组别分数值
2'h1:
disp_dat=score2;//在十位数码管上显示第二组别分数值
2'h2:
disp_dat=score3;//在百位数码管上显示第三组别分数值
2'h3:
disp_dat=score4;//在千位数码管上显示第四组别分数值
endcase
case(count[14:
13])//选取数码管显示位
2'h0:
sl_reg=4'b1110;//选取个位数码管
2'h1:
sl_reg=4'b1101;//选取十位数码管
2'h2:
sl_reg=4'b1011;//选取百位数码管
2'h3:
sl_reg=4'b0111;//选取千位数码管
endcaseend
always@(disp_dat)//显示数据解码过程
begin
case(disp_dat)
4'h0:
seg_reg=8'h3f;//显示数据0
4'h1:
seg_reg=8'h06;//显示数据1
4'h2:
seg_reg=8'h5b;//显示数据2
4'h3:
seg_reg=8'h4f;//显示数据3
4'h4:
seg_reg=8'h66;//显示数据4
4'h5:
seg_reg=8'h6d;//显示数据5
4'h6:
seg_reg=8'h7d;//显示数据6
4'h7:
seg_reg=8'h07;//显示数据7
4'h8:
seg_reg=8'h7f;//显示数据8
4'h9:
seg_reg=8'h6f;//显示数据9
4'ha:
seg_reg=8'h77;//显示数据a
4'hb:
seg_reg=8'h7c;//显示数据b
4'hc:
seg_reg=8'h39;//显示数据c
4'hd:
seg_reg=8'h51;//显示数据d
4'he:
seg_reg=8'h79;//显示数据e
4'hf:
seg_reg=8'h71;//显示数据f
endcaseend
assignseg=seg_reg;//输出数码管解码成果
assignsl=sl_reg;//输出数码管选取
endmodule
管脚分派图如下:
四、总结
1、打开QuartusII软件,对该工程文献进行编译解决,若在编译过程中发现错误,找出并改正错误直至成功为止。
2、将CCITCPLD/FGPAJTAG下载电缆两端分别接到PC机和CCITCPLD/FGPA实验仪上,再打开工作电源,执行下载命令把程序下载到CCITCPLD/FGPA实验仪EPM1270T144C5N器件中,通过K1~K4抢答按键按下后,由裁判员根答题状况,通过控制add_min和key_state这两个键实现加减分操作,这样人们就可以看到数码管上分数和LED四盏小灯变化。
五、心得体会
通过本次课程设计,我学会了综合应用键盘、LED小灯、蜂鸣器、LED数码管等外围接口进行产品设计,掌握了键盘、LED小灯、蜂鸣器、LED数码管等外围接口Verilog语言编程和各种外围接口灵活运用。
培养了CPLD综合开发能力、实验仿真及下载技能和互帮互助同窗关系,在各种其他能力上也均有了提高。
更重要是,通过本次课设重复修改验证及完毕,咱们学会了诸多学习办法,而这是日后最实用,真是感到受益匪浅。
虽然结束了,也留下了诸多遗憾,由于时间紧缺和许多课业繁忙,并没有做到最佳,但是,最起码咱们没有放弃,并努力实现它。
相信后来咱们会以更加积极地态度对待咱们学习、对待咱们生活。
咱们激情永远不会结束,相反,咱们会更加努力,努力去弥补缺陷,发展长处,充实自己!