简易数字抢答器设计.docx
《简易数字抢答器设计.docx》由会员分享,可在线阅读,更多相关《简易数字抢答器设计.docx(15页珍藏版)》请在冰豆网上搜索。
![简易数字抢答器设计.docx](https://file1.bdocx.com/fileroot1/2022-11/23/84ff1859-826b-4837-87e4-0c7d716a27d6/84ff1859-826b-4837-87e4-0c7d716a27d61.gif)
简易数字抢答器设计
设计题目:
(简易数字式竞赛抢答器设计)
简易数字式竞赛抢答器设计
一、设计任务及要求:
在许多比赛活动中,为了准确、公正、直观地判断出第一抢答者,通常设置一台抢答器。
通过抢答器的数显、灯光和音响等手段指示出第一抢答者。
同时,还可以设置定时、记分、犯规及奖惩记录等多种功能。
(一)具体要求:
设计制作一个可容纳3个组参赛的抢答器。
1、每组设置一个抢答开关,分别为S0,S1,S2(高电平,即逻辑“1”有效)。
2、设置主持人控制键:
J0是用于控制整个系统清零的按钮(高电平,即逻辑“1”有效),Jl是用于发布抢答开始命令的开关(高电平,即逻辑“1”有效)。
3、设计抢答定时(20秒)电路,且计时起点与抢答命令J1同步,抢答者必须在定时20秒内进行抢答,超时而无人抢答则题目作废。
4、设计第一抢答信号鉴别和锁存功能。
在主待人发布抢答命令之后,第一抢答者按下抢答开关后,电路应记忆下第一抢答者的组别,并封锁其他各组的按钮,即其他任何组按键都不会使电路响应。
(二)输入输出说明:
1、输入信号:
四个控制开关S0、S1、S2、J1和1个按钮J0。
2、外部输入脉冲信号时钟源CP(2Hz),经适当分频后供控制器和定时器使用。
3、定时时间输出接到外部的2个8421BCD数码管M1、M2上,显示定时时间(19~00)。
4、输出以发光二极管LED方式指示第一抢答者,各组的发光二极管分别是L0,L1,L2。
其具体框图如下:
根据如上说明,本设计的主要任务和设计要求是:
1、按照现代数字系统的Top-Down模块化设计方法,提出数字式竞赛抢答器设计系统的整体设计方案,并进行正确的功能划分,分别提出并实现控制器、定时器、第一信号鉴别等模块化子系统的设计方案。
2、在ModelSim的EDA设计环境中,完成系统的顶层设计、各子系统的模块化设计。
分别完成各个基于VerilogHDL语言实现的子模块(包括控制电路、定时电路、第一信号鉴别电路)的逻辑功能仿真。
最后对顶层设计进行功能仿真。
3、在2步的基础上,采用SynplifyPro8.1对顶层设计进行系统综合。
设计报告应当按照给定的模板格式来书写,设计报告应当包含如下5个方面的内容:
二、设计原理与方案
(一)、顶层设计方案:
工作原理:
J1是用于发布抢答开始命令的开关(高电平,即逻辑“1”有效)。
J0是用于控制整个系统清零的按钮(高电平,即逻辑“1”有效)。
S1,s2,s3是抢答控制开关(高电平,即逻辑“1”有效)。
Cp是时间脉冲;cout是计时器的输出。
Out0,out1,out2是显示抢答对象的输出。
当j1为1,即当j1的上升沿来到时,计时器开始计时显示数字由19到0递减,此时抢答器可实现抢答功能。
若在计时器数字未减到0,即抢答有效时,若s0,s1,s2其中有一人抢答,则计数器数字停止,抢答器无效,且锁存抢答人信息。
若无人抢答则在计时二十秒过后计时器清零,抢答器无效。
在下一次使用抢答器之前,当j0为1时,抢答器数字及上一次抢答信号全部清零。
(二)、抢答控制与鉴别模块设计方案:
设计思路:
控制器由J1控制抢答器的开始,全部清零由J0控制。
J0级别最高。
当抢答开始时,此时若没人抢答,则抢答有效。
若有人抢答则抢答器无效同时给定时器输入一定时信号。
若在二十秒内无人抢答,则由定时器反馈给抢答器此信号来控制抢答器停止。
工作原理:
J1是用于发布抢答开始命令的开关(高电平,即逻辑“1”有效)。
J0是用于控制整个系统清零的按钮(高电平,即逻辑“1”有效)。
S1,s2,s3是抢答控制开关(高电平,即逻辑“1”有效)。
Out0,out1,out2是显示抢答对象的输出(高电平,即逻辑“1”有效)。
Q是定时器的输出,在计时器未减为0时有效(高电平,即逻辑“1”有效)。
En为控制器的输出,当有人抢答时en为1。
(三)、分频器设计方案:
设计思路及工作原理:
将输入信号进行二分频。
当输入信号上升沿来时CP_OUT翻转,周期变为原来二倍,频率变为二分之一。
(四)、定时器设计方案:
设计思路:
计时器计时由j1为1开始,此时计时器为19。
j0控制计时器清零。
J0级别最高。
当抢答开始时,即当控制器反馈到计时器为抢答有效的信息时,计时器一直递减。
当在计时器未减为零时,从控制器反馈出抢答无效的信息,此时计时器停止递减,知道J0脉冲来才清零。
当计时器减为零时,反馈给控制器抢答无效的信息,同时计时器停止工作。
工作原理:
J1是用于发布抢答开始命令的开关(高电平,即逻辑“1”有效)。
J0是用于控制整个系统清零的按钮(高电平,即逻辑“1”有效)。
En为抢答器反馈来的信号,当en为1时定时器停止,且锁存数字,当en为0时,若此时定时器有效,则定时器数字随脉冲上升沿到来而递减。
Q为定时器输出信号,当定时器有效且未减为零时,q为1,否则q为0。
Cout为定时器的输出在0到19范围内变化。
三、电路设计、仿真实现:
(一)、顶层设计实现:
1、基于VerilogHDL的顶层源文件及其仿真源文件;
顶层源文件:
`timescale1ms/1ms
moduleall(CP,j1,j0,s0,s1,s2,cout,out0,out1,out2);
inputCP,j1,j0,s0,s1,s2;
outputcout,out0,out1,out2;
reg[4:
0]cout;
regCP_out;
regen,q,y;
regout0,out1,out2;
initial
begin
y=0;
q=0;
CP_out=0;
cout=0;
out0=0;out1=0;out2=0;
end
always@(posedgeCP)
CP_out=~CP_out;
always@(posedgej1)
begin
y=1;
en=1;
q=1;
cout=19;
end
always@(posedgej0)
begin
y=0;
q=0;
en=0;
cout=5'b00000;
out0=0;out1=0;out2=0;
end
always@(posedges0orposedges1orposedges2)
if(!
(out0||out1||out2)&&q==1)
begin
if(((s0==1)&&(s1==0))&&(s2==0))
begin
out0=1;out1=0;out2=0;en=0;
end
elseif((s0==0)&&(s1==1)&&(s2==0))
begin
out0=0;out1=1;out2=0;en=0;
end
elseif((s0==0)&&(s1==0)&&(s2==1))
begin
out0=0;out1=0;out2=1;en=0;
end
end
always@(posedgeCP_out)
if(cout!
=0&&en)
begin
cout=cout-1;
if(cout==0)
q=0;
end
endmodule
顶层仿真源文件;
`timescale1ms/1ms
moduletest_all();
regs0,s1,s2,j0,j1;
wireout0,out1,out2;
wire[4:
0]cout;
regCP;
initial
begin
CP=0;
s0=0;s1=0;s2=0;
j0=0;j1=0;
#250j0=1;
#150j0=0;
#250j1=1;#150j1=0;
#1000s1=1;#150s1=0;
#250s0=1;#150s0=0;
#50j0=1;#150j0=0;
#500j1=1;#150j1=0;
#3500j0=1;#150j0=0;
#1000$stop;
end
always#250CP=~CP;
alltest_all(CP,j1,j0,s0,s1,s2,cout,out0,out1,out2);
endmodule
2、基于ModelsimSE的顶层设计功能仿真波形;
(二)、、抢答控制与鉴别模块设计实现:
1、基于VerilogHDL的设计源文件及其仿真源文件;
源文件:
`timescale1ms/1ms
modulecontrl(s0,s1,s2,j0,j1,q,out0,out1,out2,en);
inputs0,s1,s2,q,j0,j1;
outputout0,out1,out2,en;
regout0,out1,out2,en;
regtemp;
initial
begin
temp=0;
out0=0;out1=0;out2=0;en=0;
end
always@(posedgej1)
begin
temp=1;
end
always@(posedges0orposedges1orposedges2)
begin
if(((s0==1)&&(s1==0))&&(s2==0)&(temp==1))
begin
out0=1;out1=0;out2=0;en=1;temp=0;
end
elseif((s0==0)&&(s1==1)&&(s2==0)&(temp==1))
begin
out0=0;out1=1;out2=0;en=1;temp=0;
end
elseif((s0==0)&&(s1==0)&&(s2==1)&(temp==1))
begin
out0=0;out1=0;out2=1;en=1;temp=0;
end
elseif((s0==0)&&(s1==0)&&(s2==0)&(temp==1))
begin
out0=0;out1=0;out2=0;en=0;
end
end
always@(posedgej0)
begin
out0=0;out1=0;out2=0;en=0;
temp=0;
end
endmodule
仿真源文件:
`timescale1ms/1ms
modulecontrl_test();
regs0,s1,s2,q,j0,j1;
wireout0,out1,out2,en;
initial
begin
s0=0;s1=0;s2=0;
j0=0;j1=0;q=0;
#250j1=1;q=1;#250j1=0;
#250s0=1;#50s0=0;
#250s1=1;#50s1=0;
#250j0=1;q=0;#50j0=0;
#250j1=1;q=1;#50j1=0;
#2500j0=1;q=0;#50j0=0;
#1500$stop;
end
contrltest_contrl(.s0(s0),.s1(s1),.s2(s2),.j0(j0),.j1(j1),.q(q),.out0(out0),.en(en),.out1(out1),.out2(out2));
endmodule
2、基于ModelsimSE的功能仿真波形;
(三)、分频器设计实现:
1、基于VerilogHDL的设计源文件及其仿真源文件;
源文件:
modulehalf_CP(CP,CP_out);
inputCP;
outputCP_out;
regCP_out;
initial
CP_out=0;
always@(posedgeCP)
CP_out=~CP_out;
Endmodule
仿真源文件:
`timescale1ms/1ms
modulehalf_CP_test;
regCP;
wireCP_out;
always#250CP=~CP;
initial
begin
CP=0;
#10000$stop;
en
half_CPhalf_CP_test(.CP(CP),.CP_out(CP_out));
endmodule
2、基于ModelsimSE的功能仿真波形
(四)、定时器实现:
1、基于VerilogHDL的设计源文件及其仿真源文件;
源文件:
`timescale1ms/1ms
modulecount(CP_out,j1,j0,q,cout,en);
inputCP_out,j1,j0,en;
outputcout,q;
regq,y;
reg[4:
0]cout;
initial
begin
y=0;
q=0;
cout=0;
end
always@(posedgej1)
begin
y=1;
q=1;
cout=19;
end
always@(posedgej0)
begin
y=0;
q=0;
cout=5'b00000;
end
always@(posedgeCP_out)
if(cout!
=0&&en)
begin
cout=cout-1;
if(cout==0)
q=0;
end
endmodule
其仿真源文件:
`timescale1ms/1ms
modulecount_test();
regCP_out,j1,j0,en;
wire[4:
0]cout;
wireq;
initial
begin
j1=0;
j0=0;
CP_out=0;en=0;
#250j1=1;#50j1=0;
#1000j0=1;#50j0=0;
#250j1=1;#50j1=0;
#2000en=1;#50en=0;
#1000j0=1;#50j0=0;
#1000$stop;
end
always#250CP_out=~CP_out;
countcount_test(.j1(j1),.j0(j0),.q(q),.en(en),.CP_out(CP_out),
.cout(cout));
endmodule
2、基于ModelsimSE的功能仿真波形
四、分析与讨论
程序中的错误:
1、定义模块时模块中的变量在源程序及测试程序中的顺序不同导致错误。
2、在源程序及测试程序中定义输入输出变量时,定义变量的类型错误。
Reg型与wire型有时会混淆。
3、用测试程序实现功能时,定义输入变量错误或不合理,导致输出波形错误或功能实现错误。
4、要注意重复定义的问题。
5、在定义有复杂关系或有反馈关系的变量时,容易出现逻辑错误或重复定义。
定义时要细心考虑变量之间的逻辑关系。
6、有些符号的正确使用易忽略。
总结:
数字抢答器看似原理简单,其实逻辑关系也是比较复杂的。
再加上我对编程环境还不是太熟悉,对verilog语言还没有熟练掌握,此次编程对我来说也不是轻松的任务。
在这次实习中,我不但对verilog语言做了进一步学习,而且还在对错误语法的纠错中熟练掌握了这门语言。
虽然实习时间短,但我觉得效果很大,受益颇深。
此外,编程还很锻炼我的逻辑思维能力。
尤其是在编抢答器与控制器模块时,还要考虑互相之间的反馈影响,还要避免对同一变量的重复定义问题。
考虑问题既要全面又要细致入微。
通过此次实习,我已经能够非常熟练地操作软件ModelSim以及SynplifyPro8.1了。
而且现在也能比较熟练地编程了。
更重要的是,我在编程这方面的逻辑思维能力有了更进一步的提高。
电子技术的编程是非常实用的,相信此次实习对以后电子技术功能的编程实践会有很大的帮助。
建议:
在编程前布置实习任务后希望老师能布置一下预习报告,就是写一份自己对实习内容的实现的想法,思路。
这样可以让学生在开始变编程前对编程内容有一个系统的理解。
编程才更顺利。