EDA小游戏范本模板.docx
《EDA小游戏范本模板.docx》由会员分享,可在线阅读,更多相关《EDA小游戏范本模板.docx(27页珍藏版)》请在冰豆网上搜索。
EDA小游戏范本模板
EDA技术课程设计报告
设计名称:
EDA课程设计
设计题目:
经典数字游戏—-过河
专业:
电子信息工程专业
班级:
0
学生姓名
学号:
指导老师
题目:
基于FPGA的经典数字游戏——过河的设计
摘要:
基于FPGA的洗衣机控制器设计,主要通过使用VerilogHDL语言,在Quartus2上完成电路设计以及程序开发模拟,实现经典的猫狗鼠过河游戏。
本设计硬件主要5个按键10个LED灯以及2个数码管;软件设计时采用有限状态机来实现,设置了十个状态,由玩家输入的按键值来决定状态之间的转换。
全部程序由控制器模块,分频模块,按键去抖模块,控制模块,十进制转换模块组成,顶层模块使用原理图实现,底层由VerilogHDL语句实现。
在编程之后还进行了功能仿真,给出了仿真的结果以及仿真图。
并对本次设计的完成情况进行了系统性的总结。
关键字:
FPGA,Quartus2,VerilogHDL语言,过河,状态机
一、系统设计······················································3
1设计要求·····················································3
2总体设计方案·················································3
(1)设计思路············································3
(2)系统组成············································3
二、单元硬件电路设计··············································4
1键盘去抖模块··················································4
2显示模块·····················································4
3状态控制模块·················································4
三、软件设计······················································4
1状态控制模块程序设计··········································5
2按键去抖程序设计·············································5
3时钟分频模块程序设计··········································6
4十进制转换模块程序设计·········································6
四、系统仿真测试··················································6
1洗衣机模块仿真··············································6
2控制模块仿真················································6
3按键去抖模块仿真·············································7
4分频模块仿真·················································7
五、编译下载调试·················································8
六、总结··························································12
附录:
附录一电路原理图··················································13
附录二管脚定义·················································13
附录三程序代码··················································14
一、系统设计
1、设计要求
一个人将一只狗、一只猫和一只老鼠渡过河的经典游戏用模块实现;
游戏要求:
独木舟1次只能装载人和1只动物,且猫狗、猫鼠不能友好相处,设计过河方案,将三只动物安全渡过河,则游戏胜利结束。
1、用LED以适当的方式表示各种动物、河和独木舟以及过河的动作;
2、以数码管显示完成游戏所经历的过河次数;
3、调置复位键,当游戏失败后,以LED显示或数码管显示E等方式来表示此时程序挂起,俺复位键课重新开始新一轮游戏。
2、总体设计方案
1、设计思路
本课程设计需要使用VerilogHDL语言编程,实现经典的猫狗鼠过河游戏。
设计时采用有限状态机来实现本游戏。
本设计硬件主要有5个按键10个LED灯以及2个数码管;5个按键用来玩家输入以及复位按键,10个LED分别用来显示河对岸状态与进行过河状态以及输赢的情况;2个数码管用来显示玩家所经历的过河次数。
题目要求设计一个过河游戏电路,实现游戏实现状态的控制。
1。
状态控制模块基本实现要求功能,包括LED输出、数码管显示次数。
2.分频模块实现从高频向低频转换,供控制模块等使用
3.按键去抖模块,实现对按键的去抖功能。
4。
状态控制模块控制各种状态间转换
5.十进制转换模块,因为实验箱自带显示译码,所以省掉数码管模块。
6。
定义管脚,最终能在试验箱上显示结果
2、系统组成
过河游戏电路主要由状态控制模块,时钟分频模块,按键去抖模块,计数模块,十进制转换模块组成。
如图1—1所示
图1-1
二、单元硬件电路设计
1、按键去抖模块
设有5个按键:
一个复位键,四个过河状态控制的按键,表示正在过河的才做过程.
2、显示模块
设有10个LED灯,2个数码管。
LED灯中分两部分,LED0-LED3中四个表示河对岸的状态,一个表示是否错误,一个表示是否游戏成功;LED8-LED11中四个表示另一岸的状态(guohezhuangtai?
)。
2个数码管显示游戏所用步数。
3、状态控制模块
模块是以一片altera公司的Cyclone2系列FPGA为主体,配合一些外围电路实现的。
Cyclone2系列FPGA采用全铜层、低K值、1.2伏SRAM工艺设计,裸片尺寸被尽可能最小的优化.采用300毫米晶圆,以TSMC成功的90nm工艺技术为基础,CycloneII器件提供了4,608到68,416个逻辑单元(LE),并具有一整套最佳的功能,包括嵌入式18比特x18比特乘法器、专用外部存储器接口电路、4kbit嵌入式存储器块、锁相环(PLL)和高速差分I/O能力。
三、软件设计
采用Quartus2作为开发工具对可编程逻辑器件FPGA的编程,底层由VerilogHDL语句实现,顶层使用原理图实现.软件设计由状态控制模块,时钟分频模块,按键去抖模块,十进制转换模块四部分组成,由于输入时钟为50MHZ,因此使用分频模块输出50HZ的方波,给控制模块提供信号,控制模块输出的计数输入给数码管显示译码模块,按键消抖模块的作用是为了消除按键抖动而设立的。
1、主控制模块程序设计
状态控制模块采用有限状态机实现对过河游戏状态的控制。
具体如下
S状态表示河对岸的各状态,共十一个状态,包括一个错状态,K表示按键所给条件,表示正在过河的各种情况.我们采用led灯来表示过河的状态.如当renhe猫在河对岸,我们记为(1010),猫在河对岸时我们记为(0010),同理一共有10个允许出现的状态,还包括一个错误的状态。
状态有:
S0=(0000)S1=(1010)S2=(0010)S4=(1110)
S5=(0100)S6=(0001)S7=(1101)S8=(0101)
S9=(1111)S10错误状态
同状态一样设置
K1=(1000)表示人单独运动,K2=(1100)表示人和狗一起运动,K3=(1010)表示人和猫一起运动,K4=(1001)表示人和鼠一起运动.
当输出最终为(1111)是游戏一胜利而告终.
状态转换示意图如3-1下
图3-1
2、按键去抖程序设计
在进行独立按键或者矩阵式按键的设计的时候,我们在按下键盘的时候其实并不只是按下去有一个抖动的过程,就连松手的过程也有抖动,然而这个抖动通常被人们所忽略,从而导致输入数据的错误和乱码,因此我们必须对按键进行按键的消抖处理。
FPGA的VerilogHDL语言是硬件描述语言,主要运用了状态机和延时的消抖方式。
3、时钟分频模块程序设计
该模块通过输入的clock信号(50MHZ)分频后得到50HZ供给控制模块,通过两个1000分频输出50HZ的时钟信号,提供给其余各个模块.
4、十进制转换模块程序设计
该模块主要是为了实现将系统中二进制数转换为十进制数分别显示在数码管中表示游戏行走的步数,由于数码管系统自行译码为4为位二进制数,从而使得一个数码管显示十六进制数。
四、系统仿真测试
1.状态控制模块仿真如下图4—1
out_n表示按键的次数,ledout表示4个led输出的状态,最开始7个按键顺利完成游戏,ledout输出15即(1111),outdata表示胜利,此时输出为1。
按下复位键后状态清零,游戏重新开始,当按下key2是游戏失败outdata2表示游戏失败输出1。
图4-1
2。
十进制模块仿真如图4—2
图4—2
输入24,十位是nsouta输出2,各位osoutb输出4。
3.时钟分频模块仿真如图4—3
图4—3
(由于分频数较大,所以输入信号显得过于密集)
输入时钟信号的频率为输出信号的100倍。
4。
按键去抖模块仿真如图4-4
图4-4
通过计数使得按键带到一定时间后输出一个周期的脉冲。
五、编译下载调试
1.初始状态
图5-1
左边两排led灯,上面一排表示河对岸,初始状态为s0(0000),下面的是此案状态值正好与对岸相反(1111)。
右上角两个显示为00的数码管表示游戏进行的步数即按键的次数。
F1是复位键,F2是表人单独运动的键,F3表示人和狗运动,F4表示人和猫运动,F5表示人和鼠一起运动。
2.游戏运行中
图5-2
游戏正在顺利进行,尚未出错,已运行3步
3.游戏失败
图5—3
游戏失败,上面一排的第7个led灯亮,表示游戏失败。
4。
游戏成功
图5-4
上面一排led前四个全亮表示人狗猫鼠已经到达河对岸,下面的全灭,第一排最右边的led灯亮表示游戏成功,数码管显示7步完成游戏
附录
附录一:
顶层文件图如图
附录二:
管脚定义
Nodename
direction
location
group
I/Obank
Vrefgroup
I/Ostandard
Crruentstrength(24mA)
clk
Input
PIN_P25
6
B6_N0
3。
3
24mA
key1
Input
PIN_AA10
8
B8_N1
3.3
24mA
key2
Input
PIN_AB10
8
B8_N1
3.3
24mA
key3
Input
PIN_AE6
8
B8_N1
3。
3
24mA
key4
Input
PIN_V22
6
B6_N1
3。
3
24mA
ledout[0]
Output
PIN_AE8
Ledout[3。
。
0]
8
B8_N0
3。
3
24mA
ledout[1]
Output
PIN_W12
Ledout[3。
。
0]
8
B8_N0
3.3
24mA
ledout[2]
Output
PIN_W11
Ledout[3。
。
0]
8
B8_N0
3。
3
24mA
ledout[3]
Output
PIN_AC10
Ledout[3.。
0]
8
B8_N0
3.3
24mA
nsouta[0]
Output
PIN_AD21
Nsouta[3。
.0]
7
B7_N0
3。
3
24mA
nsouta[1]
Output
PIN_AF22
Nsouta[3。
.0]
7
B7_N0
3.3
24mA
nsouta[2]
Output
PIN_AE22
Nsouta[3。
.0]
7
B7_N0
3。
3
24mA
nsouta[3]
Output
PIN_V18
Nsouta[3..0]
7
B7_N0
3。
3
24mA
nsoutb[0]
Output
PIN_AB21
Nsoutb[3..0]
7
B7_N0
3.3
24mA
nsoutb[1]
Output
PIN_AD23
Nsoutb[3。
.0]
7
B7_N0
3。
3
24mA
nsoutb[2]
Output
PIN_AD22
Nsoutb[3。
.0]
7
B7_N0
3.3
24mA
nsoutb[3]
Output
PIN_AC21
Nsoutb[3..0]
7
B7_N0
3.3
24mA
outdata
Output
PIN_AA11
8
B8_N1
3.3
24mA
outdata2
Output
PIN_AF7
8
B8_N1
3。
3
24mA
rst
Input
PIN_Y11
8
B8_N1
3。
3
24mA
show1[0]
Output
PIN_U21
Show1[3。
.0]
6
B6_N0
3.3
24mA
show1[1]
Output
PIN_U20
Show1[3..0]
6
B6_N0
3.3
24mA
show1[2]
Output
PIN_T19
Show1[3..0]
6
B6_N0
3。
3
24mA
show1[3]
Output
PIN_R19
Show1[3。
。
0]
6
B6_N0
3.3
24mA
附录三:
程序代码
1.按键去抖代码
moduleanjian(clk,keyin,keyout);
inputclk;
inputkeyin;
outputkeyout;
reg[3:
0]count;
regkeyout;
always@(posedgeclk)
begin
if(keyin==1)
begin
count〈=count+1'b1;
if((count〉=2)&&(count〈3))keyout〈=1;
elsekeyout〈=0;
end
else
begin
keyout<=0;
count〈=0;
end
end
endmodule
2.千分频代码
modulef1000(clockin,clockout);
inputclockin;
outputclockout;
regclockout;
reg[9:
0]count;
always@(posedgeclockin)
begin
if(count==499)
begin
clockout=~clockout;
count〈=0;
end
else
count<=count+1’b1;
end
endmodule
3.十进制转换代码
modulejz10(clock,datain,nsouta,nsoutb);
inputclock;
input[7:
0]datain;
output[3:
0]nsouta,nsoutb;
reg[3:
0]a;
reg[3:
0]nsouta,nsoutb;
always@(posedgeclock)
begin
nsoutb<=datain%10;
nsouta〈=datain/10;
end
endmodule
4.主控制程序代码
moduleguohe_con(clk,rst,key1,key2,key3,key4,ledout,out_n,outdata,outdata2,show1);
inputclk;
inputrst;
inputkey1,key2,key3,key4;//输入
output[7:
0]out_n;//完成游戏所经历的过河次数
output[3:
0]ledout;//表示人狗猫鼠的状
output[3:
0]show1;//显示变量
outputoutdata;//游戏成功outdata〈=1
outputoutdata2;//游戏失败outdata2<=1
reg[10:
0]state;
reg[7:
0]out_n;
reg[7:
0]count;
reg[3:
0]ledout;
reg[3:
0]show1;
regoutdata;
regoutdata2;
parameters0=11'b00000000001,//0000
s1=11'b00000000010,//1010
s2=11'b00000000100,//0010
s3=11'b00000001000,//1110
s4=11'b00000010000,//1011
s5=11’b00000100000,//0100
s6=11'b00001000000,//0001
s7=11'b00010000000,//1101
s8=11’b00100000000,//0101
s9=11'b01000000000,//1111
s10=11’b10000000000;//error
always@(posedgeclk)
if(rst)
begin
count〈=0;
out_n〈=count;
state〈=s0;
ledout〈=4’b0000;
outdata<=0;
outdata2<=0;
show1<=4’b0000;
end
else
case(state)
s0:
begin
out_n<=count;
ledout〈=4'b0000;
if(key3==1)
begin
show1〈=4’b1010;
state〈=s1;//0000to1010
count〈=count+1;
end
elseif(key1^^key2^^key4)
begin
state〈=s10;//error
count〈=count+1;
end
elsestate〈=s0;
end
s1:
begin
out_n<=count;
ledout<=4'b1010;
if(key1==1)
begin
show1〈=4’b1000;
count〈=count+1;
state<=s2;//1010to0010
end
elseif(key3)
begin
show1<=4’b1010;//renhemaohui;gaicheng
state<=s0;//1010to0000
count<=count+1;
end
elseif(key2^^key4)
begin
state〈=s10;//error
count〈=count+1;
end
elsestate〈=s1;//error
end
s2:
begin
ledout<=4’b0010;
out_n〈=count;
if(key2==1)
begin
show1<=4’b1100;
state〈=s3;//0010to1110
count<=count+1;
end
elseif(key1==1)
begin
show1<=4'b1000;
state<=s1;//0010to1010
count〈=count+1;
end
elseif(key4==1)
begin
show1〈=4’b1001;
state〈=s4;//0010to1011
count<=count+1;
end
elseif(key3==1)
begin
show1〈=4’b1010;
state<=s10;//error
count〈=count+1;
end
elsestate〈=s2;
end
s3:
begin
out_n<=count;
ledout<=4'b1110;
if(key2==1)
begin
show1<=4’b1100;
state<=s2;//1110to0010
count〈=count+1;
end
elseif(key3==1)
begin
show1〈=4’b1010;
state〈=s5;//1110to0100
count〈=count+1;
end
elseif(key1^^key4)
begin
state〈=s10;//error
count<=count+1;
end
elsestate〈=s3;
end
s4:
begin
out_n〈=count;
ledout<=4'b1011;
if(key3==1)
begin
show1<=4'b1010;
state〈=s6;//1011to0001
count<=count+1;
out_n<=count;
end
elseif(key4==1)
begin
show1<=4'b1001;
state<=s2;//1011to0010
count<=count+1;
out_n〈=count;
end
elseif(key1^^key2)
begin
state〈=s10;//error
count〈=count+1;
out_n〈=count;
end
elsestate<=s4;
end
s5:
begin
out_n〈=count;
ledout〈=4'b0100;
if(key4==1)
begin
show1<=4’b1001;
state<=s7;//0100to1101
count〈=count