北邮数电实验报告猜数字.docx
- 文档编号:6953594
- 上传时间:2023-01-13
- 格式:DOCX
- 页数:22
- 大小:4.61MB
北邮数电实验报告猜数字.docx
《北邮数电实验报告猜数字.docx》由会员分享,可在线阅读,更多相关《北邮数电实验报告猜数字.docx(22页珍藏版)》请在冰豆网上搜索。
北邮数电实验报告猜数字
题目:
简易猜数字游戏机的设计与实现
姓名
学院
专业
班级
学号
班内序号
一、设计课题的任务要求
基本要求:
1、游戏规则:
通常由两个人玩,一方出数字,另一方猜。
出数字的人要想好一个没有重复数字的4位数,不能让猜的人知道。
2、数字设置:
通过4*4键盘进行4位数字输入,在数码管(DISP0~DISP3)上显示当前所输入的数字。
通过设置确定键(BTN1键)进行锁定,此时数码管上的数值消失,同时用点阵开始倒计时,即:
初始状态点阵全亮,然后从右下角开始,由右到左、由下到上逐点逐排依次熄灭,间隔时间为1s,共计64s。
3、猜数字:
可以通过4*4键盘进行4位数字输入进行猜数字,且每输入一位数字在数码管(DISP0~DISP3)上显示当前所输入的数字,按确定键(BTN2键)进行确认,此时要根据输入的这组数字给出几A几B,其中:
A前面的数字表示位置正确的数的个数,用DISP5显示B前的数字表示数字正确而位置不对的数的个数,用DISP4显示如正确答案为2134,而猜的人猜5314,则是1A2B,其中有一个4的位置对了,记为1A,而1和3这三个数字对了,而位置没对,因此记为2B,合起来就是1A2B接着猜的人再根据出题者的几A几B继续猜,直到猜中(即4A0B)为止。
4、若数字正确则显示猜数字成功,点阵显示“☺”笑脸;若输入数字错误系统仍然处于猜数字状态,点阵显示“X”,并用蜂鸣器或led闪烁报警。
5、若到点阵全灭时(64s结束)仍未猜出正确数字,游戏失败,点阵显示“囧”。
6、设置游戏机开关。
提高要求:
1、若数字正确则显示猜数字成功,用蜂鸣器播放一段乐曲。
2、随机产生数字,并不在数码管上显示,进行猜数字游戏,用点阵进行128s计时,即点阵轮询熄灭两次,其他要求同基本功能3、4和5。
3、自拟其他功能。
二、系统设计
设计思路:
首先是状态机的设定,设定了5个状态,分别是idle、s1、s2、s3和over。
idle是空白的等待状态,s1是输入要猜的数字状态,在s2状态输入猜的数字,确定后进入s3状态,没猜对会检测还有没有时间,有时间会回到s2状态,没时间会留在over状态,猜对了也会留在over状态,在s2状态发现没时间后会进入over状态。
详情可见状态框图。
分频器选择了1Hz和1000Hz,1Hz是点阵倒计时的频率,1000Hz是点阵、矩阵键盘、数码管、按键的扫描频率。
点阵倒计时上选择对count_down(倒计时)进行求余和除法运算,求余可以对点阵的每一行进行每次灭一个灯的行为,除法可以确定点阵亮的行数。
在输入数字时进行与前面输入数字的比较,如果发现数字出现重复的情况则不输入数字,直到输入不同的数字为止。
状态框图:
st=1
st=1
tf=0&tm=0
ms1=1
tm=1
done=1
ms2=1
总体框图:
没有
有
不对,显示X
对
三、仿真波形及波形分析
为了方便仿真,在程序中加入了分辨当前所在状态的信号ld_out,idle状态时,ld_out为1000,s1时ld_out为0100,s2时为0010,s3为0001。
复位游戏开始确认输入的数字确认猜的数字复位
idle状态s1状态s2状态s3状态idle状态
四、源程序
部分代码分析:
分频器:
variablecount3:
integer:
=0;
variablecount4:
integer:
=0;
begin
ifclk'eventandclk='1'then
ifcount4=12499then
clk_scan<=notclk_scan;count4:
=0;
ifcount3=12499999then
clk_tm<=notclk_tm;count3:
=0;
elsecount3:
=count3+1;
endif;
elsecount3:
=count3+1;count4:
=count4+1;
endif;
endif;
count3为1Hz的频率,是点阵倒计时的频率;count4为1kHz的频率,是点阵、按键、数码管、矩阵键盘的扫描频率。
状态转移:
begin
next_state<=state;
ifres='1'thennext_state<=idle;
else
casestateis
whenidle=>
ifst='1'thennext_state<=s1;
elsenext_state<=idle;
endif;
whens1=>
ifms1='1'then
next_state<=s2;
elsenext_state<=s1;
endif;
whens2=>
ifms2='1'then
next_state<=s3;
elsiftm='1'then
next_state<=over;
elsenext_state<=s2;
endif;
whens3=>
ifdone='1'then
next_state<=over;
elsenext_state<=s3;
endif;
whenover=>
ifst='1'thennext_state<=idle;
elsiftf='0'then
iftm='0'then
next_state<=s2;
elsenext_state<=over;
endif;
elsenext_state<=over;
endif;
whenothers=>next_state<=idle;
endcase;
endif;
idle是空白的等待状态,s1是输入要猜的数字状态,在s2状态输入猜的数字,确定后进入s3状态,没猜对会检测还有没有时间,有时间会回到s2状态,没时间会留在over状态,猜对了也会留在over状态,发现没时间后也会进入over状态
点阵显示:
begin
ifclk_scan'eventandclk_scan='1'then
ifled=1then--jiong
caseled_rowis
when"10111111"=>led_row<="01111111";led_col<="11111111";
when"11011111"=>led_row<="10111111";led_col<="10011001";
when"11101111"=>led_row<="11011111";led_col<="10100101";
when"11110111"=>led_row<="11101111";led_col<="11000011";
when"11111011"=>led_row<="11110111";led_col<="10111101";
when"11111101"=>led_row<="11111011";led_col<="10100101";
when"11111110"=>led_row<="11111101";led_col<="10100101";
when"01111111"=>led_row<="11111110";led_col<="11111111";
whenothers=>led_row<="01111111";led_col<="11111111";
endcase;
elsifled=2then--xiao
caseled_rowis
when"10111111"=>led_row<="01111111";led_col<="00111100";
when"11011111"=>led_row<="10111111";led_col<="01000010";
when"11101111"=>led_row<="11011111";led_col<="10100101";
when"11110111"=>led_row<="11101111";led_col<="11011011";
when"11111011"=>led_row<="11110111";led_col<="10000001";
when"11111101"=>led_row<="11111011";led_col<="10100101";
when"11111110"=>led_row<="11111101";led_col<="01011010";
when"01111111"=>led_row<="11111110";led_col<="00111100";
whenothers=>led_row<="01111111";led_col<="11111111";
endcase;
elsifled=3then--x
caseled_rowis
when"10111111"=>led_row<="01111111";led_col<="10000001";
when"11011111"=>led_row<="10111111";led_col<="01000010";
when"11101111"=>led_row<="11011111";led_col<="00100100";
when"11110111"=>led_row<="11101111";led_col<="00011000";
when"11111011"=>led_row<="11110111";led_col<="00011000";
when"11111101"=>led_row<="11111011";led_col<="00100100";
when"11111110"=>led_row<="11111101";led_col<="01000010";
when"01111111"=>led_row<="11111110";led_col<="10000001";
whenothers=>led_row<="01111111";led_col<="11111111";
endcase;
elsifled=4then--kong
caseled_rowis
when"10111111"=>led_row<="01111111";led_col<="00000000";
when"11011111"=>led_row<="10111111";led_col<="00000000";
when"11101111"=>led_row<="11011111";led_col<="00000000";
when"11110111"=>led_row<="11101111";led_col<="00000000";
when"11111011"=>led_row<="11110111";led_col<="00000000";
when"11111101"=>led_row<="11111011";led_col<="00000000";
when"11111110"=>led_row<="11111101";led_col<="00000000";
when"01111111"=>led_row<="11111110";led_col<="00000000";
whenothers=>led_row<="01111111";led_col<="00000000";
endcase;
else
这里都是在显示特殊情况,下面是倒计时的显示:
num_1是倒计时对8的取余,num_2是倒计时对8的除法运算。
对应每个num_1,有num_x对应不同的点阵行的亮灯情况,这样的话使得61秒的倒计时只需要分8种情况讨论,即每一行一种情况。
num_1<=count_downrem8;--quyu
num_2<=count_down/8;
casenum_1is
when0=>num_x<="00000000";
when1=>num_x<="10000000";
when2=>num_x<="11000000";
when3=>num_x<="11100000";
when4=>num_x<="11110000";
when5=>num_x<="11111000";
when6=>num_x<="11111100";
when7=>num_x<="11111110";
whenothers=>num_x<="00000000";
endcase;
casenum_2is
when0=>
caseled_rowis
when"10111111"=>led_row<="01111111";led_col<="11111111"-num_x;
when"11011111"=>led_row<="10111111";led_col<="11111111";
when"11101111"=>led_row<="11011111";led_col<="11111111";
when"11110111"=>led_row<="11101111";led_col<="11111111";
when"11111011"=>led_row<="11110111";led_col<="11111111";
when"11111101"=>led_row<="11111011";led_col<="11111111";
when"11111110"=>led_row<="11111101";led_col<="11111111";
when"01111111"=>led_row<="11111110";led_col<="11111111";
whenothers=>led_row<="01111111";led_col<="11111111";
endcase;
when1=>
caseled_rowis
when"10111111"=>led_row<="01111111";led_col<="00000000";
when"11011111"=>led_row<="10111111";led_col<="11111111"-num_x;
when"11101111"=>led_row<="11011111";led_col<="11111111";
when"11110111"=>led_row<="11101111";led_col<="11111111";
when"11111011"=>led_row<="11110111";led_col<="11111111";
when"11111101"=>led_row<="11111011";led_col<="11111111";
when"11111110"=>led_row<="11111101";led_col<="11111111";
when"01111111"=>led_row<="11111110";led_col<="11111111";
whenothers=>led_row<="01111111";led_col<="11111111";
endcase;
when2=>
caseled_rowis
when"10111111"=>led_row<="01111111";led_col<="00000000";
when"11011111"=>led_row<="10111111";led_col<="00000000";
when"11101111"=>led_row<="11011111";led_col<="11111111"-num_x;
when"11110111"=>led_row<="11101111";led_col<="11111111";
when"11111011"=>led_row<="11110111";led_col<="11111111";
when"11111101"=>led_row<="11111011";led_col<="11111111";
when"11111110"=>led_row<="11111101";led_col<="11111111";
when"01111111"=>led_row<="11111110";led_col<="11111111";
whenothers=>led_row<="01111111";led_col<="11111111";
endcase;
when3=>
caseled_rowis
when"10111111"=>led_row<="01111111";led_col<="00000000";
when"11011111"=>led_row<="10111111";led_col<="00000000";
when"11101111"=>led_row<="11011111";led_col<="00000000";
when"11110111"=>led_row<="11101111";led_col<="11111111"-num_x;
when"11111011"=>led_row<="11110111";led_col<="11111111";
when"11111101"=>led_row<="11111011";led_col<="11111111";
when"11111110"=>led_row<="11111101";led_col<="11111111";
when"01111111"=>led_row<="11111110";led_col<="11111111";
whenothers=>led_row<="01111111";led_col<="11111111";
endcase;
when4=>
caseled_rowis
when"10111111"=>led_row<="01111111";led_col<="00000000";
when"11011111"=>led_row<="10111111";led_col<="00000000";
when"11101111"=>led_row<="11011111";led_col<="00000000";
when"11110111"=>led_row<="11101111";led_col<="00000000";
when"11111011"=>led_row<="11110111";led_col<="11111111"-num_x;
when"11111101"=>led_row<="11111011";led_col<="11111111";
when"11111110"=>led_row<="11111101";led_col<="11111111";
when"01111111"=>led_row<="11111110";led_col<="11111111";
whenothers=>led_row<="01111111";led_col<="11111111";
endcase;
when5=>
caseled_rowis
when"10111111"=>led_row<="01111111";led_col<="00000000";
when"11011111"=>led_row<="10111111";led_col<="00000000";
when"11101111"=>led_row<="11011111";led_col<="00000000";
when"11110111"=>led_row<="11101111";led_col<="00000000";
when"11111011"=>led_row<="11110111";led_col<="00000000";
when"11111101"=>led_row<="11111011";led_col<="11111111"-num_x;
when"11111110"=>led_row<="11111101";led_col<="11111111";
when"01111111"=>led_row<="11111110";led_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北邮数电 实验 报告 数字