verilogHDL抢答器两个程序Word格式.docx
《verilogHDL抢答器两个程序Word格式.docx》由会员分享,可在线阅读,更多相关《verilogHDL抢答器两个程序Word格式.docx(14页珍藏版)》请在冰豆网上搜索。
五、仿真过程与仿真结果
仿真过程:
使用ModelSim进行功能测试,首先在里面进行相应的设置,在工程文件夹下面会新建一个modelsim的文件夹,然后编写实现功能的程序和测试文件,最后保存编译执行就可以进行功能仿真了。
仿真结果:
结果分析与讨论:
可以看到0时刻系统复位状态,2s时2号超前抢答(inputEn为高电平,inputL2为低电平),系统显示2蜂鸣器并犯规报警(Buzzer为低电平),8s时系统复位状态,12s时4号选手先抢答成功(inputL4为低电平)显示4,14s时3号选手后抢答,不显示3,20s时系统复位。
六、总结
通过本次合成设计,我又一遍熟悉了VerilogHDL语言进行建模,并且通过实际操作学会了怎么使用Modelsim这个软件来完成一个完整的课程设计。
以及对基于FPGA的系统开发流程有了一个整体认识,我越来越认识到一点,编程对项目实现有着至关重要的,我们在硬件开发的过程中更应该重视编程,将编程看作是完善开发的不可缺少的一部分。
虽然题目简单,但这也磨练了我的意志。
第一次做的太复杂了,然后一次次修改,做成最简单功能的。
在一次次的反复设计、论证和测试中,提高了逻辑分析能力、全面分析问题的能力以及发现问题、解决问题的能力。
通过对各方面资料的收集,我的知识面也进一步拓宽了。
同时,我也发现了自己的不足,像语言表达还比较差,不能更清楚地表达自己的意思,逻辑分析能力和编程能力有待提高,有些预先的想法都未能实现。
在系统的结构设计上也还有很长的路需要走,这是需要时间去积累的。
在今后的学习中我还得加以改进。
七、程序
系统主要VerilogHDL源程序:
moduleQiangDaQi
(clk,clr,inputEn,inputL1,inputL2,inputL3,inputL4,inputL5,inputL6,Led2,Buzzer);
//一开始声明有哪些端口
inputclk,clr,inputEn,inputL1,inputL2,inputL3,inputL4,inputL5,inputL6;
output[0:
7]Led2;
//Led2显示选手号
outputBuzzer;
//低电平时蜂鸣器发出声音
regEnFlat=1'
b0;
//EnFlat为高电平时开始抢答
reg[0:
2]Led2=3'
d0;
regBuzzer=1'
b1;
always(posedgeclk)//时钟上升沿
begin
if(inputEn==1)//如果主持人没按按钮就有人抢答
begin
if(inputL1==0)
beginLed2=3'
d1;
Buzzer=1'
end
if(inputL2==0)
d2;
if(inputL3==0)
d3;
if(inputL4==0)
d4;
if(inputL5==0)
d5;
if(inputL6==0)
d6;
end
if(inputEn==1'
b0)//为低电平时表示主持人按下抢答按钮开始抢答
EnFlat=1'
if(EnFlat==1'
b1)
if(inputL1==1'
b0)//一号选手抢答
Led2=3'
EnFlat=1'
//为低电平禁止其他选手抢答
Buzzer=1'
end
else//一开始没加else发现仿真结果随着输入数据变化而变化
if(inputL2==1'
b0)//二号选手抢答
Buzzer=1'
else
if(inputL3==1'
b0)//三号选手抢答
else
if(inputL4==1'
b0)//四号选手抢答
if(inputL5==1'
b0)//五号选手抢答
if(inputL6==1'
b0)//六号选手抢答
if(clr)//按下clr键以后各组参数重置,整个比赛重新开始
begin
Led2=3'
//为低电平时,选手前的灯点亮
//为高电平不响
endmodule
测试程序
`timescale1s/1s
moduleqiangdaqi_test();
regclk,clr,inputEn,inputL1,inputL2,inputL3,inputL4,inputL5,inputL6;
//输入口
wire[0:
wireBuzzer;
QiangDaQiu1(clk,clr,inputEn,inputL1,inputL2,inputL3,inputL4,inputL5,inputL6,Led2,Buzzer);
initial
#0clk=1;
clr=0;
inputEn=1;
inputL1=1;
inputL2=1;
inputL3=1;
inputL4=1;
inputL5=1;
inputL6=1;
#2inputL2=0;
//二号选手超前抢答
#4clr=1;
//复位
#2clr=0;
#4inputEn=0;
inputL4=0;
//四号选手先抢答显示4
#2inputL3=0;
//三号选手后抢答不显示3
always#1clk=~clk;
程序二
(clk,clr,add,stu,inputEn,inputL1,inputL2,inputL3,inputL4,inputL5,inputL6,Led1,Led2,Led3,Buzzer);
inputclk,clr,inputEn,inputL1,inputL2,inputL3,inputL4,inputL5,inputL6,add,stu;
5]Led1;
//对应参赛选手前的灯
7]Led2,Led3;
//Led2显示选手号Led3显示选手分数
regBuClk=1'
//为高电平时进入蜂鸣器处理程序
//regadd,stu;
//add答题正确加一分stu答题错误减一分
//regclr=0;
//重置键
5]Led1=6'
b111111;
2]answer=3'
reg[0:
3]score=4'
d0,score1=4'
d0,score2=4'
3]score3=4'
d0,score4=4'
d0,score5=4'
d0,score6=4'
//各选手分数计算
regBuzzer=1;
4]daojishi=5'
d20;
//用于产生20s倒计时
7]Led2=8'
b11111111,Led3=8'
b11111111;
beginLed1=6'
b111110;
answer=3'
BuClk=1'
beginLed2=6'
b111101;
b111011;
b110111;
b101111;
b011111;
Led1=6'
BuClk=1'
begin
answer=3'
//为高电平时转到对应选手加减分程序中去
//转到蜂鸣器程序
end
EnFlat=1'
answer=3'
BuClk=1'
end
end
if(inputL5==1'
if(inputL6==1'
if(daojishi!
=5'
d0)//用于1Hz信号
daojishi=daojishi-1;
else//倒计时结束抢答器还没按下则抢答停止且蜂鸣器响
daojishi=5'
BuClk=1'
if(BuClk==1'
b1)//当蜂鸣器标志为1时
//蜂鸣器发声
if(answer==3'
d1)//第一组加减分
Led1=6'
//点亮该选手前的LED灯
Led2=8'
hf9;
//选手号数码管显示1
if(add)
score1=score1+1;
//当主持人判定选手的回答正确时,按下add键进行加分操作
else
if((stu||inputEn)&
&
(score1!
=0))
score1=score1-1;
//当主持人判定选手的回答错误时,按下stu键进行加分操作
elsescore1=0;
score=score1;
//把第一组的分数赋值给分数寄存器
d2)//第二组加减分
Led2=8'
ha4;
score2=score2+1;
(score2!
score2=score2-1;
elsescore2=0;
score=score2;
d3)//第三组加减分
hb0;
score3=score3+1;
(score3!
score3=score3-1;
elsescore3=0;
score=score3;
d4)//第四组加减分
h99;
score4=score4+1;
(score4!
score4=score4-1;
elsescore4=0;
score=score4;
d5)//第五组加减分
h92;
score5=score5+1;
(score5!
score5=score5-1;
elsescore5=0;
score=score5;
d6)//第六组加减分
h82;
score6=score6+1;
(score6!
score6=score6-1;
elsescore6=0;
score=score6;
case(score)//?
?
4'
d0:
Led3=8'
hc0;
4'
d1:
d2:
d3:
d4:
d5:
d6:
d7:
hf8;
d8:
h80;
d9:
h90;
default:
hff;
endcase
//重置时六个Led全灭
//熄灭选手号静态数码管
Led3=8'
//熄灭分数显示数码管
//蜂鸣器标志位重置
//蜂鸣器控制管脚重置
score=0;
//score1=4'
score2=4'
score3=4'
//score4=4'
score5=4'
score6=4'
regclk,clr,add,stu,inputEn,inputL1,inputL2,inputL3,inputL4,inputL5,inputL6;
//regclr;
//regadd,stu;
QiangDaQiu1(clk,clr,add,stu,inputEn,inputL1,inputL2,inputL3,inputL4,inputL5,inputL6,Led1,Led2,Led3,Buzzer);
add=0;
stu=0;
#2inputEn=0;
inputL2=0;
add=1;
#2clr=1;
#1inputL3=0;
#2inputEn=1;
#40inputEn=0;
inputL1=0;
inputL2=1