北邮数电实验报告(猜数字) - 图文

更新时间:2023-10-29 16:26:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

题目:简易猜数字游戏机的设计与实现

姓名 学院 专业 班级 学号 班内序号

一、 设计课题的任务要求

基本要求:

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(倒计时)进行求余和除法运算,求余可以对点阵的每一行进行每次灭一个灯的行为,除法可以确定点阵亮的行数。在输入数字时进行与前面输入数字的比较,如果发现数字出现重复的情况则不输入数字,直到输入不同的数字为止。

状态框图:

idle

st=1

st=1

tf=0&tm=0

ms1=1 tm=1 done=1

ms2=1 S3

总体框图: 开始游戏st

输入数字

确认数字ms1 猜数字 没有 有 确认数字ms2

不对,显示X

猜对了?

赢了

S2 游戏结束,显示囧 还有时间? 游戏结束,显示笑脸 三、 仿真波形及波形分析

为了方便仿真,在程序中加入了分辨当前所在状态的信号ld_out,idle状态时,ld_out为1000,s1时ld_out为0100,s2时为0010,s3为0001。

复位 游戏开始 确认输入的数字确认猜的数字 复位

idle状态 s1状态 s2状态 s3状态 idle状态

四、 源程序

部分代码分析:

分频器:

variable count3:integer:=0; variable count4:integer:=0; if clk'event and clk='1' then

if count4=12499 then

clk_scan<=not clk_scan; count4:=0; if count3=12499999 then

clk_tm<=not clk_tm; count3:=0; else count3:=count3+1; end if;

begin

else count3:=count3+1; count4:=count4+1; end if;

end if;

count3为1Hz的频率,是点阵倒计时的频率;count4为1kHz的频率,是点阵、按键、数码管、矩阵键盘的扫描频率。

状态转移:

begin

next_state<=state;

if res='1' then next_state<=idle; else

case state is

when idle =>

if st='1' then next_state<=s1;

else next_state<=idle; end if; when s1 =>

if ms1='1' then

next_state<=s2; else next_state<=s1;

end if; when s2 =>

if ms2='1' then

next_state<=s3; next_state<=over; elsif tm='1' then else next_state<=s2;

end if;

when s3 =>

if done='1' then

next_state<=over; else next_state<=s3; end if;

if st='1' then next_state<=idle; elsif tf='0' then

if tm='0' then

next_state<=s2; else next_state<=over; end if;

when over =>

else next_state<=over; end if;

when others =>next_state<=idle;

end case; end if;

idle是空白的等待状态,s1是输入要猜的数字状态,在s2状态输入猜的数字,确定后进入s3状态,没猜对会检测还有没有时间,有时间会回到s2状态,没时间会留在over状态,猜对了也会留在over状态,发现没时间后也会进入over状态

点阵显示:

begin

if clk_scan'event and clk_scan='1' then

if led=1 then --jiong

case led_row is

when \=> led_row<=\when \=> led_row<=\when \=> led_row<=\

本文来源:https://www.bwwdw.com/article/pkm2.html

Top