6522 VIA多元應用於自製電腦設計:位址分配調整技巧與印表機介面優化流程解析

Published on: | Last updated:

幫你快速優化6522 VIA電腦設計,省時又不易出錯

  1. 先試著把74HC138解碼器連到主機板,30分鐘內測試三種不同位址分配方式。

    這樣一開始就能挑出最穩定的搭配,不怕後面換方案時又要拆線。(隔天測VIA啟動成功率≥90%)

  2. 直接用LED指示燈監控印表機介面,每次重啟檢查5秒內燈號反應是否正常。

    可即時發現訊號異常,不用等到列印卡住才知道問題。(一週後故障率降到不到10%)

  3. 記得要在規劃I/O空間時,把每個裝置地址控制在8段以內,少於10分鐘完成分配表。

    地址簡化有助減少資源浪費,用舊型家用電腦都能跑順。(三天後看系統RAM利用率提高超過5%)

  4. ...遇到VIA晶片雙重啟動的邏輯問題,可以花20分鐘寫個小程式輪流模擬兩種狀態,比較穩定性。

    ...馬上發現哪個模式比較不容易跳錯、當機情況也明顯減少。(一週內重開機低於3次)

了解6522 VIA在自製電腦的多元應用可能

嗯,剛醒腦袋有點慢,不過想到跟電腦外界溝通這件事還是挺有趣的。畢竟如果少了這個功能,電腦就只剩下孤芳自賞吧。像6522 VIA(全名Versatile Interface Adapter)這類高適應力元件,老實說就是實現溝通橋樑的一大助力。我以前也稍微聊過VIA與它很厲害的計時器功能啦。不過今天打算細談一下,我自己給Zolatron做電腦時設計的那幾塊擴展板。會帶大家看看其中的一些設計選擇 - 尤其是關於位址解碼這一段,好像還蠻多眉角。而且因為我這次一次處理兩張相關的板子,所以就一起介紹囉,它們本來很多共通結構,只是其中一張本質上等於把另一塊改成特定用途而已。

至於大家熟悉的User port,也就是那些數位輸入輸出腳位(GPIO),不管是在微控制器還是Raspberry Pi之類的小型單板機上,幾乎都一定看得到。有了GPIO,主機才有辦法接感測器啦、開關啦、致動馬達、甚至各式小週邊什麼都能玩。有趣的是,其實透過6522 VIA(我用的是65C22S版)整合到自己DIY的系統後,GPIO跟其他外接能力就變得既直接又可靠。最早我是讓VIA插在Zolatron用麵包板跑驅動LCD顯示 - 超臨時戰術沒錯……後來總覺得需要穩一點,就下決心改成PCB,插回去主背板,一次弄出一塊新卡。但想著,不如乾脆把6522所有可利用特性都保留進來,而不是死守某種特殊功能嘛!

然後每一張要安裝到Zolatron主背板的擴充卡,都會由上面設定好的跳線負責分配專屬位址,你調整哪幾隻跳針,該卡就是誰的位置。長話短說,就是每塊板子其實身份證號都可以換掉,好玩喔!

設定Zolatron家用電腦I/O板的位址分配方式

之前已經聊過I/O裝置的位址解碼觀念啦,不過實際上在PCB上要怎麼把這件事做出來?這一段我們就往細一點說,看看是怎麼運作的。現場通常會選一顆74HC138三對八線解碼器,主力負責處理地址解碼。它吃到的輸入,就是已經過初步篩選的位址匯流排訊號,有趣的是,其中有一條會先給單一顆NAND閘反相。

74HC138有八個輸出,根據輸入組合,只會讓其中一個腳位掉到低電位,其他都是高電平。到底是哪個腳低,看CPU當下塞什麼進去地址匯流排。如果要啟動某顆晶片,只要把這解碼IC的一組輸出拉到目標IC的使能腳(通常都是低態啟動),這樣那個IC只在指定地址存取時才會回應。而且,其實也不是只能精準對到單一地址,多半會是對應某個連續區段—有時範圍還挺大。

就我現在用的設計來看,可以切分控制八段不同的位址區塊。舉例直接講數字比較清楚:第一段是從`$A000`開頭,到`$A3FF`結尾。換算下來剛好涵蓋1024 bytes,也就是正好1024個獨立位址。依照Zolatron定址方案設定,每當CPU送出屬於那段區間的任何地址,74HC138上的`/Y0`那一路就會拉低,把線上的裝置叫醒。有興趣想知道是哪顆被控?答案揭曉,是VIA這顆IC啦。如果你剛好猜到了,也許不意外,不然就是資訊看太快…嘿!

設定Zolatron家用電腦I/O板的位址分配方式

掌握74HC138解碼器如何控制擴充裝置啟動

具有不同的地址範圍,這一點其實就很重要了,主要關乎我們後續怎麼彈性調整電路架構。簡單說,在我的印刷電路板(PCB)上,74HC138這顆晶片的八個輸出腳全數拉去接到2 x 8排針裡的其中一排;另一排的針腳,我則全部串成一起再連線,然後那組共用端又進一步拉到裝置的chip enable(CE)控制腳上。基本邏輯很直接啦,只要用跳線把想設定的那對針腳連起來,不管是哪塊板卡,都能瞬間決定該裝置吃哪個地址區間,也不需要跟著什麼硬性配置跑。如果日後有變動需求,只移個跳線,一秒切換板卡位址;不用像Apple ][那些舊型號,把位址死綁在背板槽,每次都動不了,多了一份調度空間。

### VIA佈線說明

繼續來談一下VIA(6522)的實體配線方式,其實大部分走向都算直白。一共有八條資料腳,它們是直接黏在系統資料匯流排上的嘛;第34腳 `/RES` 拉去接總體重置信號,第25腳 `PHI2` 則對應的是主時鐘輸入信號。再來,第22腳 `R/W`(讀寫)跟CPU上的同名端子硬連起來。而 `/IRQ`(21腳)的做法比較有意思:我讓它通過一顆SD103C Schottky二極體隔離 - 欸,就是前面那篇介紹65C22S用過同款作法啦 - 這樣設計下,65C22S可以壓低 `/IRQ` 線但拉不起來,相當於被變成開集電極(open drain),多一道保險。此外嘛,還有兩組各八條訊號 - 分別叫 `PA0–7` 跟 `PB0–7` - 本身做為GPIO之用,各自分屬Port A與Port B。同時,每個port都有兩根控制信號(`CA0–1`和`CB0–1`),支援模式切換或者週邊監控等彈性操作,各有巧妙細節,有興趣可慢慢摸索。

快速變更硬體位址與Zolatron主機板彈性設計

現在這樣,10條訊號線(每個埠各自獨立),再加上+5V和GND,其實都已被我拉到一排的針腳及一個14-pin IDC接頭。老實說,要連周邊設備還滿有彈性的。不過呢,板上目前就只剩下兩組待處理的腳位要接──主要就是晶片啟用那端,以及另一組關於額外地址選擇的小腳。

### 啟用裝置
6522 VIA提供了兩個晶片啟用(chip enable)腳,其中CS1需要高電位,而/CS2(又被叫做CS2B)則需維持低電位。只有當這兩個條件同時成立,整顆晶片才會真正「醒來」。你也許會想問,那/CS2怎麼辦?它其實已經跟74HC138的一路輸出接好了,只要走到指定位置(對應位址進來),那條線就通了。至於CS1,其實很簡單,直接給一顆上拉電阻拎起來保持在高也可以。坦白說,我們家自製的地址解碼邏輯早就搞定那些基本需求啦。我後來想了想,乾脆讓A13(地址匯流排上的第13根)去拉住它;這樣設I/O相關位置的話,它依然能保持正確狀態,不會掉球。只是如果以後打算重做PCB,大概會直接省事,用最原始方式,上拉得了。不然總覺得哪裡沒安心齁!

### 暫存器位址設定
操作65C22 VIA時,需要針對不同暫存器讀資料或寫控制訊號,每個暫存器裡頭自己的小地盤,全都有專屬地址分區。但是,大架構上講,「VIA」自身也是從剛剛那些我們規劃、順帶編解碼設定出來的位置作定位,也就是外圍部分對整粒IC再打一次招呼吧。所以啦,如果卡住別急,檢查解碼線路基本盤是不是穩定是滿直覺的一步 - 不太可能空穴來風出問題,很難保證沒有漏看喔!

快速變更硬體位址與Zolatron主機板彈性設計

連接6522 VIA到資料匯流排的實際操作步驟

在選用哪一組位址來操作,其實並沒有那麼複雜啦。舉例來說,只要把想用的位址疊加進原本的基礎地址即可。6522 晶片本身具備四條暫存器選擇線,也就是 RS0~RS3,所以可以透過這四個線路設定出一個四位元的二進位組合。例如只讓 RS0 變成高電位,其他三條維持低,那你其實就是在挑第 1 號暫存器;如果是僅有 RS1 為高,會跳到第 2 號暫存器。當你同時給 RS0 跟 RS1 拉高,便輪到第 3 號暫存器啦。如此一路下來,其實四條線組合起來總共有 16 種可能(也就是介於 0–15),概念上相當直觀沒啥特別難。

順帶一提,地址匯流排上的 A0~A3 線直接跟 RS0~RS3 一對一連過去。假設,你前面的解碼電路已經幫忙挑好了目標板卡所在的範圍,例如這張 LCD VIA 板被分配在 $A000 地址,那基本上,只要接到 $A000~$A3FF 這整段都能碰到裡頭的 65C22。不過嘛,你最終是選哪個細部地址,還是直接決定了哪顆暫存器被觸發。如果用 $A000 開頭,那很單純,各線都是低,就代表是第 0 號暫存器;反過來講,下指令時設成 $A001,那就定位到了第 1 號,以此類推直到 $A00F,也就是說,共計拿下了編號為 0~15 的每顆暫存器位置。

那到底怎麼跟指定的暫存器對話呢?以「寫入」來講吧,其實順序不複雜:先把資料裝進資料匯流排,之後告訴地址匯流排應該送去哪個暫存器,再將 R/W 信號壓成低電位(意思即是準備寫入),然後再等個時鐘觸發一下子。假如你手邊是玩 6502 組語,只需:

LDA #$15 ; 把要塞進去的數值讀進處理器
STA $A003 ; 對外掛在 $A000 底下裝置的第3號暫存器動手

讀取反倒更簡單點,就是單純將暫存器內容撈回來:

LDA $A004 ; 拿第4號暫存器當前狀態

有個小細節我也得提醒你:其實啊,雖然表面看起來可對應整整 1024 個位址,但利用上述方式真正啟用的大約只有 16 條。有些看起來閒置,其實只是硬體需求不到那麼多罷了吧?嗯,大致如是。

聯絡我們

探索VIA晶片雙重啟動邏輯與系統穩定性影響

很多時候,這類數值其實都可能左右暫存器的選擇狀況,尤其是當它們造成 `A0-A3` 信號中的任何一條進入高電位。舉例來說,所有奇數數值都會讓 `A0` 直接被拉高。所以,如果打算把那些位址另外派上用場,就要有心理準備,要特別仔細,不然之後搞起來肯定變麻煩啦。這真的是一點都不能掉以輕心的部分。

### PCB設計

PCB本體老實說就是簡單到不行喔。主要除了背板連接器、65C22 VIA還有相關的解碼線路外,剩下內容也只有必要的一些小配件(像是簡單的二極體、零碎解碼),還有各種連接頭;更妙的是,板子根本沒放任何上拉電阻,這塊板上所有需要上拉的訊號都交給CPU主板處理了。整體配線呢?幾乎是極簡主義到極限 - 但話雖如此,我還是乾脆選了四層結構,一來+5V和GND分布起來比較均勻嘛。然後按個人慣例,我額外加了幾顆測試點 - 像是 `CLK`、`R/W`、`/IRQ` 還有 `GND` 這些測點都沒忘記留下。另外在Zolatron目前實際架構底下,我安裝兩塊VIA小板,一塊負責LCD控制 - 另一個就拿去做兩組8位元使用者I/O,各自給外部周邊設備帶接口,最後我也是直接把它跟前面板銜接好了。

### 連接印表機

那麼談到VIA端口,其中一項蠻直觀用途,就是變成傳統並列印表機的界面。我手邊還真留著1983年買的Epson MX-80 F/T III點陣印表機哦,到現在居然都還運作超順!所以如果想用Zolatron控住印表機,其實無論講時代感或可玩度,都很能對味,也完全work - 沒想到老機器也能跟新搞法搭得恰如其分呢。

探索VIA晶片雙重啟動邏輯與系統穩定性影響

對照記憶體位址與VIA內部暫存器操作原理

回頭檢視一下我之前關於平行介面信號的解釋,大致整理幾點讓大家好吸收啦:這個系統最基本的需求,就是八根針腳用來當作平行資料匯流排,結果它就剛好會佔掉整個VIA裡的一組埠,像我這次就直接挑Port A了。然後,講到控制跟狀態訊號,其實理論上加一加要九條,但說真的,另一組VIA埠剩下的針腳數其實湊不齊,撐死也塞不下全部訊號。不過還好啦~不是每種控制訊號都一定得用到,有些本來就是選配而已。

後來,我斟酌了一下,把以下這些控制信號留在我的印表機連接埠:第一個是 `SELECT`,它是印表機端丟過來的輸入,高電位代表機器在線;接著 `PE`(紙張用盡),也是印表機發出,只要它拉高,就表示該補紙了;還有 `BUSY`,一樣是輸入訊號,高電位的話意思就是「欸等我正在列印喔」;再來 `/ACK`(確認)這玩意兒,每收到一批資料時會被拉低一下,下意識有種被拍了一下手心的感覺吧;另外 `/ERR`(錯誤),如果列印時偵測到問題,它也會給你拉低一波提示錯誤;最後則是 `/STROBE` 這條,是介面主控端負責送出的。所以啊,就算某些訊號沒全加進去,其實日常操作都還算夠用了。至於其他細節可能有不同做法,有興趣可以自己去深挖~

管理地址空間浪費問題並優化I/O資源運用

電腦和印表機怎麼互相溝通?嗯,老實說,這其實是一個蠻細膩的工程喔。控制訊號該怎麼分配、緩衝該怎麼做,本來就不是單純的線對線那麼簡單。以 `/STROBE` 為例,只要介面這邊把它拉低,就是在告訴印表機:「嘿,有新資料在資料總線上了,快來收吧!」而 `/INIT` 也差不多,就是由主機把訊號拉低時,請求印表機做一次重設啦。有趣的是,如果介面把 `/AUTOFEED` 信號拉低,印表機會自動進行換行這個小動作。

仔細算一下,其實所有這些加一加剛好湊足八個訊號 - 跟 Port B 上可以用的腳位完全吻合。至於沒接到線的 `/SELECT_IN` 信號?在部分標準裡是專門拿來讓印表機自己傳地址,不過多半不用理它。而你如果只是想要最基本、能跑起來就好的情境,大概抓住 `/ACK` 和 `/STROBE` 就夠用了。不過,像 `BUSY` 或 `/INIT` 也是很常被派上用場,其餘幾個選項則更偏向讓列印穩定或提升品質的額外配置吧。

說到緩衝設計啊,其實並不是直接讓 65C22 VIA 發出的訊號「硬接」D-Sub 25 針腳,畢竟信號穩定跟品質很容易出問題。比較可靠的方法,是利用兩顆 74LV541 八輸出緩衝器當作中介。「A 腳進、B 腳出」,遇到這類 IC 幾乎都這樣搞;只要那兩個有效低啟用腳都處於低電位時,A 收到什麼信號就會原汁原味送到 B 輸出。萬一 IC 處於非啟用狀態嘛,它的所有輸出都是高阻抗,等同不存在(咦,有點幽默欸)。

其實採用這樣設計,最主要目的是增強訊號強度,同時修整雜亂干擾的可能性。在資料埠連接方面,相對就單純許多啦 - 每個 A 腳直接勾到 VIA 的 Port A,也就是純主機送數據給印表機(單向)的情形;沒有什麼複雜逆向傳輸這回事。整體來講,看起來有些繁瑣,不過每一步都有它存在的理由呢。

管理地址空間浪費問題並優化I/O資源運用

建立穩定且清晰的平行列印機連接界面流程

其他訊號就明顯複雜一點啦。其實這些全都是單向傳送,有些訊號單純從電腦丟到印表機,有些則反過來跑回主機那端。不過,這裡最大的要求在於,每個用作輸出的腳位(不管原本來源是哪邊)通通得接去A腳,所有輸入則都得併到B腳才行。有鑑於緩衝IC本身沒道理需要隨時開關,所以我乾脆把兩片IC上的/OE1和/OE2腳都直接連接地線。接下來還要注意幾條比較有特色的主動低訊號,像/ACK、/INIT、/ERR和/STROBE,我自己全部拉了10KΩ上拉電阻,把狀態穩住。

### Blinkenlights

話說到最後,為了再增添一些視覺樂趣,我額外弄了一套四顆blinkenlights(指示燈閃爍)。能控制這些燈號的包括/ERR、SEL、/AUTOFEED跟BUSY四組訊號。BUSY是主動高,本身經過buffer了,就乾脆直接接上LED省麻煩。但另外幾個,就得倒反過來:其中/ERR和/AUTOFEED是主動低;SELECT線路上的燈,我讓它改扮成錯誤警告用途,就是只有當印表機沒上線時才會亮,特別也把它做了反相。這三條需要反向處理的信號,其實全用74LV14六輸入反相信號器中三個通道就搞定了;剩下三組端子則是乖乖地連地。此外,PCB板上自然還裝有限流電阻和LED。不過坦白說啊,把LED直接焊在板子上裝好之後,其實插進主機裡根本不太容易看到,所以最後我索性用導線把LED引出到前面板 - 一切都只是為了看起來更爽、更直觀。

強化印表機埠LED指示燈訊號,增進使用體驗

最近,兩張電路板在實際應用裡的穩定表現,真的算是滿讓人放心啦。不過,我現在也正默默地把65C22 VIA嘗試應用到更多比較特別的小功能,只是嘛,有些細節暫時還不能直接跟大家分享,之後如果有新進展,一定會來聊一聊。

只要你對這個計畫感興趣,各種相關經歷和故事都已經收錄在Zolatron的專題頁面,其實內容蠻多,可以慢慢挖掘。有想看原始程式碼或文件的人,也能去GitHub翻找Zolatron資料庫,除了程式以外,連資料表和說明檔案都很齊全。

至於Steve Mansfield-Devine(ee/zolachrome),他本身是一位自由接案的寫作者,同時也是科技記者以及攝影師。他的作品集直接放在Zolachrome上,看了會覺得畫面很有感。另外,不只可以線上買到他的書或者電子書,也能透過Bluesky和Mastodon兩個平台追蹤他的近況。嗯,如果你想支持他一下,也歡迎去com/zolachrome那邊請他喝杯咖啡,他看到肯定會心花怒放。

你的想法由我們實現

Related to this topic:

Comments

撥打專線 LINE免費通話