我嘗試打造自己的Pong(ㄧ)

pondahai
Aug 4, 2023

--

一開始他們是用純電路,沒有程式…

《乓》(英語:Pong)是雅達利在1972年11月29日推出的一款投幣式大型電玩遊戲。 《乓》是一款桌球遊戲,其英文名稱「Pong」來自桌球擊打後所發出的聲音。 -wikipedia

兩個球拍來回傳球。分數顯示在屏幕頂部。 出處:wikipedia

目前網路上可以找到當年Pong的電路圖,我還沒仔細看過,前一陣子我突然想到,這是一個絕妙的練習,我想從無到有自己打造一款Pong。

之前因為設計單一指令CPU而接觸到的數位電路模擬器:logisim。這是一款很好用的數位電路模擬器,不只可以在電腦上對數位電路進行模擬驗證,還可以自製零件庫,將真實世界的數位IC包裝成模擬器的零件,讓使用者可以先在虛擬世界驗證成功再開始實體接線,大大節省時間。

根據初步理解,Pong是藉由當年的映像管電視機的掃描顯示原理進行畫面顯示,所有的信號時序都是隨著電視掃描信號的變化。隨著電視掃描線的行進,電路必須即時產生當下螢幕的信號。為此,我必須先在logisim裏面「製作一部電視」。

電視機映像管的構造,當中的虛線就是電子束 出處:wikipedia

我所認識的電視信號是NTSC,這是一種將多種信號彙整成一條信號的技術方法,透過「分時多工」的原理,將電視所需的控制信號以及影像信號分別在不同時間出現在信號線上。

電視掃描線是在傳統映像管電視中特有的存在,在映像管中有一個電子槍,電子槍會發射電子束,將電子經過高壓加速後打擊在映像管的螢光幕上。因為電子束在螢光幕上只有一個點,所以為了構成一個完整畫面,電子束必須以快於人眼視覺暫留的時間「畫」出整個畫面,由此我們就可以看到電視畫面顯示出來。由此可知,電視畫面的信號必須把一整個畫面的訊號拆解成點訊號,然後隨著掃描線運動的位置,將畫面上該點的訊號送給電路進行顯示。

電視掃描線的掃描順序 出處:wikipedia

為了在logisim裏面實現類比電視機的運作,我其實是用模擬的方式。首先找到logisim裡面的LED矩陣,這個矩陣最大可以到32點X32點,然後我用了一組串入並出移位暫存器,模擬接收電視訊號,在一條水平掃描線接收完成之後,水平同步信號會將移位暫存器的資料送到對應的水平線暫存器,然後這時候LED矩陣對應的水平線就會顯示剛剛送入的資料,接著就會切換到下一條水平線,重複以上的動作,藉此模擬電視信號在logisim上面顯示。

接下來就是進入遊戲的邏輯,首先思考如何在螢幕上顯示一顆球。首先會想到系統應該會有兩組計數器,一組負責水平位置的計數,另一組負責垂直位置的計數,把水平位置計數器的溢位輸出當作水平同步信號送給顯示器,並且也接到垂直計數器的時脈輸入,這樣就可以得到掃描線目前位置的數值。然後再拉兩個比較器,用來定位球的位置。例如,想要在螢幕正中的位置顯示這顆球,就可以讓水平與垂直的計數值分別與16這個數字進行比對,一旦水平與垂直都走到了16的位置,我們就讓信號輸出到顯示器。這樣可以看到螢幕正中會有一顆球。

兩組計數器與兩組比較器就可以在畫面中顯示一顆靜態的點

然後我們會想讓這個球動起來,其實也很簡單,就是為這個球再放入屬於它的水平與垂直計數器。只是球的運動需要考慮一下撞到牆壁的反彈行為該如何實作?這時候就需要用到「上下數計數器」。

上下數計數器會有一隻控制腳負責決定目前的計數方向,而電路中為了達到這個目的,這邊會放一個RS正反器來控制這隻「上下數」的信號。這邊的思考邏輯是這樣:為了讓球碰到牆壁會反彈,首先必須有一組比較器負責監視目前的計數值,一旦球的座標等於0或是等於31(五位元計數器的上限)那麼就必須切換計數器的方向,這時候RS正反器就派上用場,RS正反器的輸入只要一收到觸發,就會改變成對應的輸出並保持,完全符合目前的需求。

加上了球座標的計數器

球座標計數器的時脈來自於螢幕的垂直同步,換句話說,螢幕刷新一幀才會計數一次球座標,如此一來球的運動才會滑順。另外RS正反器是屬於同步型,所以RS正反器的時脈就跟球計數器一起作動。另外電路中所有計數器的時脈輸入都加上了反相器,這是因為希望計數器可以在計數器的輸入信號穩定之後再觸發。

這邊先聊到這裡,下一篇接著聊。

--

--

pondahai

有容乃大 海納百川 我是彭大海 以前是工程師 現在不是工程師 贊助鏈結: https://www.paypal.me/pondahai