天天看點

拔河遊戲機——ABLE-HDL語言實作拔河遊戲機

茲于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 總體方案設計

總體功能框圖:

拔河遊戲機——ABLE-HDL語言實作拔河遊戲機

工作原理:通過可編輯信号發生器設定1KHz的脈沖信号提供給脈沖與信号發生器一個窄脈沖,脈沖與信号發生器在左右兩個脈沖按鍵分别按下後,能産生脈沖與亮點方向移動信号,産生的脈沖信号與亮點方向移動信号作為可逆計數器的輸入信号,使計數器開始進行計數,計數的結果作為可逆計數器的輸出,并輸出到發光二極管進行顯示,進而實作拔河遊戲機的功能。

4、單元子產品設計

    拔河遊戲機的設計分為兩個單元子產品電路。第一個單元子產品電路為可逆計數器,主要實作計數功能、加減功能(即方向dir,dir為1則向左,dir為0則向右)、同時具有遊戲複位功能。第二個單元子產品電路為脈沖與方向發生器,主要實作脈沖信号與亮點方向移動信号的産生功能。

4.1 可逆計數器單元子產品電路設計

燒錄進GAL16V8晶片的ABLE-HDL代碼:

MODULE DWZwin2
DECLARATIONS
clk pin 1;
dir pin 2;
CLR pin 3;
q6..q0 pin 19..13 istype ‘reg’;
Q = [q6..q0];
EQUATIONS
	Q.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

           

晶片引腳對應關系以及導線連接配接:

拔河遊戲機——ABLE-HDL語言實作拔河遊戲機

4.2 脈沖與方向發生器單元子產品電路設計

燒錄進GAL16V8晶片的ABLE-HDL代碼:

MODULE KEY
DECLARATIONS
clk 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];
EQUATIONS
	S1.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
           

數字波形圖:

拔河遊戲機——ABLE-HDL語言實作拔河遊戲機

晶片引腳對應關系以及導線連接配接:

拔河遊戲機——ABLE-HDL語言實作拔河遊戲機

4.3 拔河遊戲機的總體電路設計

拔河遊戲機——ABLE-HDL語言實作拔河遊戲機

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。

測試結果:經過上述測試後,脈沖與方向發生器的功能符合設計要求。

第二次發部落格,寫的不是很好,望各位大神多多指正,不喜勿噴。