数字电子技术课程设计报告基于FPGA的四位智能抢答器.doc
数字电子技术课程设计报告-基于 FPGA的四位智能抢答器专业:xxx班级:xxx姓名:xxx学号:xxx一、 设计任务及要求基于EDA/SOPC系统开发平台,运用Quartus可编程逻辑器件开发软件,设计一个4位智能抢答器。要求如下:1、 可以同时供4名选手抢答,其编号分别为1、2、3、4,各用抢答按键S1、S2、S3、S4,按键编号与选手编号对应。主持人设置有一个开始按键S5,一个清零按键S6,用于控制抢答的开始和系统的清零;2、 抢答器具有定时抢答的功能,一次抢答的时间为10秒。当主持人启动“开始”按键后,用4 位LED 数码管左边两位显示10s 的倒计时; 3、 抢答器具有数据锁存和显示的功能,抢答开始后,如果有选手按动按键,其编号立即锁存并显示在数码管上(显示在右边的两个数码管上),同时封锁输入电路,禁止其他选手抢答;优先选手的编号一直保持到主持人将系统清零为止;4、 参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示抢答时刻的时间(左边两个数码管上)和参赛选手的编号(显示在右边的两个数码管上),并保持到主持人将系统清零为止;如果定时抢答的时间已到而没有选手抢答,本次抢答无效,封锁输入电路,禁止抢答,定时器显示“00”并闪烁,闪烁频率为0.5HZ;一直保持到主持人将系统清零为止;5、 在主持人未按下开始按键时,如果有人抢答则犯规,在显示器上右边两位闪烁犯规选手的编号,闪烁频率为0.5HZ;一直保持到主持人将系统清零为止;6、 说明:系统上电和按下清零按键后显示“0000”,设计中的时钟脉冲频率为1000赫兹;7、 附加:加入按键软件消抖功能及加减分数显示计分功能;能够设置不同的抢答时间,以便应用于不同的抢答系统。二、 设计原理及方案本次设计主要采用verilog HDL 语言,总体编程思路采用模块化设计方式,主要分为3个模块,一个主控制及按扭输入模块,一个LED计时提示模块,一个抢答组号显示模块,分别对这3个子模块进行独立编程设计,并生成元件,并在顶层使用原理图的方式将3个模块连接起来完成整个设计。锁定管脚并编译通过,下载到试验箱进行测试。总设计框图: LED1 LED2 LED3 LED4 LED计时提示模块块(译码器)抢答组号显示模块 8421码 8421码 主控制及按钮输入模块 CLK 开始 清零 选手1 选手2 选手3 选手4 解析:在上图框架中LED计时提示模块、抢答组号显示模块都为译码器,主控制及按钮输入模块实现具体功能。主控制及按钮输入模块主要功能为计时、显示、闪烁、分频。其先将需要输出的内容以8421BCD码的形式输入给下一级,再通过LED计时提示模块和抢答组号显示模块的程序将8421BCD码译为对应的数据显示,最后和对应的共阳极数码显示管的管脚相连,显示最后的数据。 三、 电路源文件1、主控制与按钮输入模块module zhukongzhi(clk,clear,start,p1,p2,p3,p4,answer1,answer2,q1,q2);input clk,clear,start,p1,p2,p3,p4;output3:0 q1,q2output 3:0 answer1,answer2;wire3:0 qq1, qq2;wire co;reg 3:0 answer1, answer2;reg st;reg cr;reg en;reg kp;reg 10:0 tm;reg temp;reg temp2;reg 3:0 temp3;reg 3:0q1;reg 3:0q2;reg flag;reg flag1;reg flag2;initialbeginflag2=1;st=1;cr=1;flag1=1;tm=0;temp=0;flag=0;kp=0;answer1=4'b0000;answer2=4'b0000;endalways(negedge start or negedge clear)beginif(!start) begin st=0;cr=1;endelse if(!clear) begin st=1;cr=0;endendjishi2 cou(clk,cr,st,qq1,qq2,co,kp);always (posedge clk )beginbegin if(st=1'b1) beginflag=1;beginif(!clear)flag1=1;endbeginbeginif(p1=1'b0)&flag1)beginflag1=0;temp3=4'b0001;endelse if(p2=1'b0)&flag1)beginflag1=0;temp3=4'b0010;endelse if(p3=1'b0)&flag1)beginflag1=0;temp3=4'b0011;endelse if(p4=1'b0)&flag1)beginflag1=0;temp3=4'b0100;endendif(flag1=0)beginif(tm>=0)&(tm<1000)&(temp)begintm=tm+1;answer1=temp3;answer2=0;endelse if(tm>=0)&(tm<1000)&(!temp)begin tm=tm+1;nswer1=4'b1010;answer2=4'b1010;endelse if(tm=1000)begin tm=0;temp=temp;endendif(flag1)beginanswer1=4'd0000;answer2=4'd0000;end endendendbeginif(!start)&(flag2)kp=1;endbeginif(!clear)flag2=1;endbegin if(st=1'b0)begin beginif(p1&p2&p3&p4&flag)begin answer1=4'b1010;answer2=4'b1010;endelse if(p1=1'b0)&flag)begin/禁止其他选手抢答flag=1'b0;answer1=4'b0001;answer2=4'b0000;flag2=0;kp=0;end else if(p2=1'b0)&flag)beginflag=1'b0;answer1=4'b0010;answer2=4'b0000;flag2=0;kp=0;end else if(p3=1'b0)&flag)beginflag=1'b0;answer1=4'b0011;answer2=4'b0000;flag2=0;kp=0;end else if(p4=1'b0)&flag)beginflag=1'b0;answer1=4'b0100;answer2=4'b0000;flag2=0;kp=0;end endendendbeginif(co&(!st) beginif(tm>=0)&(tm<1000)&(temp)begintm=tm+1;q1=0;q2=0;endelse if(tm>=0)&(tm<1000)&(!temp)begintm=tm+1;q1=4'b1010;q2=4'b1010;endelse if(tm=1000)begin tm=0;temp=temp;endanswer1=4'b1010;answer2=4'b1010;endendbeginif(!co)beginq1<=qq1;q2<=qq2;endendif(!cr)beginflag=1'b1;kp=1;endendEndmodule2、 LED计时提示模块:module shijian(in,led1,led2); input 3:0in; output led1,led2; reg 7:0led1,led2; always(in) begin case(in)4'b0000:begin led1=8'b00000011;led2=8'b00000011; end4'b0001:begin led1=8'b10011111;led2=8'b00000011; end4'b0010:begin led1=8'b00100101;led2=8'b00000011; end4'b0011:begin led1=8'b00001101;led2=8'b00000011; end4'b0100:begin led1=8'b10011001;led2=8'b00000011; end4'b0101:begin led1=8'b01001001;led2=8'b00000011; end4'b0110:begin led1=8'b11000001;led2=8'b00000011; end4'b0111:begin led1=8'b00011111;led2=8'b00000011; end4'b1000:begin led1=8'b00000001;led2=8'b00000011; end4'b1001:begin led1=8'b00011001;led2=8'b00000011; end4'b1010:begin led1=8'b00000011;led2=8'b10011111; end4'b1111:begin led1=8'b11111111;led2=8'b11111111; end endcase endendmodule3、抢答组号显示模块: module xianshi(decodeout,indec);output7:0 decodeout;input3:0 indec;reg7:0 decodeout;always (indec) begin case(indec) 4'b0000:decodeout=8'b00000011; 4'b0001:decodeout=8'b10011111; 4'b0010:decodeout=8'b00100101;4'b0011:decodeout=8'b00001101; 4'b0100:decodeout=8'b10011001; 4'b0101:decodeout=8'b01001001; 4'b0110:decodeout=8'b01000001; 4'b0111:decodeout=8'b00011111; 4'b1000:decodeout=8'b00000001; 4'b1001:decodeout=8'b00001001; 4'b1010:decodeout=8'b11111111; default:decodeout=8'b11111111; endcase endEndmodule模块连接图:管教分配表:1、设计中应用的管脚信号管脚说明信号管脚说明CLKL2时钟脉冲按键S4B16选手4按键S1F8选手1按键S5F12开始按键按键S2A14选手2按键S6B17清零按键按键S3F10选手3以下两行附加设计用到按键S7F15加分按键0-1开关K1E15抢答时间选择开关按键S8B18减分按键0-1开关K2B142、 四个数码管的管脚分配如下:(ABCDEFG为七段LED,H为小数点,共阳极连接。四、总结与讨论 通过这为期四天的数字电路模拟训练,我获益匪浅: 1、 通过这次课程设计,我学会了并且可以比较熟练的使用QuartusII可编程逻辑器件开发软件。 2、我对“基于FPGA的4位智能抢答器”的运行原理有了更加深入的认识,可以自行设计这种抢答器,为我以后的实验设计积累了宝贵的经验。 3、我对Verilog HDL有了深入的认识。同时也对EDA/SOPC产生了更加浓厚的兴趣。通过本学期对数字电子技术基础第六章的学习,以及这几天为了完成课程设计的任务而查阅的视频、文字资料,我已经可以比较熟练的运用Verilog HDL语言进行简单程序的编写。掌握了这一门技术将对我以后的发展有很大的帮助。 4、通过这四天的实践,我的分析能力大大的提升,动手操作能力也有所提高,即使天气炎热,我也平心静气的做程序,搞测试,我知道了,无论做什么事,都要相信自己,戒骄戒躁,不会的东西就学会自己查资料,自学,实在不懂得再向老师同学请教,心态是最重要的。虽然到最后由于时间原因没有测试完,但是经历是最后重要的,这些经历将为我以后带来莫大的好处。 但是,我这几天以来也存在很多不足,首先,一开始有点知难而退的心里,其次,有不少的地方还没完全弄明白,尤其是那个LED即时显示模块还没有完全搞懂,设计任务与要求中的第7条附加条件,即“加入按键软件消抖功能及加减分数显示计分功能;能够设置不同的抢答时间,以便应用于不同的抢答系统”这个功能不知道怎么实现。另外,对于在控制端口在满足上升沿计数达到1000时在“0”和“1”之间进行变换这个程序请教过同学,但是也是还没有完全搞懂。“分频”这一块还需之后自己在攻克。这个课程设计在7月10号上午考完试已完成,从设计到测试和检测过程,无不凝聚着老师们的心血和汗水。在我实习期间,老师为我提供了种种专业知识上的指导,同学们为我提供宝贵的建议,老师们严谨求实的态度和同学们真诚的热情使我深受感动,没有这样的帮助和关怀和熏陶,我不会这么顺利的完成实训任务。最后,我向老师跟同学们发出真诚的感谢,老师您辛苦了,谢谢您陪伴我们这五天,您的敬业是我们实习成功的最大动力。