EDA拔河比赛课程设计.docx
《EDA拔河比赛课程设计.docx》由会员分享,可在线阅读,更多相关《EDA拔河比赛课程设计.docx(22页珍藏版)》请在冰点文库上搜索。
EDA拔河比赛课程设计
F
P
G
A
拔
河
游
戏
课
程
设
计
报
告
姓名:
***
组员:
张潮松,张阳太
学号:
**********
班级:
0291001
指导老师:
***
一、设计方案
1.1电路工作流程图
二、电路原理
三、电路设计
3.1原理图
3.2代码
四、仿真、波形图
4.1编译仿真
4.2波形图
五、实验箱设置
六、验证结果
1课程设计的任务和基本要求
1.1设计目的
设计一个简单的拔河比赛游戏(并记录其分数)
(1)熟练掌握EDA软件QUARTUSII的使用方法;
(2)能利用EDA软件QUARTUSII进行一个电子技术综合问题的设计;
(3)掌握FPGA系统各种外围接口的灵活运用,培养实验的仿真及下载技能。
(4)掌握按键分配、CLOCK调用、LED数码管等外围接口的VerilogHDL语言编程;
(5)通过软件编程和仿真理解并体会VerilogHDL语言的常用编写语言和语法规;
(6)培养分析、寻找和排除电子电路中常见故障的能力;
1.2设计要求
1设计一个能进行拔河游戏的电路。
2电路使用8个发光二极管(中间两个灯可以设为中点)开机后只有中间两个发亮,此即拔河的中心点。
3游戏双方各持一个按钮,迅速地、不断地按动,产生脉冲,谁按得快,亮点就向谁的方向移动,每按一次,亮点移动一次。
4亮点移到任一方终端二极管时,这一方就获胜,此时双方按钮均无作用,输出保持,只有复位后才使亮点恢复到中心。
(设定一个复位键)
5用数码管显示获胜者的盘数,并设置复位按钮。
1.3设计方案
设计方案
按钮信号即输入的脉冲信号,每按一次按钮都应能进行有效的计数。
用可逆计数器的加、减计数输入端分别接受两路脉冲信号,可逆计数器原始输出状态为0000,经译码器输出,使中间一只二极管发亮。
当计数器进行加法计数时,亮点向右移;进行减法计数时,亮点向左移。
由一个控制电路指示谁胜谁负,当亮点移到任一方终端时,由控制电路产生一个信号,使计数器停止计数。
将双方终端二极管“点亮”信号分别接两个计数器的“使能”端,当一方取胜时,相应的计数器进行一次计数,这样得到双方取胜次数的显示。
设置一个“复位”按钮,使亮点回到中心,取胜计数器也要设置一个“复位”按钮,使之能清零。
总体设计
(1)先设计一个分频器,用来对比赛信号的输出频率进行控制。
可以这样理解:
我要怎样认为参赛一方获得了暂时的领先优势呢,答案是我可以设计参赛方按键若干次后才认为亮点向它那方移动一次。
这样可以更真实的反应比赛过程。
这个设想我通过分频器来实现。
当然,老师给出的要求是领先按一次就认为亮点移动一次,我就可以直接把我的分频器改为不变分频,这样只需在分频程序里改动一点数据即可,也容易做到。
(2)设计一个四位16进制计数器。
这个东西因为有之前的实验基础,思路相对比较清晰。
复位端,使能端和进位输出端都保存设计,方便以后任意选择性使用。
(3)设计一个比较模块。
这个模块主要为了对双方选手的用力情况进行一个比较。
优势情况不同,经过比较,参赛方的优势可以通过电子绳的中心即一排二极管的亮点的移动来体现。
这个只需要把选手的所有可能优势情况列出,并写出对应的亮点显示序列即可。
当亮点移动到任意一端的终点后,设定有一个输出端为‘0’,这个输出端接到之前用力计数器和分频器的使能端,限制比赛继续,即双方按键暂时失效。
在胜利的同时输出一个进位信号,用以后继胜利次数计数。
(4)设计胜利次数统计和显示的模块。
这一模块由计数器和译码器两个部分组成,其实就是之前我们做的七段数码管显示。
该部分里的计数器的使能端始终保持‘1’,而把复位键作为胜利次数显示的复位键。
(5)子模块设计完后进行整体组合。
程序流程图
1.4设计环境
(1)QuartusII6.0进行VerilogHDL编码及编译,波形仿真
(2)FPGA采用CycloneIEP1C3T144C8芯片和模式7电路
2设计过程
2.1代码原理
本设计采用一个主程序模块,为tttugwar模块。
其中包含重置部分、按键快慢判断部分、计分部分、led控制部分和数码管显示部分,五个部分分别实现不同功能。
(1)重置部分
源代码:
if(rst)//rst=1时
begin
q=2'b11;//q=1,即led回中点
n=1;//n使能开,游戏继续
end
分析:
当rst键输入电平1时,系统重置,led回中点,且n使能开,led可移动,游戏继续。
(2)按键快慢判断部分
源代码:
case({k2,k1})//按键组
2'b01:
q=q+3'b1;//时钟上升沿到来时,只有k1按下,led向左移一位
2'b10:
q=q-3'b1;//时钟上升沿到来时,只有k2按下,led向右移一位
default:
q=q;//其他情况,q保持,不移动
endcase
分析:
在4Hz时钟上升沿下,如果扫描其中一方按键被按下,就将led向快方移动一格。
都没按下或都按下情况led保持不变。
虽然系统在时钟上升沿判断的是按键的电平,而不是按键的频率,但电平其实是频率的体现,频率快的一方被系统扫描到的概率大,频率小的一方被系统扫描到的概率小,其成正比关系,所以判断电平1、0和频率快慢是相同的,系统功能可以被实现。
(3)led控制部分
源代码:
always@(posedge_4Hz)//_4Hz上升沿时执行
case(q)//LED控制
3'd6:
led=8'b11000000;//只左两盏亮
3'd5:
led=8'b01100000;//
3'd4:
led=8'b00110000;//
3'd3:
led=8'b00011000;//只中间两盏亮,即中点
3'd2:
led=8'b00001100;//
3'd1:
led=8'b00000110;//
3'd0:
led=8'b00000011;//只右两盏亮
default:
led<=led;//q其他数值led保持
endcase
分析:
4Hz时钟上升沿到来时,扫描q值,将q值与led八个输入端一一分配,成功显示led亮灭状态。
(4)计分部分
源代码:
case(q)//led控制
3'b000:
beginn=0;left=left+2'b1;l1<=1;end//LED移到最左边,计分提示l1置1,n使能关,游戏停止
3'b110:
beginn=0;right=right+2'b1;r2<=1;end//LED移到最右边,计分提示r2置1,n使能关,游戏停止
default:
n<=n;//其他情况,n保持,游戏继续
endcase
分析:
led到达左右端时,触发程序。
Led不再移动,游戏结束,且将led到达端方分数加一分。
(5)数码管显示部分
源代码:
always@(posedgel1orposedger2)//当l1,r2上升沿时执行
begin
case(left)
3'd0:
score1<=4'b0000;//左玩家得分为0时,链接数码管的译码管输入为0
3'd1:
score1<=4'b0001;//链接数码管的译码管输入为1
3'd2:
score1<=4'b0010;//同理2
3'd3:
score1<=4'b0011;//3
3'd4:
score1<=4'b0100;//4
3'd5:
score1<=4'b0101;//5
3'd6:
score1<=4'b0110;//6
3'd7:
score1<=4'b0111;//7
4'd8:
score1<=4'b1000;//8
default:
score1<=4'b1000;//其他情况输入也为8
endcase
case(right)
3'd0:
score2<=4'b0000;//右玩家得分为0时,链接数码管的译码管输入为0
3'd1:
score2<=4'b0001;//同理1
3'd2:
score2<=4'b0010;//2
3'd3:
score2<=4'b0011;//3
3'd4:
score2<=4'b0100;//4
3'd5:
score2<=4'b0101;//5
3'd6:
score2<=4'b0110;//6
3'd7:
score2<=4'b0111;//7
4'd8:
score2<=4'b1000;//8
default:
score2<=4'b1000;
endcase
l1<=0;//左计分提示l1重新置0
r2<=0;//右计分提示r2重新置0
end
分析:
每当led到达左右端时,触发程序,将左右玩家分数值left、right与数码管4位译码器一一分配,正常输出分数。
三、电路设计
VerilogHDL源程序如下:
3.2代码
moduletttugwar(k1,k2,rst,_4Hz,led,score1,score2);//主程序模块
inputk1;//输入游戏按键1
inputk2;//输入游戏按键2
inputrst;//输入拔河开始复位按钮(重置LED只有中间两盏灯亮)
input_4Hz;//输入FPGACLOCK0模块时钟脉冲,频率4Hz
output[7:
0]led;//led显示输出(8位)
output[7:
0]score1,score2;//左玩家1,右玩家2得分数码管显示输出(4位)
reg[2:
0]q;//3位led移动控制变量
reg[7:
0]led;
regn,l1,r2;//led移动使能端n,左玩家1计分提示l1,右玩家2记分提示r2
reg[3:
0]left,right;//左玩家1,右玩家2得分值变量(4位)
reg[3:
0]score1,score2;//左玩家1,右玩家2得分数码管显示(4位)
always@(posedgerstorposedge_4Hz)//rst上升沿或_4Hz上升沿到来时执行
begin
if(rst)//rst=1时
begin
q=2'b11;//q=1,即led回中点
n=1;//n使能开,游戏继续
end
elseif(n)//rst=0,n=1时,即使能开时
begin
case({k2,k1})//按键组
2'b01:
q=q+3'b1;//时钟上升沿到来时,只有k1按下,led向左移一位
2'b10:
q=q-3'b1;//时钟上升沿到来时,只有k2按下,led向右移一位
default:
q=q;//其他情况,q保持,不移动
endcase
case(q)//led控制
3'b000:
beginn=0;left=left+2'b1;l1<=1;end//LED移到最左边,计分提示l1置1,n使能关,游戏停止
3'b110:
beginn=0;right=right+2'b1;r2<=1;end//LED移到最右边,计分提示r2置1,n使能关,游戏停止
default:
n<=n;//其他情况,n保持,游戏继续
endcase
end
end
always@(posedge_4Hz)//_4Hz上升沿时执行
case(q)//LED控制
3'd6:
led=8'b11000000;//只左两盏亮
3'd5:
led=8'b01100000;//
3'd4:
led=8'b00110000;//
3'd3:
led=8'b00011000;//只中间两盏亮,即中点
3'd2:
led=8'b00001100;//
3'd1:
led=8'b00000110;//
3'd0:
led=8'b00000011;//只右两盏亮
default:
led<=led;//q其他数值led保持
endcase
always@(posedgel1orposedger2)//当l1,r2上升沿时执行
begin
case(left)
3'd0:
score1<=4'b0000;//左玩家得分为0时,链接数码管的译码管输入为0
3'd1:
score1<=4'b0001;//链接数码管的译码管输入为1
3'd2:
score1<=4'b0010;//同理2
3'd3:
score1<=4'b0011;//3
3'd4:
score1<=4'b0100;//4
3'd5:
score1<=4'b0101;//5
3'd6:
score1<=4'b0110;//6
3'd7:
score1<=4'b0111;//7
4'd8:
score1<=4'b1000;//8
default:
score1<=4'b1000;//其他情况输入也为8
endcase
case(right)
3'd0:
score2<=4'b0000;//右玩家得分为0时,链接数码管的译码管输入为0
3'd1:
score2<=4'b0001;//同理1
3'd2:
score2<=4'b0010;//2
3'd3:
score2<=4'b0011;//3
3'd4:
score2<=4'b0100;//4
3'd5:
score2<=4'b0101;//5
3'd6:
score2<=4'b0110;//6
3'd7:
score2<=4'b0111;//7
4'd8:
score2<=4'b1000;//8
default:
score2<=4'b1000;
endcase
l1<=0;//左计分提示l1重新置0
r2<=0;//右计分提示r2重新置0
end
endmodule
RTL电路图
四、仿真波形图
4.1输入_4Hz,k1,k2,rst波形设置
(1)_4Hz
如图3,在0——50us的时间中,设置_4Hz周期为50ns,占空比50%。
图3
(2)k1
如图4,在0——50us的时间中,设置k1周期为374ns,占空比20%,表示按键单脉冲高电平时间,其值为74.8ns。
图4
(3)k2
如图5,在0——50us的时间中,设置k2周期为280ns,占空比27%,表示按键单脉冲高电平时间,其值也为74.8ns。
图5
(4)rst
如图6,在0——50us的时间中,设置rst周期为3500ns,占空比2%,表示按键单脉冲高电平时间,其值为74.8ns。
图6
(5)输入波形
输入波形如图7所示。
可以明显看到k2的按键频率比k1快。
而时钟频率最快。
图7
4.28位led输出分析
Led由时间先后分为3部分,1,2部分首尾相连,时间连续。
(1)在0到400ns时间内,可见当_4Hz时钟上升沿到来时,每当判断出k2高电平,k1低电平,led亮灯逐格向k2方移动一格。
如图8
(2)400ns到600ns左右,由于k1高电平,k2低电平,led亮灯又向k1端移动一格。
如图8
(3)600ns到1.63us,扫描k2为高电平,k1为低电平,led移动到k2端头,如图9。
(4)在图中,在3.43us左右,rst按键有一个单脉冲,是的led重置为中间两灯亮,如图10。
可以验证时序仿真的正确性。
部分一图8
部分二图9
部分三图10
4.34位score1,2输出分析
波形图分为两部分,部分2被压缩。
Score1,2分别表示玩家2,1,双方得分。
当led亮灯到达玩家2端头,计分器马上加了一分。
如图11
由于玩家2明显比玩家1按键快,玩家2计分器加分至8分后不变,赢得比赛。
而玩家1分数为零,输掉比赛。
如图12
可以验证时序仿真的正确性。
部分一图11
部分二图12
五、实验箱设置
2.1模式选择
本系统采用电路板模式7,将按键7,按键4分别作为玩家1,2,输入端k1,k2。
按键1作为重置键rst。
数码管8,1作为玩家1,2分数显示端。
D8——D1作为led拔河灯组,如图13。
图13
2.2PIN脚链接
(1)_4Hz链接clock0电路4Hzpin口,输入4Hz时钟信号。
(2)k1链接按键7pin口。
(3)k2链接按键4pin口。
(4)rst链接按键1pin口。
(5)Led[7:
0]分别于D8-D1pin口链接。
(6)Score1,2[3:
0]分别于数码管8,1pin口链接,如图14。
图14
5.3FPGA硬件JTAG文件安装
如图JTAG文件由USB传入FPGA芯片中。
图16
六、验证结果
验证结果,成功。
如图17,18,19。
本系统采用模式7下按钮,由于按键7,4为单脉冲按钮,分别用来作为玩家1,2按钮,按键1单脉冲按钮作为重置键rst按钮。
如图17。
图17
(2)游戏开始。
Led只有中间两盏灯亮。
左右端数码管为0。
如图18。
图18
(3)当游戏进行13局后,可见玩家1已胜8局,玩家2胜5局,验证成功。
如图19。
图19
七、故障分析
起初时钟脉冲未用4Hz脉冲,使用16Hz脉冲,导致led灯移动过快,按一次按键移动2格,不满足题目原意。
经过认真考虑,知道了16Hz脉冲过快,两次上升沿时长极小于单脉冲按键高电平时长,导致扫描两次判断了两次同一次按键的结果,是的LED灯移动两次