拔河游戏机——ABLE-HDL语言实现

来源:互联网 发布:lol比赛视频软件 编辑:程序博客网 时间:2024/06/06 01:08

兹于2016年12月,应《数字逻辑》课程设计的要求,本人(惠州学院->信息科学技术学院->软件工程->戴文治)在麦山老师指导下用ABLE-HDL语言实现了拔河游戏机的功能。



拔河游戏机



1、题目描述

    拔河游戏机用7个发光二极管排列成一行,开机后只有中间一个发亮,以此作为拔河的中心线,游戏双方各持一个按键,迅速地、不断地按动产生脉冲,谁按得快,亮点向谁方向移动,每按一次,亮点移动一次。任一方终端二极管发亮时这一方获胜,此时双方按键被锁住,只有经复位后才使亮点恢复到中心线。



2、参考资料清单及元器件清单

《数字逻辑》 (第六版立体化教材 科学出版社)

GALl6V8                                                            2片

GAL编程器系统                                                 1套

TDS-2数字系统综合实验平台                        1台

导线                                                                    若干

ispExpert软件


3、总体设计方案

    由设计内容可知,首先需要设计一个十进制的可逆计数器,用于对双方按钮的次数计数,并将游戏过程的状态进行输出。设计中还需要一个脉冲与方向产生器用于产生脉冲信号与亮点移动方向的判断,通过可编辑波形发生器设定1KHz频率的信号。其次,显视控制部分设计要求在发光二极管上显示游戏状态,左方每按一次,亮点向左边移动一次;右方每按一次,亮点向右边移动一次。还需设置一个清零端,用于复位。再者,运用ABLE-HDL语言对各个模块进行程序编码,然后将所编码的程序烧录GAL16V8中。最后,将烧录好的芯片在实验箱组装起来,就可得到符合要求的拔河游戏机。


3.1 功能和逻辑需求分析

可逆计数器:当有脉冲信号与方向信号过来时,计数器开始判断亮点移动方向,并进行计数。当有向左移动的信号(dir=1)过来时,即计数器上的方向输入端为1,则将计数器按2→4→8→16→32→64→64的方向进行计数;当有向右移动的信号(dir=0)过来时,即计数器上的方向输入端为0,则将计数器按32→16→8→4→2→1→1的方向进行计数。
 
脉冲与信号发生器:用可编辑信号发生器设定1KHz的频率的脉冲连续输入窄脉冲到脉冲与方向信号产生器,同时将左键key1和右键key2也接入脉冲与方向信号产生器。然后设置两个状态机,一个状态机S1是左键的,另一个状态机S2是右键的。当按左键时将产生一个脉冲信号,开始进行S1的状态循环s0→s1→s2→s3→s0,当key1=0时为状态s0,当key1=1时开始从s0状态转移到s1状态,此时输出clk1=0,dir=0。然后判断key1是否还等于1,若不成立为出现异常回到状态s0,此时输出clk1=0,dir=0,否则状态从s1转移到s2状态,此时输出clk1=0,dir=1。然后再判断key1是否还等于1,若不成立为出现异常回到状态s0,此时输出clk1=0,dir=0,否则状态从s2转移到s3状态,此时输出clk1=1,dir=1。然后再判断key1是否还等于1,若不成立为出现异常回到状态s0,此时输出clk1=0,dir=0,否则状态暂停在s3状态,此时输出clk1=0,dir=0直到key1=0进入s0状态为止;同理,当按右键时将产生一个脉冲信号,开始进行S2的状态循环s0→s1→s2→s3→s0,当key2=0时为状态s0,当key2=1时开始从s0状态转移到s1状态,此时输出clk2=0,dir=1。然后判断key2是否还等于1,若不成立为出现异常回到状态s0,此时输出clk2=0,dir=1,否则状态从s1转移到s2状态,此时输出clk2=0,dir=0。然后再判断key2是否还等于1,若不成立为出现异常回到状态s0,此时输出clk2=0,dir=1,否则状态从s2转移到s3状态,此时输出clk2=1,dir=0。然后再判断key2是否还等于1,若不成立为出现异常回到状态s0,此时输出clk2=0,dir=1,否则状态暂停在s3状态,此时输出clk2=0,dir=1直到key2=0进入s0状态为止。最后将左键和右键产生的脉冲用或门连接起来,输出一个总的脉冲信号到可逆计数器,同时也输出dir信号到可逆计数器。


3.2 总体方案设计

总体功能框图:


工作原理:通过可编辑信号发生器设定1KHz的脉冲信号提供给脉冲与信号发生器一个窄脉冲,脉冲与信号发生器在左右两个脉冲按键分别按下后,能产生脉冲与亮点方向移动信号,产生的脉冲信号与亮点方向移动信号作为可逆计数器的输入信号,使计数器开始进行计数,计数的结果作为可逆计数器的输出,并输出到发光二极管进行显示,从而实现拔河游戏机的功能。



4、单元模块设计

    拔河游戏机的设计分为两个单元模块电路。第一个单元模块电路为可逆计数器,主要实现计数功能、加减功能(即方向dir,dir为1则向左,dir为0则向右)、同时具有游戏复位功能。第二个单元模块电路为脉冲与方向发生器,主要实现脉冲信号与亮点方向移动信号的产生功能。

4.1 可逆计数器单元模块电路设计

烧录进GAL16V8芯片的ABLE-HDL代码:

MODULE DWZwin2DECLARATIONSclk pin 1;dir pin 2;CLR pin 3;q6..q0 pin 19..13 istype ‘reg’;Q = [q6..q0];EQUATIONSQ.clk=clk;when(CLR) then {Q:= 8;}else when(dir==1) then{when(Q==1) then Q:=1;else when(Q==2) then Q:=4;else when (Q==4) then Q:=8; else when (Q==8) then Q:=16; else when (Q==16) then Q:=32;else when (Q==32) then Q:=64;else when (Q==64) then Q:=64;}else when(dir==0) then {when(Q==64) then Q:=64;else when(Q==32) then Q:=16;else when (Q==16) then Q:=8; else when (Q==8) then Q:=4; else when (Q==4) then Q:=2;else when (Q==2) then Q:=1;else when (Q==1) then Q:=1;}END

芯片引脚对应关系以及导线连接:



4.2 脉冲与方向发生器单元模块电路设计

烧录进GAL16V8芯片的ABLE-HDL代码:

MODULE KEYDECLARATIONSclk pin 1;key1 pin 2;key2 pin 3;dir pin 19;clk1 pin 18;clk2 pin 17;clk3 pin 16;s1,s0 pin 13,12 istype 'reg';S1=[s1,s0];s3,s2 pin 15,14 istype 'reg';S2=[s3,s2];EQUATIONSS1.clk = clk;//左键S2.clk = clk;//右键//左键S1状态转移when(S1==0) then {when(key1==0) then  S1:=0;else {clk1=0; S1:=1;}}else when(S1==1) then{when(key1==1) then {clk1=0;S1:=2;}else {clk1=0;S1:=0;}}else when(S1==2) then{when(key1==1) then{clk1=1;S1:=3;}else {clk1=0; S1:=0;}}else when(S1==3) then {when(key1==1) then{clk1=0; S1:=3;}else {clk1=0; S1:=0;}}        dir=(S1==1) # (S1==2);//右键S2状态转移when(S2==0) then {when(key2==0) then S2:=0;else {clk2=0;S2:=1;}}else when(S2==1) then{when(key2==1) then {clk2=0;S2:=2;}else {clk2=0;S2:=0;}}else when(S2==2) then{when(key2==1) then{clk2=1;S2:=3;}else {clk2=0;S2:=0;}}else when(S2==3) then {when(key2==1) then{clk2=0;S2:=3;}else {clk2=0;S2:=0;}}clk3=clk1#clk2;END


数字波形图:

芯片引脚对应关系以及导线连接:


4.3 拔河游戏机的总体电路设计



5、电路调试与测试

    电路调试与测试主要为测试可逆计数器和脉冲与方向产生器的基本功能。对于可逆计数器单元模块,主要测试在脉冲信号与方向信号输入时,发光二极管的移动方向是否符合设计要求。对于脉冲与方向产生器,主要测试当按下左脉冲键或右脉冲键后是否能产生预计的脉冲与亮点方向移动信号。

5.1 可逆计数器单元模块

调试方法:将复位端CLR和方向端dir接到开关,将脉冲端clk接到脉冲按键。通过测试当游戏复位端置为低电平(即无效)时,dir方向端在高电平或低电平的情况下,当按下脉冲键后观察发光二极管亮点是否左移或右移;当游戏复位端置为高电平(即有效)时,观察发光二极管亮点是否停在中间。
调试步骤:将芯片输入端1(clk脉冲端)接脉冲按键,输入端2(dir方向端)接开关,输入端3(游戏复位端)也接开关。将输出端从19到13依次从左向右接发光二极管(即19为高位,13为低位)。将芯片端口20接高电平,端口10和端口11接低电平。先将游戏复位端3置为低电平,将方向端2置为高电平,按下脉冲后观察发光二极管亮点是否向左移动;将方向端2置为低电平,按下脉冲后观察发光二极管亮点是否为向右移动。当游戏复位端3置为高电平后,观察发光二极管亮点是否停留在中间。


测试用例:当将游戏复位端3置为低电平,将方向端2置位低电平,按下脉冲键后,停留在中间的发光二极管亮点向右移动一位,再按下脉冲键后,发光二极管亮点又向右移动一位;将方向端2置为高电平后,再次按下脉冲键后发光二极管亮点向左移动一位,之后连续按下脉冲键后发光二极管亮点依次向左移动,当移动到最左时,发光二极管亮点不再移动,此时将方向端2置为低电平后再按下脉冲键,发光二极管亮点也不移动。当将游戏复位端3置为高电平后,发光二极管亮点回到中间位置。将方向端2置为低电平后,再次按下脉冲键后发光二极管亮点向右移动一位,之后连续按下脉冲键后发光二极管亮点依次向右移动,当移动到最右时,发光二极管亮点不再移动,此时将方向端2置为高电平后再按下脉冲键,发光二极管亮点也不移动。
测试结果:经过上述测试后,可逆计数器的功能符合设计要求。


5.2 脉冲与方向发生器单元模块

调试方法:用脉冲按键代替1KHz频率脉冲接到芯片输入端1(clk脉冲端),用开关代替脉冲按键接到输入端2(key1左键),用开关代替脉冲按键接到输入端3(key2右键)。将输出端19(dir方向产生端)、输出端18(clk1左键脉冲产生端)和输出端17(clk2右键脉冲产生端)接发光二极管,将输出端16(clk3左键右键脉冲共同产生端)接发光二极管,将输出端13(s1)到12(s0)依次从左向右接发光二极管(即13为高位,12为低位),将输出端15(s3)到14(s2)依次从左向右接发光二极管(即15为高位,14为低位)。然后将输入端2(key1左键)(或输入端3(key2右键))置为高电平,则将输入端3(key2右键)(或输入端2(key1左键))置为低电平,按下脉冲按键观察s1、s0的状态(或s3、s2的状态)是否符合当前循环的状态,再观察dir、clk1(或clk2)和clk3是否符合当前状态下的输出情况。
调试步骤:将芯片输入端1(clk脉冲端)接脉冲按键,输入端2(key1左键)接开关,输入端3(key2右键)也接开关。将输出端19(dir方向产生端)、输出端18(clk1左键脉冲产生端)和输出端17(clk2右键脉冲产生端)接发光二极管,将输出端16(clk3左键右键脉冲共同产生端)接发光二极管,将输出端13(s1)到12(s0)依次从左向右接发光二极管(即13为高位,12为低位),将输出端15(s3)到14(s2)依次从左向右接发光二极管(即15为高位,14为低位)。将芯片端口20接高电平,端口10和端口11接低电平。先将输入端2(key1左键)置为高电平,将输入端3(key2右键)置为低电平,按下脉冲按键观察s1、s0的状态是否符合当前循环的状态,再观察dir、clk1和clk3是否符合当前状态下的输出情况。然后不断按下脉冲按键并观察是否符合所有预计情况;然后将输入端2(key1左键)置为低电平,将输入端3(key2右键)置为高电平,按下脉冲按键观察s3、s2的状态是否符合当前循环的状态,再观察dir、clk2和clk3是否符合当前状态下的输出情况。然后不断按下脉冲按键并观察是否符合所有预计情况。


测试用例:当输入端2置为高电平,将输入端3置为低电平,按下脉冲按键观察s1、s0的状态,当s1=0,s0=0时表明此时为状态S1=0,此时clk1=0,clk3=0,dir=0。然后再次按下脉冲按键观察s1、s0的状态,当s1=0,s0=1时表明此时为状态S1=1,此时clk1=0,clk3=0,dir=1。然后再次按下脉冲按键观察s1、s0的状态,当s1=1,s0=0时表明此时为状态S1=2,此时clk1=1,clk3=1,dir=1。然后再次按下脉冲按键观察s1、s0的状态,当s1=1,s0=1时表明此时为状态S1=3,此时clk1=0,clk3=0,dir=0。然后再按下脉冲按键s1、s0的状态不发生改变,clk1、clk3和dir也不发生改变。重新进行上述步骤但在中间时将输入端2置为低电平(异常情况),此时按下脉冲按键s1=0,s0=0表明此时状态回到S1=0;同理,右键情况也跟上面的测试方法类似。当输入端2置为低电平,将输入端3置为高电平,按下脉冲按键观察s3、s2的状态,当s3=0,s2=0时表明此时为状态S2=0,此时clk2=0,clk3=0,dir=1。然后再次按下脉冲按键观察s3、s2的状态,当s3=0,s2=1时表明此时为状态S2=1,此时clk2=0,clk3=0,dir=0。然后再次按下脉冲按键观察s3、s2的状态,当s3=1,s2=0时表明此时为状态S2=2,此时clk2=1,clk3=1,dir=0。然后再次按下脉冲按键观察s3、s2的状态,当s3=1,s2=1时表明此时为状态S2=3,此时clk2=0,clk3=0,dir=1。然后再按下脉冲按键s3、s2的状态不发生改变,clk2、clk3和dir也不发生改变。重新进行上述步骤但在中间时将输入端3置为低电平(异常情况),此时按下脉冲按键s3=0,s2=0表明此时状态回到S2=0。
测试结果:经过上述测试后,脉冲与方向发生器的功能符合设计要求。



第二次发博客,写的不是很好,望各位大神多多指正,不喜勿喷。

1 0
原创粉丝点击