猶記十多年前,小弟我在經過一段時間的準備後,到了高雄正修科大參加數位電子甲級技術士檢定,我採用的是8051單晶片(AT89S52)系統,當天早上我抽中第1題:
✭輸入是4顆按鈕開關接成2*2鍵盤掃描(當然要有防彈跳功能)
✭輸出是8*8的LED矩陣(平常練習時是用單色,只有16支腳,已經練得很熟練,但檢定那
天發的卻是雙色,共有24支腳位,突如其來的改變,讓我在檢定一開始就花了近30分鐘
確定每個腳位的定義,果然是甲級,臨場反應也是測驗項目之一)
✭要求的功能是製作簡易的乒乓球比賽(如下示意圖):
利用SW1及SW2控制球拍A的左右移動,SW3及SW4控制球拍B的左右移動
球的行進方向有左上、上、右上、左下、下、右下等6個方向
球若碰到左右兩邊的牆要能反彈
球若向上碰到球拍B則要以亂數選擇變成左下、下、右下其中之一
球若向下碰到球拍A則要以亂數選擇變成左上、上、右上其中之一
球若往上或下而沒有碰到球拍,則比賽結束
球移動的速度會隨著時間進行而變快
印象中,這個題目是監評委員在檢定當天一大早命題的,因為我拿到考題時,試題紙上的文字是手寫的,且因為剛影印完,所以試題紙還是熱的。
8點術科測驗開始,量測零件及完成所有電路板的硬體銲接大約是在10點初完成(因考題的硬體是固定的,所以在家練習時早已演練多次,速度有練出來),接著筆電打開,開始撰寫程式(其實有很多副程式早已寫好,例如防彈跳、矩陣掃描輸出、基本的左旋右旋......等等),到了中午12點午休時,我的2個球拍已經可以左右移動囉!而中間那顆球,只有亮住,還不會動......吃完午餐下午再戰吧!
下午1點時間到,下半場開始,想說只要能搞定球的移動及球與牆、球拍的碰撞判斷就能收工,雖沒寫過類似的程式,但感覺應該不會太難,但不寫不知道,一寫才知原來要考慮的變數其實還滿多的(球拍的位置是動態的、碰撞的偵測要用什麼方式演算、亂數決定球的方向、球行進速度的改變時機、比賽是否結束的判斷......),要解決的問題滿多的,若是平常沒有時間限制,要完成完整功能不會太難,但在時間非常有限的情形下,倍感壓力,............,隨著時間分分秒秒的過,且依據考試評分項目,考生還須將完成的程式列印出來,連電路圖也要畫出來繳交,所以更壓縮了撰寫程式的時間。.........不知不覺,來到了4點多,距考試結束的5點只剩不到20分鐘,終於在一段不斷連續絞腦汁的情形下,我的球會動了,碰到球拍及牆壁也會反彈了,只是速度變化不明顯(沒時間調參數了)。不過也出現了一個小BUG,就是球有時會在中間沒碰到球拍或牆壁時由"右上"變成"上",不管了,已沒時間修改,還是請評審來檢查評分吧,評審們測試時也玩的不亦樂乎,直呼"有功能"、"雖有一些小問題,但大致符合"......等聽起來應該是肯定的話,尤其是其中一位評審說:我在考試過程中看到你是用組合語言寫程式,這種考試大部份考生都是用C語言,用組語會很拚,能寫到這個程度,不錯了。...我心裡在滴沽...我過的機會應該不小喔!至於列印程式碼,是在4點50多分才匆匆將檔案CALL至考場的電腦後才列印,而電路圖嘛,手畫交差了事,整個列印及畫電路圖的過程,在短短10幾分鐘內完成,只能用"兵慌馬亂"形容。
最後的結果,一如自己所想,我拿到證照囉!這個融合了"辛酸"、"甜美"、"痛苦"、"無助"、"苦讀"、"成就感"、"挫折感"等各種情緒的人生歷史事件一直常浮現在我的腦海裡,也是時至今日我在接觸FPGA撰寫IC設計程式時,會拿來練功的題目,在實驗一完成了基本VGA螢幕顯示程式後,接下來的實驗二,就要讓球和球拍動起來囉!
實驗二:FPFA控制電腦VGA螢幕製作乒乓球遊戲(2)-動態顯示
1、功能需求:以實驗一的畫面為基礎,四周各有一面固定的牆,將球及4根BAR框在牆內,再來上下各一個藍色的BAR左右移動,左右各一個綠色的BAR上下移動。紅色的球有4個行進方向(左上、右上、左下、右下),球和牆、BAR發生碰撞時要能反彈。1.1因為牆是不動的,且4面牆是接在一起的,球被限制在4面牆中間,球只會與每面牆的固定一邊發生碰撞,不會和牆的另一邊及兩端點發生碰撞,因此球與牆的碰撞反彈判斷非常簡單,程式碼也很簡短。
球碰到上方牆下緣:球改成往下。
球碰到下方牆上緣:球改成往上。
球碰到左方牆右緣:球改成往右。
球碰到右方牆左緣:球改成往左。
1.2至於球與4根BAR發生碰撞時就沒這麼簡單了,因每根BAR其實都是長方形,有4個邊(2個長邊,2個短邊),而4個邊都有可能與球發生碰撞,再加上球是圓弧形,若球恰巧是和BAR的某個角落發生碰撞,則還要考慮角度問題後再判斷怎麼反彈,因此球和BAR產生碰撞的反彈判斷程式相形之下會複雜很多,無形中程式碼也會大量增加。
以球往左下方向與BAR發生碰撞的狀況來看,會有以下幾種反彈的情形:
2、電路接線圖:與實驗一完全相同。
3、系統程式架構:VHDL硬體描述語言的程式架構如下圖所示:
4、程式下載:[下列三支程式放至同一專案內]
4.1 vga_pingpong_game.vhd [主程式:請以此名稱當成專案名稱]
4.2 vga_control.vhd [元件程式:主要是控制螢幕顯示功能]
4.3 pingpong_game_control.vhd [元件程式:主要是控制各物件的位置及遊戲功能]
5、.程式功能(影片檔)
6、誌謝。以上程式有參考下列網址搜尋到的資料,感謝無遠弗界的網路世界及不藏私的神人。
ece-research.unm.edu/jimp/vhdl_fpgas/slides/VGA.pdf