数电实验报告——拔河机.doc
- 文档编号:583797
- 上传时间:2023-04-29
- 格式:DOC
- 页数:34
- 大小:3.01MB
数电实验报告——拔河机.doc
《数电实验报告——拔河机.doc》由会员分享,可在线阅读,更多相关《数电实验报告——拔河机.doc(34页珍藏版)》请在冰点文库上搜索。
北京邮电大学
数电实验综合课题设计与实现
实验名称:
拔河游戏机
班级:
2008211132
序号:
11
姓名:
杨光熙
学号:
08210874
目录
1. 设计课题的任务要求 3
2. 系统设计 3
3. 仿真波形及波形分析 12
4. 源程序 15
5. 功能说明 31
6. 实验元器件清单及资源利用情况 32
7. 实验故障及问题分析 32
8. 实验总结 33
****************设计课题的任务要求*****************
一、基本任务:
用7个发光二极管排列成一行,模拟拔河过程。
游戏开始时只有中间的发光二极管点亮,作为拔河的中心线。
用按键来模拟拔河队员,按下键表示用力,根据甲乙双方按键的快慢与多少,决定亮点移动的方向。
移到任一方终端二极管时,该方获胜,该方记分牌自动加分,然后开始下一局的比赛。
比赛采用五局三胜制,甲乙双方各自记分。
当记分牌清零后,重新开始下一场拔河比赛。
1、设置“比赛开始”按键,实现一对一拔河;
2、设置复位键,按下后比分清零,双方重新开始比赛;
3、一场比赛结束时演奏一首欢快的曲子;
二、提高要求:
1、甲乙双方可选一到多个队员进行比赛;
2、自拟其它功能。
***********************系统设计********************
【设计思路】
1、10秒倒计时的实现:
电路接1M晶振的时钟,从10秒开始计时。
用变量us计算时钟个数,用present_state显示点阵的当前状态,每1M个时钟,修改一次变量num的值,用num控制8x8点阵显示的数字。
从而实现10秒倒计时。
并且设置开始键”reset”,按下后重新开始计时。
2、10秒倒计时的显示:
采用逐列扫描的方式,对行像素分别编码,利用人眼色觉暂留效应,以1MHZ的频率扫描列,点阵上就会出现稳定的数字。
3、拔河游戏的实现:
Ⅰ、当倒计时到0秒时,游戏才能正常显示;
Ⅱ、设置游戏开始键”start”,实现一对一拔河。
按下按键后游戏开始,点亮第4个发光二极管(拔河的中心点),双方的比分清零;
Ⅲ、用两个按键”player1”、”player2”代表比赛的甲乙双方。
甲方每按”player1”键10次,亮点向左移动一点;乙方每按”player2”键10次,亮点向右移动一点。
当亮点到达最左边(第一个点),甲方胜利;反之,亮点到达最右边(第七个点),乙方胜利。
Ⅳ、当有一方胜利后,蜂鸣器发声。
4、各个模块功能:
Ⅰ、绳子显示模块:
输入为两路脉冲信号,对两路脉冲分别记数,然后解码后控制LED灯亮灭的位置;
Ⅱ、计分模块:
每当LED灯移动到LED0或者LED6时,产生一个下降沿信号,然后七段数码管的计数器增加,然后将当前的所胜得局数显示在七段数码管上;
Ⅲ、乐曲模块:
在每局比赛结束后,即产生下降沿信号后,播放乐曲;
Ⅳ、开关及复位控制:
比赛开始前需要将“start”设置为1,否则按键信号输入不起作用;当比赛结束后或者在比赛过程中,按下“start”则状态返回到最初的起始状态;
Ⅴ、控制电路:
在LED灯移动到最左边或者最右边时,产生一个控制信号,使计数器停止计数,使乐曲播放,并将此信号作为七段数码管使能端的输入信号。
【总体框图】
ASM图:
开始
start是否为1
触发记时器(1秒)
no,循环检测
yes
检测参赛者是否有按键脉冲
no,循环检测
1秒时间到
判断是否到最左或者最右
对两路脉冲分别进行计数,存于count1、coun2
yes
蜂鸣
锁定count1,count2
译码,控制LED灯显示位置,并清零count1,count2
yes
在七段数码管上显示
胜利局数加一
判断是否有一方胜利
no
将灯状态锁定,显示也不变
yes
检测复位键是否按下
no,继续返回
yes,计分器清零
MDS图:
start=0
Wait
start=1
LED4(中间灯)
count2>count1count1>count2
灯右移
count2>count1 count1 灯左移 count1>count2 count1 计分器发生变化,同时播放乐曲,BT3=0 LED6 LED0 Victory<3 Victory=3 检测复位键 BT4=1 计分器清零 【分块设计】 计时进程: 数据处理进程: 显示控制进程: 【点阵设计】 1、点阵列管脚信号编码: 其中col的编码从右到左依次是点阵列管脚1-8的输入信号,即给要显示的列管脚输入低电平,其他管脚为高电位。 2、点阵行管脚信号编码 比如数 字4的点阵行编码为: casecis when1=>row<="00000000"; when2=>row<="00000000"; when3=>row<="00001100"; when4=>row<="00010100"; when5=>row<="00100100"; when6=>row<="01111111"; when7=>row<="00000100"; when8=>row<="00000000"; endcase; 其中row的编码从右到左依次是点阵行管脚1-8的输入信号,即在显示的某列时,输入该列相应的行编码,显示的行输入高电平,反之输入低电平。 3、发光二极管信号编码: 其中led的编码从右到左依次是发光二极管1-8的输入信号,即给要亮的灯输入高电平,其他灯为低电位。 *******************仿真波形及波形分析******************* 1、倒计时电路的仿真: 由于频率太高,不易仿真,以下的仿真假设每8us为倒计时的1s,即8个时钟改变一次显示的数字。 从10开始倒计时,点阵列管脚从左到右进行扫描,依次赋值为低电平。 同时对该列的行管脚进行编码赋值,以较高的频率进行重复扫描,便可以显示相应的数字。 由于恰好是从左往右扫描的,所以可以在以上的仿真波形比较明显的看出显示的数字(第一幅波形显示的是10~7,第二幅波形显示的是7~4,第三幅波形中显示的是4~0)。 倒计时到0后,点阵就一直显示数字0。 且拔河游戏机不工作,8盏灯都不亮,蜂鸣器不响。 2.拔河游戏机的仿真: 电路板上共有8盏灯,游戏中现使用前7盏。 从以上的仿真波形中可以看到,当player2一直在赢的时候,代表它的三盏灯逐渐转移,知道达到终点,即点亮的灯(拔河的中心点)到达最左边的第一盏灯时(甲方胜利),播放音乐,表示其胜出。 上图表示,当player2赢了一局之后,有”start”复位,如果player2还是一直赢,代表它的等继续相继转移,知道终点。 这是一个循环过程。 上图表示,当player2赢了一局之后,有”start”复位,如果复位后,双方都没有按键,则中点一直保持在原状态,不发生偏移。 ***********************源程序********************** 【顶层模块】 libraryIEEE; useIEEE.std_logic_1164.all; useIEEE.std_logic_unsigned.all; entitybaheis port( player1,player2: instd_logic; --玩家1,2输入 clk_in: instd_logic; --clk_in(1MHZ) reset: instd_logic; --重置键 row: outstd_logic_vector(7downto0); col: outstd_logic_vector(7downto0); led: outstd_logic_vector(7downto0); --绳子 cats: outstd_logic_vector(6downto0); --比分 q: outstd_logic_vector(5downto0); --数码管控制 mus: outstd_logic); --蜂鸣输出 endbahe; architecturebody_baheofbaheis componentdivision --分频模块 port( clk_in: instd_logic; --1MHZ输入 clk_100,clk_5,clk_1: outstd_logic);--100HZ,5Hz,1HZ endcomponent; componentcount --计数模块 port( clk_1: instd_logic; --1HZ输入 sw: instd_logic; --状态开关 player1,player2: instd_logic; --选手输入 sum1,sum2: outstd_logic_vector(4downto0)); --计数结果输出 endcomponent; componentcmp --比较模块 port( clk_100: instd_logic; --100hz clk_1: instd_logic; --1hz sw: outstd_logic; --状态开关输出 reset: instd_logic; --重置 start: instd_logic; --开始 sum1,sum2: instd_logic_vector(4downto0);--计数结果输入 music_begin: outstd_logic; --音乐 record1,record2: outstd_logic_vector(1downto0);--比分输出 lights: outstd_logic_vector(2downto0)); --拔河绳子显示 endcomponent; componentmusic --音乐模块 port( reset: instd_logic; --重置 clk: instd_logic; --1MHz clk_5: instd_logic; --5hz music_begin: instd_logic; --音乐开始 mus: outstd_logic); endcomponent; componentdecode --译码模块 port( clk_in: instd_logic; --1mHZ record1,record2: instd_logic_vector(1downto0); --比分输入 lights: instd_logic_vector(2downto0); --拔河绳子输入 led: outstd_logic_vector(7downto0); --输出到LED q: bufferstd_logic_vector(5downto0); --数码管控制 cats: outstd_logic_vector(6downto0) --数码管显示比分 ); endcomponent; componentdaojishi --倒计时模块 port( clk_in,clk_1,reset: instd_logic; row: outstd_logic_vector(7downto0); col: outstd_logic_vector(7downto0); start: outstd_logic ); endcomponent; --分频器输出 signalclk_100,clk_5,clk_1: std_logic; --时钟信号 --计数器输出 signalsum1,sum2: std_logic_vector(4downto0); --计数结果 --比较器输出 signalsw: std_logic; --状态开关 signalrecord1,record2: std_logic_vector(1downto0); --比分 signallights: std_logic_vector(2downto0); --绳子 signalmusic_begin: std_logic; --解码器输出 signaltmp_led: std_logic_vector(7downto0); --LED显示 signal tmp_q: std_logic_vector(5downto0); --数码管控制 signaltmp_cat: std_logic_vector(6downto0); --数码管显示比分 --倒计时器输出 signaltmp_start: std_logic; begin cats<=tmp_cat; q<=tmp_q; led<=tmp_led; div: divisionportmap(clk_in=>clk_in,clk_100=>clk_100,clk_5=>clk_5,clk_1=>clk_1); cnt: countportmap( clk_1=>clk_1,sw=>sw,player1=>player1,player2=>player2, sum1=>sum1,sum2=>sum2); com: cmpportmap( clk_100=>clk_100,clk_1=>clk_1,sw=>sw,reset=>reset, start=>tmp_start,sum1=>sum1,sum2=>sum2,music_begin=>music_begin, record1=>record1,record2=>record2,lights=>lights); dec: decodeportmap( clk_in=>clk_in,record1=>record1,record2=>record2, lights=>lights,led=>tmp_led,q=>tmp_q,cats=>tmp_cat); mu: musicportmap( reset=>reset,clk=>clk_in,clk_5=>clk_5, music_begin=>music_begin,mus=>mus); dao: daojishiportmap( clk_in=>clk_in,clk_1=>clk_1,reset=>reset, start=>tmp_start,col=>col,row=>row); endbody_bahe; 【比较模块】 libraryIEEE; useIEEE.std_logic_1164.all; useIEEE.std_logic_unsigned.all; entitycmpis port(clk_100: instd_logic; --100HZ输入 clk_1: instd_logic; --1HZ输入 reset: instd_logic; --重置 start: instd_logic; --开始 sum1,sum2: instd_logic_vector(4downto0); --计数输入 record1,record2: outstd_logic_vector(1downto0); --比分输出 music_begin: outstd_logic; --音乐开始 sw: outstd_logic; --状态输出 lights: outstd_logic_vector(2downto0)); --绳子状态 endcmp; architecturebody_cmpofcmpis signaltmp_record1: std_logic_vector(1downto0); --比分 signaltmp_record2: std_logic_vector(1downto0); signaltmp: std_logic_vector(2downto0); --绳子状态 signaltmp_sta: std_logic; --状态 signals1,s2: std_logic_vector(4downto0); --计数 begin record1<=tmp_record1; record2<=tmp_record2; lights<=tmp; sw<=tmp_sta; process(clk_100) --判断比赛状态 begin if(start='1')then if(clk_100'eventandclk_100='1')then tmp_sta<='1'; endif; endif; if(clk_100'eventandclk_100='1')then --任意比分到3,比赛结束,开始播放音乐 if(tmp_record1="11"ortmp_record2="11")then tmp_sta<='0'; music_begin<='1'; endif; if(tmp="001"ortmp="111")then --绳子到头,进入等待状态 tmp_sta<='0'; endif; if(reset='1')then --复位,状态归零 tmp_sta<='0'; music_begin<='0'; endif; endif; endprocess; s1<=sum1; s2<=sum2; process(clk_1,reset) --控制绳子移位 begin if(reset='1')then tmp<="100"; --绳子初始状态为100 tmp_record1<="00"; tmp_record2<="00"; else if(clk_1'eventandclk_1='1')then if(tmp_sta='1')then if(s1>s2)thentmp<=tmp-'1'; --绳子左移 elsif(s1=s2)thentmp<=tmp; --绳子保持原
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 报告 拔河