logo资料库

verilog-设计抢答器.docx

第1页 / 共11页
第2页 / 共11页
第3页 / 共11页
第4页 / 共11页
第5页 / 共11页
第6页 / 共11页
第7页 / 共11页
第8页 / 共11页
资料共11页,剩余部分请下载后查看
一、设计任务 智力竞赛抢答器 Verilog HDL 要求有 6 位参赛者进行抢答,有六个抢答信号 进行抢答。当有抢答选手按下抢答键后系统能够快速准确的判断是那一组选手按 下了抢答信号,由于系统比较小,速度比较快一般不会有同时按下的可能,所以 只有六种状态,然后系统能够根据这六种状态进行适时的显示和提示。当有选手 按下以后就对抢答信号进行锁存,其他选手的输入无效。然后就是对抢答进行时 间限制了,根据设定的时间进行倒计时,当倒计时完成还没有人抢答的时候系统 发出警报声音提示时间已经到了。当有选手在主持人未按下抢答键抢答时视为超 前抢答,系统显示该选手号,同时蜂鸣器响,该抢答无效。还有清除复位键,抢 答完成以后按复位键即可清除已有的状态。通过 Verilog HDL 程序代码实现系统 的各个功能。 二、设计目的与要求 目的:理论联系实际,巩固和运用所学课程,提高分析、解决计算机技术实 际问题的独立工作能力,培养学生正确的设计思想,严肃认真、实事求是的科学 态度和勇于探索的创新精神。通过对一个智力抢答器的设计,进一步加深对计算 机原理以及数字电路应用技术方面的了解与认识,进一步熟悉数字电路系统设计、 制作与调试的方法和步骤,通过 Verilog 程序的编写,进一步熟悉 Verilog HDL 的语法知识;规范化训练学生撰写技术研究报告,提高书面表达能力。 要求:  掌握 FPGA 设计系统的一般方法。  熟练掌握使用 modelsim 软件设计较复杂的数字逻辑电路。  培养学生独立分析问题和解决实际问题的能力。 三、 课程设计的内容 设计一抢答器,要求如下: (1)抢答台数为 6; (2)具有抢答开始后 20s 倒计时,20 秒倒计时后 6 人抢答显示超时,并报警; (3)能显示超前抢答台号并显示犯规报警; (4)系统复位后进入抢答状态,当有一路抢答按键按下,该路抢答信号将其 余各路抢答信号封锁,同时铃声响起,直至该路按键松开,显示牌显示该路 抢答台号。 四、系统设计方案 根据系统设计要求可知,系统的输入信号有:主持人按钮 inputEn,各选手的 抢答按钮分别是 inputL1、inputL2、inputL3、inputL4,inputL5,inputL6,主
持人和选手抢答按钮都是低电平有效,系统复位信号 clr(高电平有效),系统时 钟信号 clk,系统的输出信号有:六个人抢答成功与否的指示灯控制信号输出口 Led2,犯规抢答时报警器 Buzzer(低电平有效)。本系统应具有的功能有:能够 准确的判断出是哪位抢答者,当主持人没按抢答时,有人抢答了则蜂鸣器报警, 并显示该选手号,当主持人按了抢答键时有人抢答了,同时封锁抢答信号,其他 选手抢答无效,不显示该选手号。 五、仿真过程与仿真结果 仿真过程:使用 ModelSim 进行功能测试,首先在里面进行相应的设置,在工程 文件夹下面会新建一个 modelsim 的文件夹,然后编写实现功能的程序和测试文 件,最后保存编译执行就可以进行功能仿真了。 仿真结果 : 结果分析与讨论:可以看到 0 时刻系统复位状态,2s 时 2 号超前抢答(inputEn 为高电平,inputL2 为低电平),系统显示 2 蜂鸣器并犯规报警(Buzzer 为低电平), 8s 时系统复位状态,12s 时 4 号选手先抢答成功(inputL4 为低电平)显示 4,14s 时 3 号选手后抢答,不显示 3,20s 时系统复位。 六、总结 通过本次合成设计,我又一遍熟悉了 Verilog HDL 语言进行建模,并且通 过实际操作学会了怎么使用 Modelsim 这个软件来完成一个完整的课程设计。以
及对基于 FPGA 的系统开发流程有了一个整体认识,我越来越认识到一点, 编程 对项目实现有着至关重要的, 我们在硬件开发的过程中更应该重视编程, 将编 程看作是完善开发的不可缺少的一部分。虽然题目简单,但这也磨练了我的意志。 第一次做的太复杂了,然后一次次修改,做成最简单功能的。在一次次的反复设 计、论证和测试中, 提高了逻辑分析能力、全面分析问题的能力以及发现问题、 解决问题的能力。通过对各方面资料的收集, 我的知识面也进一步拓宽了。同 时,我也发现了自己的不足, 像语言表达还比较差, 不能更清楚地表达自己的 意思, 逻辑分析能力和编程能力有待提高,有些预先的想法都未能实现。在系 统的结构设计上也还有很长的路需要走,这是需要时间去积累的。在今后的学习 中我还得加以改进。 七、程序 系统主要 Verilog HDL 源程序: module (clk,clr,inputEn,inputL1,inputL2,inputL3,inputL4,inputL5,inputL6,Led2,Buzze QiangDaQi r); //一开始声明有哪些端口 input clk,clr,inputEn,inputL1,inputL2,inputL3,inputL4,inputL5,inputL6; output [0:7]Led2;//Led2 显示选手号 output Buzzer;//低电平时蜂鸣器发出声音 reg EnFlat=1'b0;//EnFlat 为高电平时开始抢答 reg [0:2]Led2=3'd0; reg Buzzer=1'b1; always @ (posedge clk)//时钟上升沿 begin if(inputEn==1)//如果主持人没按按钮就有人抢答 begin if(inputL1==0) begin Led2=3'd1;Buzzer=1'b0;end if(inputL2==0) begin Led2=3'd2;Buzzer=1'b0;end if(inputL3==0) begin Led2=3'd3;Buzzer=1'b0;end if(inputL4==0) begin Led2=3'd4;Buzzer=1'b0;end if(inputL5==0) begin Led2=3'd5;Buzzer=1'b0;end if(inputL6==0) begin Led2=3'd6;Buzzer=1'b0;end end if(inputEn==1'b0)//为低电平时表示主持人按下抢答按钮开始抢答 begin EnFlat=1'b1; if(EnFlat==1'b1) begin
if(inputL1==1'b0)//一号选手抢答 begin Led2=3'd1; EnFlat=1'b0;//为低电平禁止其他选手抢答 Buzzer=1'b1; //一开始没加 else 发现仿真结果随着输入数据变化而变化 end else if(inputL2==1'b0)//二号选手抢答 begin Led2=3'd2; EnFlat=1'b0; Buzzer=1'b0; end else if(inputL3==1'b0)//三号选手抢答 begin Led2=3'd3; EnFlat=1'b0;//为低电平禁止其他选手抢答 Buzzer=1'b1; end else if(inputL4==1'b0)//四号选手抢答 begin Led2=3'd4; EnFlat=1'b0;//为低电平禁止其他选手抢答 Buzzer=1'b1; end else if(inputL5==1'b0)//五号选手抢答 begin Led2=3'd5; EnFlat=1'b0;//为低电平禁止其他选手抢答 Buzzer=1'b1; end else if(inputL6==1'b0)//六号选手抢答 begin Led2=3'd6; EnFlat=1'b0;//为低电平禁止其他选手抢答 Buzzer=1'b1; end end end if(clr)//按下 clr 键以后各组参数重置,整个比赛重新开始
begin EnFlat=1'b0; Led2=3'd0;//为低电平时,选手前的灯点亮 Buzzer=1'b1;//为高电平不响 end end endmodule 测试程序 `timescale 1s/1s module qiangdaqi_test(); reg clk,clr,inputEn,inputL1,inputL2,inputL3,inputL4,inputL5,inputL6;//输入口 wire [0:7]Led2;//Led2 显示选手号 wire Buzzer;//低电平时蜂鸣器发出声音 QiangDaQi u1(clk,clr,inputEn,inputL1,inputL2,inputL3,inputL4,inputL5,inputL6,Led2,Buzzer) ; initial begin #0 clk=1;clr=0;inputEn=1;inputL1=1;inputL2=1;inputL3=1;inputL4=1;inputL5=1;inputL6 =1; #2 #4 #2 #4 #2 #4 #2 inputL2=0;//二号选手超前抢答 clr=1;inputL2=1;//复位 clr=0; inputEn=0;inputL4=0;//四号选手先抢答显示 4 inputL3=0;//三号选手后抢答不显示 3 clr=1;inputEn=1;inputL3=1;inputL4=1; clr=0; end always #1 clk=~clk; endmodule 程序二 QiangDaQi module (clk,clr,add,stu,inputEn,inputL1,inputL2,inputL3,inputL4,inputL5,inputL6,Led1,L ed2,Led3,Buzzer); //一开始声明有哪些端口 input clk,clr,inputEn,inputL1,inputL2,inputL3,inputL4,inputL5,inputL6,add,stu;// 输 入 口 output [0:5]Led1;//对应参赛选手前的灯 output [0:7]Led2,Led3;//Led2 显示选手号 Led3 显示选手分数 output Buzzer;//低电平时蜂鸣器发出声音
reg EnFlat=1'b1;//EnFlat 为高电平时开始抢答 reg BuClk=1'b0;//为高电平时进入蜂鸣器处理程序 //reg add,stu;//add 答题正确加一分 stu 答题错误减一分 //reg clr=0;//重置键 reg [0:5]Led1=6'b111111; reg [0:2] answer=3'd0; reg[0:3] score=4'd0,score1=4'd0,score2=4'd0; reg[0:3] score3=4'd0,score4=4'd0,score5=4'd0,score6=4'd0;//各选手分数计算 reg Buzzer=1; reg [0:4] daojishi=5'd20;//用于产生 20s 倒计时 reg [0:7]Led2=8'b11111111,Led3=8'b11111111; always @ (posedge clk)//时钟上升沿 begin if(inputEn==1)//如果主持人没按按钮就有人抢答 begin if(inputL1==0) begin Led1=6'b111110;answer=3'd1;BuClk=1'b1;end if(inputL2==0) begin Led2=6'b111101;answer=3'd2;BuClk=1'b1;end if(inputL3==0) begin Led2=6'b111011;answer=3'd3;BuClk=1'b1;end if(inputL4==0) begin Led2=6'b110111;answer=3'd4;BuClk=1'b1;end if(inputL5==0) begin Led2=6'b101111;answer=3'd5;BuClk=1'b1;end if(inputL6==0) begin Led2=6'b011111;answer=3'd6;BuClk=1'b1;end end if(inputEn==1'b0)//为低电平时表示主持人按下抢答按钮开始抢答 begin Led1=6'b111111;//为低电平时,选手前的灯点亮 BuClk=1'b0; Buzzer=1'b1;//为高电平不响 end if(EnFlat==1'b1) begin begin if(inputL1==1'b0)//一号选手抢答 begin EnFlat=1'b0;//为低电平禁止其他选手抢答 answer=3'd1;//为高电平时转到对应选手加减分程序中去 BuClk=1'b1;//转到蜂鸣器程序 end if(inputL2==1'b0)//二号选手抢答
begin EnFlat=1'b0; answer=3'd2; BuClk=1'b1; end if(inputL3==1'b0)//三号选手抢答 begin EnFlat=1'b0; answer=3'd3; BuClk=1'b1; end if(inputL4==1'b0)//四号选手抢答 begin EnFlat=1'b0; answer=3'd4; BuClk=1'b1; end if(inputL5==1'b0)//五号选手抢答 begin EnFlat=1'b0; answer=3'd5; BuClk=1'b1; end if(inputL6==1'b0)//六号选手抢答 begin EnFlat=1'b0; answer=3'd6; BuClk=1'b1; end end begin if(daojishi!=5'd0)//用于 1Hz 信号 daojishi=daojishi-1; else//倒计时结束抢答器还没按下则抢答停止且蜂鸣器响 begin daojishi=5'd20; EnFlat=1'b0; BuClk=1'b1; end end begin if(BuClk==1'b1)//当蜂鸣器标志为 1 时 Buzzer=1'b0;//蜂鸣器发声 end
begin if(answer ==3'd1)//第一组加减分 begin Led1=6'b111110;//点亮该选手前的 LED 灯 Led2=8'hf9;//选手号数码管显示 1 if(add) score1=score1+1;//当主持人判定选手的回答正确时,按下 add 键进行加分操作 else if((stu||inputEn)&&(score1!=0)) score1=score1-1;//当主持人判定选手的回答错误时,按下 stu 键进行加分操 else score1=0; score=score1;//把第一组的分数赋值给分数寄存器 end if(answer ==3'd2)//第二组加减分 begin Led1=6'b111101;Led2=8'ha4; if(add) score2=score2+1;//当主持人判定选手的回答正确时,按下 add 键进行加分操作 else if((stu||inputEn)&&(score2!=0)) score2=score2-1;//当主持人判定选手的回答错误时,按下 stu 键进行加分操 else score2=0; score=score2;//把第一组的分数赋值给分数寄存器 end if(answer ==3'd3)//第三组加减分 begin Led1=6'b111011;Led2=8'hb0; if(add) score3=score3+1;//当主持人判定选手的回答正确时,按下 add 键进行加分操作 else if((stu||inputEn)&&(score3!=0)) score3=score3-1;//当主持人判定选手的回答错误时,按下 stu 键进行加分操 else score3=0; score=score3;//把第一组的分数赋值给分数寄存器 end if(answer ==3'd4)//第四组加减分 begin Led1=6'b110111;Led2=8'h99; if(add) score4=score4+1;//当主持人判定选手的回答正确时,按下 add 键进行加分操作 else 作 作 作
分享到:
收藏