部品実装その1 画像信号生成回路

完成した基板

銅箔面 部品面
拡大図

穴あけ、及び銅箔部分の防錆用のフラックスの塗布と乾燥を終えた基板です。
ガラスエポキシの片面基板であり、上段左の画像が銅箔面、上段右が部品面、下段左が銅箔面の一部拡大(100円硬貨は大きさ比較用)です。

本基板はフリーの基板作成ツールであるKiCadとサンハヤトの感光基板を用いた「完全手作り基板」です。(サイズは200mm×150mm、ほぼA5サイズに相当)
ここから設計検証と部品実装と動作確認を同時に進めるという手法で作品を完成させて行きます。

ゴム足とDCジャックの実装

DCジャック LED

ゴム足をねじ止めし、DCアダプターのジャックをハンダ付けした所です。
実装と動作試験を平行して行うので、ゴム足は真っ先に取り付けないと、配線面が作業机と直接触れ、切断したリード線等の金属片がパターンに食い込む危険があります。

LED、画像出力端子、水晶発振器の実装

27MHz 27MHz測定

LEDは「電源投入」「HALT命令受付」「USB経由でのデータ転送中」の3つです。上記の画像は撮影のため強制的に3つとも点灯させています。
画像出力用のコネクタは「R信号」「G信号」「B信号」「垂直同期信号」「水平同期信号」「GND」の6端子です。

発振確認

電源を投入して27MHzの発振を確認している所です。
発振器はエプソン社製のプログラマブル発振器SG-8002DCシリーズを用いました。
27.000MHzに設定済のものが秋月電子通商で入手可能です(2017年7月現在)。

尚、27MHzはCPUを構成する回路へのクロックではなく、外部モニタ(SXGAの市販液晶ディスプレイ)への画像信号を生成する回路のクロックとなります。

部品面ジャンパー線


「手作り片面基板」の部品面を這うジャンパー線です。このジャンパー線により多層基板と同様の実装密度が可能になってます。一見、乱雑に這っており美しくはありませんが、これらのジャンパー線は極力、後で実装する部品(標準ロジックIC等)の下に隠れて見えなくなる様に配線経路を工夫しています。

ICソケット


原則全てのICにICソケットを使用します。何か大きな設計ミスなどがあり製作を断念した際にICの回収を容易にする目的もあります。しかしそれ以上に「まずICソケットのみを実装し、各ピンの電圧や波形が正しいことを確認してからICを挿す」という手法を使うメリットのほうが大きいです。
尚、ICソケットは全て「平ピン」ではなく「丸ピン」を使用します。これは信頼性云々ではなく、丸ピンタイプでないとソケットと基板の間に隙間ができずジャンパー線を通せないからです。また、丸ピンの方が基板に開ける穴が小さくて済む(ランドの銅箔面積を大きくとれる)という利点もあります。

基本クロックの分周確認


74HC4520を1つ実装し、27MHzを16分周した信号を確認している所です。
実際にはこの信号(回路図上のU31の6番ピンから出る信号)は使用しませんが、オシロのプローブをあてると1.6875MHz(=27/16MHz)が確認できます。

340分周(その1)

ここから先は回路図を印刷して、見比べながらご覧になる事をお勧めします。
現在の最新バージョンを(REV 2.03A)です。(2017-08-01現在)


74HC4520を1つと74HC163を2個使って、27MHzを340分周します。
340分周は1024(バイナリで 100_0000_0000)になったタイミングで685(バイナリで 10_1010_1101)を同期ロードすることで実現しています(1024-685+1=340)。

この分周で得られる79.412KHzが液晶モニタに与える水平同期信号の周期となります。尚、SXGA(75Hzリフレッシュ)の水平同期信号の正式な規格は79.976KHzですが、この程度の差異であれば液晶モニタ側で追従してくれます。

340分周(その2)


上記の波形です。Duty比は256対84です。この256の期間が実際に液晶モニタに画像が現れる表示期間となり、残りの84の期間が「バックポーチ」「水平同期信号」「フロントポーチ」の3つを合わせた非表示期間になります。

尚、水平方向の分周は74HC4520と74HC163に共通のクロックを与える「完全同期式」で行なう必要があります。非同期で行うとVRAMのアドレスと液晶モニター上の画素の対応が一致しない瞬間が生じ、画像が鮮明に映りません。
4520と163を同期させるために、両者のクロックを共通とし、4520のQB出力を163のEP入力に接続するという若干トリッキーな回路設計となっています。

水平同期信号の生成


基板上に74HC139(回路図のU35)を実装、この74HC139の半分を使って水平方向の非表示期間を更に細かくデコードし、水平同期信号を作ります。
水平方向の非表示期間(黄色の波形のLの区間)のカウンタの値は
10_1XXX_XXXXで表されます(Xは任意)。このうち
10_110X_XXXXの期間のみを74HC139で抽出します(青色の波形)。

カウント値の詳細な変化は1枚目の回路図の右側にコメントとして記載しています。
オシロの波形が乱れているのは直接プローブを当てずに、ICクリップと蓑虫クリップで信号を引き出しているためです。

1056分周


74HC4520を更に1つ実装(U34)し、水平分周で使った74HC4520(U31)の残りのユニット(Bユニット)と合わせて、水平同期信号を1056分周し、75.27Hzを作ります。
(27.000MHz÷340÷1056=75.2Hz)。
SXGA(75Hzリフレッシュ)の垂直同期信号の正式な規格は75.000Hzですが、水平同期信号同様、この程度の差異であれば液晶モニタ側で追従してくれます。

1056分周はカウンタ値が1056(2進で0100_0010_0000)になった瞬間にゼロクリアすることにより実現します。
0100_0010_0000の検出はANDゲートを用いて下から6ビット目と11ビット目が共にHになった瞬間を捉えます。
このANDゲートは標準ロジックを用いず、ダイオード2本とプルアップ抵抗で代用します。これらのダイオードと抵抗(DD5,DD6,R59)は実装面積を節約するためU34のICソケットの中に実装しています。ダイオードVfの低いBAT43を、プルアップ抵抗の値は10kΩを選択しました。

垂直同期信号の作成


水平同期信号の生成に使った74HC139(U35)の残りのユニット(Aユニット)を用いて、水平同期信号と同様の方法で垂直同期信号の作成します。
黄色の波形はカウンタ値が1024〜1056、すなわち2進表記で
1XX_XXXX_XXXX(Xは任意)の時にHとなります。この期間が垂直方向の非表示期間となります。(カウント方式の違いにより、水平方向の非表示区間とH/Lが逆になります)
74HC139を用いてこの非表示区間中の、
1X_XXX0_1XXの期間のみを74HC139で抽出し、これを垂直同期信号とします(青色の波形)。

尚、垂直方向の分周は非同期式で十分です。非同期式はカウンタの繰上がりが発生する瞬間にハザードが生じ画像メモリのアドレスと表示位置の関係が乱れますが、それは水平方向の非表示期間のみに発生するため見た目には全く問題はありません。

液晶モニターとの接続


水平、垂直の両同期信号ができたので、これを液晶モニタに与えてみます。基板上にはVGAコネクタは無く単なる6pの端子があるだけですので、これをVGA端子に変換するケーブルを別途作成しました。この変換ケーブルは単に6本の線をハンダ付けしただけです。

6本の電線の色と役割 []内の数字はVGA端子の対応するピン番号

黒:GND[5-6-7-8-10]
青:青色信号[3]
緑:緑色信号[2]
赤:赤色信号[1]
灰:水平同期信号[13](HorizontalとHAIIROを掛けた)
紫:垂直同期信号[14](VerticalとVioletを掛けた)

液晶モニターに同期信号を与える


水平、垂直の同期信号ができたので、これを液晶モニタに与えてみます。液晶モニタは普通のパソコン用のモニタです。
同期信号のみで画像信号(RGB信号)は与えていないので、画面は真っ黒のままですが、モニタ側の操作で接続信号情報を接続させると画像の様な情報が表示されます。
(同期信号を与えていない、あるいは周波数等が規定外だとこの情報は表示されません)

VRAMとその周辺ICのソケットと半固定抵抗の実装



画像表示関係の残りのIC(ソケットのみ)と、色相調整用の半固定抵抗を順次実装します。

(上段左)画素アドレスをVRAMに与えるバッファ(U29,U30)のソケット実装
(上段右)VRAMのソケット実装
(下段左)VRAMの出力をRGB信号として渡すためのバッファ(U25)のソケット実装
(下段右)色相調整用の半固定抵抗(1KΩ)の実装。RGBの各色2bitで計6bit分 

ブレッドボード用のジャンパー線で画像信号を直結


水平方向の表示期間は回路図上の信号線H0〜H7で256区画に分割されます。
同じく垂直方向の表示期間は回路図上の信号線V0〜V7で256区画に分割されます。
従って、このH0〜H7あるいはV0〜V7の任意の信号線を直接(正確には基板上の半固定抵抗を介して)液晶モニタに与えれば、「絵」の表示が可能になります。

画像はV0信号をR(赤)出力に直結、H0信号をB(青)出力に直結、H1信号をG(緑)出力に直結し、VRAM未実装の状態で強制的に「絵」を表示してみたところです。
尚、各信号の直結はブレッドボード用のジャンパー線が丸ピンソケットにピッタリ嵌ります。

注意:この表示方法はCMOSロジックの出力を直接モニターにつなぐという「野蛮な」方法で実現しています。誤接続による過電圧、過電流により、CMOSロジックや液晶モニタ自体を破壊してしまう可能性があります。実験は十分に理論を把握した上で自己責任でお願いします。

VRAMバスバッファの実装(1)

画像アドレスをVRAM渡すバッファ(U30とU31、共に74LS541)と、VRAMの出力を画像出力端子に渡すバッファ(U25、同じく74LS541)、およびそれらの制御に必要なNOTゲート(U36、74LS94)を実装した所です。
上部に見える舌状の銅板はオシロのGND端子を接続するための仮設端子です。

U30とU31は、後で実装するU27とU28と組となりVRAMのアドレスバスに対するバス切替器を構成します。すなわちVRAMのアドレスは通常はU30とU31経由で画素のアドレスが渡されますが、CPUがVRAMのアクセスを行う命令を実行する瞬間だけU27とU28を経由してCPUが指定するアドレス(機械語命令で指定されるアドレス)が渡されます。

VRAMバスバッファの実装(2)と非表示期間のRGB信号レベルについて

U25もVRAMの出力を直接RGB信号とするのを避けるためのバッファですが、U25は非表示期間のRGB信号の電圧をゼロにする(真っ黒にする)という役割も持ちます。
U25の2つあるコントロールゲートの1つ(19番ピン)には水平方向の非表示期間にLとなる信号を反転させたものを、もう1つ(1番ピン)には垂直方向の非表示期間にHとなる信号を渡し、水平・垂直のいずれかが非表示期間の時は強制的にRGB出力の全て0Vにします。

上記の画像はRGB信号(緑の横方向4階調)を表示時の各波形の観測結果です。
非表示期間は信号レベルが0Vになります。垂直方向も同様です。

VRAMの実装

VRAM(HM628128BLP-8)を実装した所です。この時点では、VRAMに接続される信号線のうちWR信号がどこにも接続されていないので、強制的にHになる様に仮配線しています。
電源投入時のVRAMの内容は「ランダム」ですので、その値に応じた「模様」が表示されます。

VRAMのCPU側バッファの実装

VRAM側のバスとCPUの側バスを接続するためのブリッジとなるバッファです。これらのバッファ(U26、U27、U28)を介してCPUはVRAMの内容を書き換えます。但しこれらのバッファの制御信号はまだ基板上には存在していませんので、ICを挿入すると誤動作をしますので、この時点ではソケットのみの実装です。

なお、丸ピンソケットの穴は、ハンダくずや部品のリードの切りくずが挟まると取れなくなる事があるので、透明のプラ板を両面テープで仮固定し保護しています。
ここまでで、画像表示回路の実装は終了です。

部品実装その2へ進む

(参考)使用した電源とバイパスコンデンサについて

電源は普通のACアダプタ(5V2A)を分解し、内部のユニットのみを一回り大きいプラケースに入れ、電圧計と電流計を取り付けたものを使用しています。電圧計と電流計は接続ミスや半田ブリッジなどがあると異常値を示す事が多いので状態監視に役立ちます。

バイパスコンデンサは0.1μF(50V)を標準ロジック1つに1個の割合で入れています。
前作(RETROF-16M)以前はリード付きを使用していましたが、今回からは実装面積を削減する目的で2012サイズのSMD(表面実装品)にしました。
針の先ほどの極微量の瞬間強力接着剤で仮固定した後、ハンダで固定します。

部品実装その2へ進む (2017年7月22日初稿、最終修正8月1日)