eda实训 智能电子抢答器.docx
《eda实训 智能电子抢答器.docx》由会员分享,可在线阅读,更多相关《eda实训 智能电子抢答器.docx(19页珍藏版)》请在冰豆网上搜索。
eda实训智能电子抢答器
桂林电子科技大学信息科技学院
《EDA技术及应用》实训报告
学号**********
姓名张常彪
指导教师:
覃琴
2012年6月20日
智能电子抢答器
1.系统设计
1.1设计要求
1.1.1设计任务
设计并制作一台智能电子抢答器。
1.1.2性能指标要求
①用EDA实训仪的I/O设备和PLD芯片实现智能电子抢答器的设计。
②智能电子抢答器可容纳4组参赛者抢答,每组设一个抢答按键。
③电路具有第一抢答信号的鉴别和锁存功能。
在主持人将复位按钮按下后开始抢答,并用EDA实训仪上的八段数码管显示抢答者的序号,同时扬声器发出“嘟嘟”的响声,并维持3秒钟,此时电路自锁,不再接受其他选手的抢答信号。
④设计一个计分电路,每组在开始时设置为100分,抢答后由主持人计分,答对一次加10分,答错一次减10分。
⑤设计一个犯规电路,对提前抢答和超时抢答者鸣喇叭示警,并显示犯规的组别序号。
1.2设计思路及设计框图
1.2.1设计思路
模块qdq具有抢答所存功能,模块jfq具有计算选手分数的功能
模块fpq将20MHZ的转为一秒的脉冲,模块bj具有超时抢答警报的功能,cnt3具有3秒倒计时的功能,还有contr和cont1两个控功能的模块。
1.2.2总体设计框图
2.各个模块程序的设计
(1)抢答器
抢答器模块有5个输入,分别为4个选手按键以及一个始能端一个清零端,3个输出分别接到LED模块,犯规模块。
moduleqdq(k,k1,k2,k3,k4,led,q,kk,en,q2);
inputk,k1,k2,k3,k4;
outputreg[3:
0]q;
outputreg[3:
0]led;
outputkk,en;
wireena,p;
regen1,en2,en3,en4,kk1,kk2,kk3,kk4,j1=0,j2=0,j3=0,j4=0;
outputregq2;
assignena=~(|q);
assignkk=kk1|kk2|kk3|kk4;
assignen=en1|en2|en3|en4;
assignp=j1|j2|j3|j4;
always
begin
if(p==1)q2=1;
elseq2=0;
end
always@(negedgek1ornegedgek)
begin
if(~k)beginq[0]=0;en1=1;j1=0;end
elseif(ena)beginq[0]=1;kk1=1;j1=1;end
elseq[0]=q[0];
end
always@(negedgek2ornegedgek)
begin
if(~k)beginq[1]=0;en2=1;j2=0;end
elseif(ena)beginq[1]=1;kk2=1;j2=1;end
elseq[1]=q[1];
end
always@(negedgek3ornegedgek)
begin
if(~k)beginq[2]=0;en3=1;j3=0;end
elseif(ena)beginq[2]=1;kk3=1;j3=1;end
elseq[2]=q[2];
end
always@(negedgek4ornegedgek)
begin
if(~k)beginq[3]=0;en4=1;j4=0;end
elseif(ena)beginq[3]=1;kk4=1;j4=1;end
elseq[3]=q[3];
end
always
case(q)
0:
led=0;
1:
led=1;
2:
led=2;
4:
led=3;
8:
led=4;
endcase
endmodule
(2)加减模块
计分模块主要是起到一个为各组选手计分的作用,当分组选手抢答成功时就会显示相应的分数,初始分数是10分,答对一题加1分打错一题减掉1分
modulejfq(clk,j,k1,clr,e);
input[1:
0]j;
input[3:
0]k1;
inputclk;
inputclr;
outputreg[7:
0]e;
reg[7:
0]c,d,f,g;
always@(posedgeclkornegedgeclr)
begin
if(~clr)beginc[7:
4]=0;c[3:
0]=0;d[7:
4]=0;d[3:
0]=0;f[7:
4]=0;f[3:
0]=0;g[7:
4]=0;g[3:
0]=0;end
elseif(k1==0)begine[7:
0]=0;end
elseif(k1==1)
beginif(j[0]==1)
beginif(c[3:
0]<9&&c[7:
4]!
=9)
c[3:
0]=c[3:
0]+1;
elseif(c[3:
0]==9&&c[7:
4]!
=9)
beginc[3:
0]=0;c[7:
4]=c[7:
4]+1;end
elseif(c[3:
0]==9&&c[7:
4]==9)
beginc[3:
0]=9;c[7:
4]=9;end
e=c;
end
elseif(j[1]==1)
beginif(c[3:
0]==0&&c[7:
4]==0)
beginc[3:
0]=0;c[7:
4]=0;end
elseif(c[3:
0]==0&&c[7:
4]!
=0)
beginc[3:
0]=9;c[7:
4]=c[7:
4]-1;end
elseif(c[3:
0]!
=0&&c[7:
4]==0)
c[3:
0]=c[3:
0]-1;
elseif(c[3:
0]!
=0&&c[7:
4]!
=0)
beginc[7:
4]=c[7:
4];c[3:
0]=c[3:
0]-1;end
e=c;
end
elsee=c;
end
elseif(k1==2)
beginif(j[0]==1)
beginif(d[3:
0]<9&&d[7:
4]!
=9)
d[3:
0]=d[3:
0]+1;
elseif(d[3:
0]==9&&d[7:
4]!
=9)
begind[3:
0]=0;d[7:
4]=d[7:
4]+1;end
elseif(d[3:
0]==9&&d[7:
4]==9)
begind[3:
0]=9;d[7:
4]=9;end
e=d;
end
elseif(j[1]==1)
beginif(d[3:
0]==0&&d[7:
4]==0)
begind[3:
0]=0;d[7:
4]=0;end
elseif(d[3:
0]==0&&d[7:
4]!
=0)
begind[3:
0]=9;d[7:
4]=d[7:
4]-1;end
elseif(d[3:
0]!
=0&&d[7:
4]==0)
d[3:
0]=d[3:
0]-1;
elseif(d[3:
0]!
=0&&d[7:
4]!
=0)
begind[7:
4]=d[7:
4];d[3:
0]=d[3:
0]-1;end
e=d;
end
elsee=d;
end
elseif(k1==3)
beginif(j[0]==1)
beginif(f[3:
0]<9&&f[7:
4]!
=9)
f[3:
0]=f[3:
0]+1;
elseif(f[3:
0]==9&&f[7:
4]!
=9)
beginf[3:
0]=0;f[7:
4]=f[7:
4]+1;end
elseif(f[3:
0]==9&&f[7:
4]==9)
beginf[3:
0]=9;f[7:
4]=9;end
e=f;
end
elseif(j[1]==1)
beginif(f[3:
0]==0&&f[7:
4]==0)
beginf[3:
0]=0;f[7:
4]=0;end
elseif(f[3:
0]==0&&f[7:
4]!
=0)
beginf[3:
0]=9;f[7:
4]=f[7:
4]-1;end
elseif(f[3:
0]!
=0&&f[7:
4]==0)
f[3:
0]=f[3:
0]-1;
elseif(f[3:
0]!
=0&&f[7:
4]!
=0)
beginf[7:
4]=f[7:
4];f[3:
0]=f[3:
0]-1;end
e=f;
end
elsee=f;
end
elseif(k1==4)
beginif(j[0]==1)
beginif(g[3:
0]<9&&g[7:
4]!
=9)
g[3:
0]=g[3:
0]+1;
elseif(g[3:
0]==9&&g[7:
4]!
=9)
beging[3:
0]=0;g[7:
4]=g[7:
4]+1;end
elseif(g[3:
0]==9&&g[7:
4]==9)
beging[3:
0]=9;g[7:
4]=9;end
e=g;
end
elseif(j[1]==1)
beginif(g[3:
0]==0&&g[7:
4]==0)
beging[3:
0]=0;g[7:
4]=0;end
elseif(g[3:
0]==0&&g[7:
4]!
=0)
beging[3:
0]=9;g[7:
4]=g[7:
4]-1;end
elseif(g[3:
0]!
=0&&g[7:
4]==0)
g[3:
0]=g[3:
0]-1;
elseif(g[3:
0]!
=0&&g[7:
4]!
=0)
beging[7:
4]=g[7:
4];g[3:
0]=g[3:
0]-1;end
e=g;
end
elsee=g;
end
end
endmodule
(3)报警电路
modulebj(bout,q2,clr,fout);
inputbout,q2,clr;
outputregfout;
always
begin
if(bout==1)
begin
if(q2==0)fout=0;
elsefout=1;
end
end
endmodule
(4)倒计时器
倒计时模块主要是一个倒计时的作用,我们设计的是一个3秒的倒计时。
modulecnt3(clk,lod,d,q,bout);
inputclk,lod;
input[3:
0]d;
outputreg[3:
0]q;
outputregbout;
always@(posedgeclkornegedgelod)
begin
if(~lod)beginq=d;bout=0;end
elsebegin
if(q==0)q='h0;
elseq=q-1;
if(q==0)bout=1;
elsebout=0;
end
end
endmodule
(5)分频器
分频器实现的是将高频时钟信号转换成低频的时钟信号,用于触发控制器,计数器和扫描显示电路。
该分频器,将EDA实训仪主板提供的20MHz的主频经20000000分频后,得到电路所需的1Hz(秒)时钟。
其设计模块如图2所示。
modulefpq(clk,cout);
inputclk;
reg[24:
0]q;
outputregcout;
always@(posedgeclk)
begin
if(q<20000000-1)q=q+1;
elseq=0;
if(q==20000000-1)cout=1;
elsecout=0;
end
endmodule
(6)抢答器结构图
3.调试过程
根据自己画的电路图以及个管脚功能,锁定相应引脚,然后编译下载到试验箱中去。
然后就进行硬件调试,刚开始时,加分模块功能有问题,按下加分按键后不是分很多就是加不了,经过反复更改程序后,最后得到的所要求的加分功能,其他模块有的有一些问题,有的很容易就改过来了,最后有部分功能还没调试出来,不过大部分都已经完成。
4.功能测试
4.1测试仪器与设备
1.安装QuartusII软件电脑一台
2.EDA实训仪一台
4.2性能指标测试
①实现了用EDA实训仪的I/O设备和PLD芯片实现智能电子抢答器的设计。
②实现了智能电子抢答器可容纳4组参赛者抢答,每组设一个抢答钮。
③实现了电路具有第一抢答信号的鉴别和锁存功能。
在主持人将复位按钮按下后开始抢答,并用EDA实训仪上的八段数码管显示抢答者的序号,同时LED灯闪烁提示。
此时电路自锁,不再接受其他选手的抢答信号。
④实现了设计一个计分电路,每组在开始时设置为10分,抢答后由主持人计分,答对一次加1分,答错一次减1分。
⑤实现了设计一个犯规电路,对提前抢答和超时抢答者进行警告提示,并显示犯规的组别序号。
5.实训心得体会
通过本次实训,觉得以后不管做什么制作,首先应该理清思路,需要有模块,怎么连接,每个模块的作用是什么,模块与模块之间有什么联系,还有一些输入输出。
然后再细分到每个模块的突破,写程序也一样,再在写这些复杂的程序前我们先要有一个整体思路。
接下来就是根据每各快的功能来写这写程序,有些可以参考书上的一些程序,在这个程序上加以修改就可以实现功能。
最后就是把程序变成器件,再把各个快连接起来,接上输入输出口。
再锁管脚的时候不同的作用的引脚要锁不同的地方,比如要脉冲信号的要接16,有的接按键;有的接拨动开关等。
在次过程中碰到了好多问题,不仅是知识上的缺陷,更重要的是自己心态,在碰到问题一下子不能解决时,一定不能浮躁,要静下心,慢慢思考,这段时间坚持下来,就一定会把问题解决。
所以不管做什么事,一定要坚持。
6.参考文献
《EDA技术与应用》电子工业出版社江国强编著
附录:
仿真波形图(部分模块)
1.分频器模块
2.Cnt仿真波形图
程序清单
moduleqdq(k,k1,k2,k3,k4,led,q,kk,en,q2);
inputk,k1,k2,k3,k4;
outputreg[3:
0]q;
outputreg[3:
0]led;
outputkk,en;
wireena,p;
regen1,en2,en3,en4,kk1,kk2,kk3,kk4,j1=0,j2=0,j3=0,j4=0;
outputregq2;
assignena=~(|q);
assignkk=kk1|kk2|kk3|kk4;
assignen=en1|en2|en3|en4;
assignp=j1|j2|j3|j4;
always
begin
if(p==1)q2=1;
elseq2=0;
end
always@(negedgek1ornegedgek)
begin
if(~k)beginq[0]=0;en1=1;j1=0;end
elseif(ena)beginq[0]=1;kk1=1;j1=1;end
elseq[0]=q[0];
end
always@(negedgek2ornegedgek)
begin
if(~k)beginq[1]=0;en2=1;j2=0;end
elseif(ena)beginq[1]=1;kk2=1;j2=1;end
elseq[1]=q[1];
end
always@(negedgek3ornegedgek)
begin
if(~k)beginq[2]=0;en3=1;j3=0;end
elseif(ena)beginq[2]=1;kk3=1;j3=1;end
elseq[2]=q[2];
end
always@(negedgek4ornegedgek)
begin
if(~k)beginq[3]=0;en4=1;j4=0;end
elseif(ena)beginq[3]=1;kk4=1;j4=1;end
elseq[3]=q[3];
end
always
case(q)
0:
led=0;
1:
led=1;
2:
led=2;
4:
led=3;
8:
led=4;
endcase
endmodule
modulejfq(clk,j,k1,clr,e);
input[1:
0]j;
input[3:
0]k1;
inputclk;
inputclr;
outputreg[7:
0]e;
reg[7:
0]c,d,f,g;
always@(posedgeclkornegedgeclr)
begin
if(~clr)beginc[7:
4]=0;c[3:
0]=0;d[7:
4]=0;d[3:
0]=0;f[7:
4]=0;f[3:
0]=0;g[7:
4]=0;g[3:
0]=0;end
elseif(k1==0)begine[7:
0]=0;end
elseif(k1==1)
beginif(j[0]==1)
beginif(c[3:
0]<9&&c[7:
4]!
=9)
c[3:
0]=c[3:
0]+1;
elseif(c[3:
0]==9&&c[7:
4]!
=9)
beginc[3:
0]=0;c[7:
4]=c[7:
4]+1;end
elseif(c[3:
0]==9&&c[7:
4]==9)
beginc[3:
0]=9;c[7:
4]=9;end
e=c;
end
elseif(j[1]==1)
beginif(c[3:
0]==0&&c[7:
4]==0)
beginc[3:
0]=0;c[7:
4]=0;end
elseif(c[3:
0]==0&&c[7:
4]!
=0)
beginc[3:
0]=9;c[7:
4]=c[7:
4]-1;end
elseif(c[3:
0]!
=0&&c[7:
4]==0)
c[3:
0]=c[3:
0]-1;
elseif(c[3:
0]!
=0&&c[7:
4]!
=0)
beginc[7:
4]=c[7:
4];c[3:
0]=c[3:
0]-1;end
e=c;
end
elsee=c;
end
elseif(k1==2)
beginif(j[0]==1)
beginif(d[3:
0]<9&&d[7:
4]!
=9)
d[3:
0]=d[3:
0]+1;
elseif(d[3:
0]==9&&d[7:
4]!
=9)
begind[3:
0]=0;d[7:
4]=d[7:
4]+1;end
elseif(d[3:
0]==9&&d[7:
4]==9)
begind[3:
0]=9;d[7:
4]=9;end
e=d;
end
elseif(j[1]==1)
beginif(d[3:
0]==0&&d[7:
4]==0)
begind[3:
0]=0;d[7:
4]=0;end
elseif(d[3:
0]==0&&d[7:
4]!
=0)
begind[3:
0]=9;d[7:
4]=d[7:
4]-1;end
elseif(d[3:
0]!
=0&&d[7:
4]==0)
d[3:
0]=d[3:
0]-1;
elseif(d[3:
0]!
=0&&d[7:
4]!
=0)
begind[7:
4]=d[7:
4];d[3:
0]=d[3:
0]-1;end
e=d;
end
elsee=d;
end
elseif(k1==3)
beginif(j[0]==1)
beginif(f[3:
0]<9&&f[7:
4]!
=9)
f[3:
0]=f[3:
0]+1;
elseif(f[3:
0]==9&&f[7:
4]!
=9)
beginf[3:
0]=0;f[7:
4]=f[7:
4]+1;end
elseif(f[3:
0]==9&&f[7:
4]==9)
beginf[3:
0]=9;f[7:
4]=9;end
e=f;
end
elseif(j[1]==1)
beginif(f[3:
0]==0&&f[7:
4]==0)
beginf[3:
0]=0;f[7:
4]=0;end
elseif(f[3:
0]==0&&f[7:
4]!
=0)
beginf[3:
0]=9;f[7:
4]=f[7:
4]-1;end
elseif(f[3:
0]!
=0&&f[7:
4]==0)
f[3:
0]=f[3:
0]-1;
elseif(f[3:
0]!
=0&&f[7:
4]!
=0)
beginf[7:
4]=f[7:
4];f[3:
0]=f[3:
0]-1;end
e=f;
end
elsee=f;
end
elseif(k1==4)
beginif(j[0]==1)
beginif(g[3:
0]<9&&g[7:
4]!
=9)
g[3:
0]=g[3:
0]+1;
elseif(g[3:
0]==9&&g[7:
4]!
=9)
beging[3:
0]=0;g[7:
4]=g[7:
4]+1;end
elseif(g[3:
0]==9&&g[7:
4]==9)
beging[3:
0]=9;g[7:
4]=9;end
e=g;
end
elseif(j[1]==1)
beginif(g[3:
0]==0&&g[7:
4]==0)
beging[3:
0]=0;g[7:
4]=0;end
elseif(g[3:
0]==0&&g[7:
4]!
=0)
beging[3:
0]=9;g[7:
4]=g[7:
4]-1;end
elseif(g[3:
0]!
=0&&g[7:
4]==0)
g[3:
0]=g[3:
0]-1;
elseif(g[3:
0]!
=0&&g[7:
4]!
=0)
beging[7:
4]=g[7:
4];g[3:
0]=g[3:
0]-1;end
e=g;
end
elsee=g;
end
end
endmodule
modulebj(bout,q2,clr,fout);
inputbout,q2,clr;
outputregfout;
always
begin
if(bout==1)
begin
if(q2==0)fout=0;
elsefout=1;
end
end
endmodule
modulefpq(clk,cout);
inputclk;
reg[24: