猜数字vhdl设计Word文档格式.docx
《猜数字vhdl设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《猜数字vhdl设计Word文档格式.docx(65页珍藏版)》请在冰豆网上搜索。
5、若到点阵全灭时(64s结束)仍未猜出正确数字,游戏失败,点阵显示“囧”。
6、设置游戏机开关。
【实验所用仪器及元器件】
1.计算机
2.数字系统与逻辑设计实验开发板
【实验软件】
QuartusⅡ
【资源利用】
二、程序设计
1、程序流程图
是
2、逻辑框图
键盘模块
3、MDS图
rs=’1’
三、程序分析
1、引脚注释
clk——时钟
st——游戏开始
scan_out[3..0]——键盘的行扫描输出信号
key_row[3..0]——键盘的列输入信号
ms1——输入确认键
ms2——猜数字
rs——复位
bee_out——蜂鸣器输出
ld_out——状态指示灯
seg_out——数码管显示
cat_out——数码管排列显示
led_row_out——点阵行显示
led_col_out——点阵列显示
2、键盘数字
data0<
="
1111110"
;
--0
data1<
0110000"
--1
data2<
1101101"
--2
data3<
1111001"
--3
data4<
0110011"
--4
data5<
1011011"
--5
data6<
1011111"
--6
data7<
1110000"
--7
data8<
1111111"
--8
data9<
1111011"
--9
3、状态设置程序
设置程序状态
当st=1时,游戏开始
当ms=1时,确认输入数字,可以猜数字
当ms=1时,将输入猜测的数字与原始数字做对比,计算A,B
当rs=1时,程序复位清零
P1:
PROCESS(st,ms1,ms2,rs,tm,done,state,clk_tm)
VARIABLEcount_anyway:
INTEGERRANGE0TO2:
=0;
BEGIN
next_state<
=state;
IFrs='
1'
THENnext_state<
=idle;
--复位键,程序复位清零
ELSE
CASEstateIS
WHENidle=>
IFst='
=s1;
--游戏开始
ELSEnext_state<
ENDIF;
WHENs1=>
IFms1='
THEN—确认输入数字
next_state<
=s2;
ELSEnext_state<
WHENs2=>
IFms2='
THEN---开始猜数字
=s3;
ELSIFtm='
THEN
=over;
WHENs3=>
IFdone='
THEN–判断完成,数字对比结束
ENDIF;
WHENover=>
--游戏开始,初始化
ELSIFtf='
0'
THEN
IFtm='
next_state<
ELSEnext_state<
ENDIF;
WHENOTHERS=>
next_state<
--其他,程序置0
ENDCASE;
ENDIF;
ENDPROCESSp1;
4、分频器
将50MHz的时钟频率分成1KHz
P2:
PROCESS(clk)--fenping
VARIABLEcount3:
INTEGER:
VARIABLEcount4:
IFclk'
eventANDclk='
IFcount4=24999THEN
clk_scan<
=NOTclk_scan;
count4:
IFcount3=24999999THEN
clk_tm<
=NOTclk_tm;
count3:
ELSEcount3:
=count3+1;
ELSEcount3:
=count4+1;
ENDIF;
ENDPROCESSp2;
5、点阵计数
64s倒计时,在点阵显示,判断当tf=1时,led赋值为2,显示2号点阵,即为笑脸,游戏通过,当计时结束,count_clear=1,led赋值4,tm,赋值0,显示为空,当bee=1时,蜂鸣器响,提示猜测错误
P3:
PROCESS(clk_tm,count_clear,tf,bee)--countdown
IFtf='
led<
=2;
ELSIFcount_clear='
count_down<
led<
=4;
tm<
='
ELSIFbee='
=3;
ELSIFstate=s2THEN
IFclk_tm'
eventANDclk_tm='
IFcount_down=64THEN
tm<
count_down<
=1;
ELSEcount_down<
=count_down+1;
ELSENULL;
ENDPROCESSp3;
6、数码管显示
State为idle,,游戏初始化,数码管置零
State为s1,显示输入要猜测的数字
State为s2、s3、over,显示输入猜测数字
P4:
PROCESS(clk_scan)--displayseg
IFclk_scan'
eventANDclk_scan='
CASEstateIS
WHENidle=>
CASEcatIS
WHEN"
111110"
=>
cat<
011111"
seg<
0000000"
101111"
110111"
111011"
111101"
WHENOTHERS=>
ENDCASE;
WHENs1=>
=x1;
=x2;
=x3;
=x4;
WHENs2=>
=seg_a;
=seg_b;
=y1;
=y2;
=y3;
=y4;
WHENs3=>
WHENover=>
WHENOTHERS=>
NULL;
ENDCASE;
cat_out<
=cat;
seg_out<
=seg;
ENDPROCESSp4;
7、键盘扫描
P5:
PROCESS(clk_scan)--scan
CASEscanIS
WHEN"
1110"
scan<
0111"
1011"
1101"
scan_out<
=scan;
ENDPROCESSp5;
8、数字传输
将判断所得A、B显示在数码管上
P6:
PROCESS(num_a,num_b)--transnumtoseg
CASEnum_aIS
WHEN0=>
seg_a<
=data0;
WHEN1=>
=data1;
WHEN2=>
=data2;
WHEN3=>
=data3;
WHEN4=>
=data4;
CASEnum_bIS
seg_b<
ENDPROCESSp6;
9、输入判断
当state=idle时,初始化;
当state=s1时,从键盘输入初始数字,并将键盘数字分别赋值给x1,x2,x3,x4,即为要猜数字;
当state=s2时,蜂鸣器初始化,键盘输入猜测数字,并将键盘数字赋值给y1,y2,y3,y4,即为猜测数字;
当state=s3时,判断:
将x1分别于y1,y2,y3,y4对比,若x1=y1,则A加1,若x1=x2或x3或x4,则B加1,
将x2分别于y1,y2,y3,y4对比,若x2=y2,则A加1,若x1=x1或x3或x4,则B加1,
将x3分别于y1,y2,y3,y4对比,若x3=y3,则A加1,若x1=x1或x2或x4,则B加1,
将x4分别于y1,y2,y3,y4对比,若x4=y4,则A加1,若x1=x1或x2或x3,则B加1,
p7:
PROCESS(clk_scan)--keyin
VARIABLEcount1:
INTEGERRANGE0TO3:
VARIABLEcount2:
VARIABLEcount5:
INTEGERRANGE0TO4:
VARIABLEcount6:
VARIABLEcount11:
INTEGER:
BEGIN
x1<
x2<
x3<
x4<
y1<
y2<
y3<
y4<
num_a<
num_b<
tf<
key1<
key2<
count1:
count2:
count5:
count6:
done<
count_clear<
bee<
CASEkey_rowIS
CASEscanIS
WHEN"
WHENOTHERS=>
NULL;
ENDCASE;
=data7;
=data5;
=data6;
=data8;
=data9;
CASEcount1IS
WHEN0=>
IFkey1/=x4THEN
x1<
=key1;
count1:
ELSENULL;
ENDIF;
WHEN1=>
IFkey1/=x1THEN
x2<
WHEN2=>
IFkey1/=x2THEN
x3<
WHEN3=>
IFkey1/=x3THEN
x4<
bee<
CASEcount2IS
IFkey2/=y4THEN
y1<
=key2;
IFkey2/=y1THEN
y2<
IFkey2/=y2THEN
y3<
IFkey2/=y3THEN
y4<