RETROF-16Kの概要


回路図や作成ノウハウも徐々にHTML化して公開予定ですが、サイトの完成いつになるかは全くわかりません。とりあえず、ハードは完成したので、概要のみをアップしておきます。誤字脱字などの校正も行っていない点も、御了承願います。

技術的な御質問等がありましたら、twitterで御遠慮なくどうぞ。idは「duo6750」です。極力返信する様にはしておりますが、返信をお約束するわけではありません。(2014年12月 GATARO)

RETROF-16Kとは

RETROFは「懐古(retrospect)と未来(future)」を組み合わせた筆者の造語です。一番近い邦訳は「温故知新」でしょうか。
1960年代から70年代にかけて数多く作られたTTLコンピュータと同様のコンピュータを1から設計し直して、21世紀に再現する筆者個人の趣味のプロジェクトです。RETROF-16Kの16は「16bitマシン」であることを、「K」は筆者の10番目(ABCDEFGHJK、Iは欠番)の作品であることを意味します。

外観と特徴

これがRETROF-16Kの全体です。

最大の特徴はMPUもFPGAも用いずに、液晶モニタに対するグラフィックス表示回路を含め、74LSシリーズの標準ロジックのみで(※1)、150mm×200mmの手作り片面基板上に実装(※2)している点にあります。

製作期間は構想からハードの完成までが4ヶ月です。
(平日の作業時間は1~3時間、休日の作業時間は時間の許す限り)

※1 記憶素子や発振器等、一部はTTL以外の集積回路を使用しています。

※2 画像左の名刺大の基板は電源の供給(電圧計付)と、メイン基板が生成する画像信号をVGA端子へ変換するための補助治具です。


裏面の画像です。銅箔面保護の為に透明のアクリル板をネジ留めしています。
片面基板にも拘らず、裏面のジャンパ線は回路修正の為に張った数本のみです。
RETROF-16Kは片面基板でも、自動配置配線ツールに頼らず、人の頭で配置や配線を徹底的に考えれば、これだけのアートワークが可能であることを実証する目的もありました。

使用した基板はサンハヤトの露光基板(NZ-G34K)です。レイアウト、露光、エッチング、穴あけも全て自分で行いました。
レイアウトツールはKicad(無償の基板CAD)を使用しました。


アーキテクチャ概要と実行速度

アドレスバス、データバス、演算装置の全てが16bitで統一されている16bitコンピュータです。64Kワードのメモリ空間は全てにRAMが実装されています。主メモリの他に256×256画素(1画素8色)のビデオメモリ(VRAM)を有してます。このビデオメモリの内容は市販の液晶モニタに接続し表示が可能です。

レジスタ構成は、アキュムレータが1個、データ格納とアドレス指定の両方に使える汎用レジスタが256個です。スタック機能は有しておりませんが、プログラムで現在のアドレスを保存することは可能なので多重サブルーチンコールは可能です。

入出力ポートは、入力ポートが16bitが1組で、出力ポートが16bitが2組です。入力ポートは16個のトグルスイッチに、出力ポートは32個のLEDに直結されています。キーボード等の入力デバイスはトグルスイッチとのワイヤードOR接続となります。(14年12月時点でキーボードは未実装です)

命令は1ワード(16bit)形式と2ワード(16bit×2t)形式がありますが、命令の種別や命令長に拘らず、全ての命令は11クロックで処理されます。(ここでいうクロックとはCPUを構成する回路に与える最小時間単位であり、具体的には6.75MHzを示します)
1つの命令の実行周期は6.75MHz÷11=614KHzであり、これは1秒間に約60万命令を処理できる性能です。

プログラミング方法

基板下部にある16個のトグルスイッチと6個のマイクロスイッチで行います。
まずトグルスイッチで16bitの「値」を設定し、マイクロスイッチでその「値」をアドレスとして設定したり、そのアドレスにデータとして書き込むことが可能です。現在のアドレスとそのアドレスの内容は基板上部にあるLEDに表示されます。

しかし、現実的には何万ステップもの機械語コードをトグルスイッチから書き込むのは非現実的です。大規模なプログラムを組む際は、ウィンドウズパソコン上でプログラムを作成し、USB経由で基板上の主メモリに機械語をDMA転送(CPUを介さない転送)することが可能です。これに必要なインタフェイスも基板上に標準ロジックで実装しています。(但しUSBの受信部はFT245RLを使用)

機械語命令一覧

2014年12月現在、ニモニックは未定(検討中)です。

ロード系命令(演算処理命令を含む)

ロード系の命令は全てアキュムレータへのロードとなる。

・8bitリテラル値(1ワード命令、命令の後半8bit)のロード。上位8bitはゼロで埋められる
・16bitリレラル値(2ワード命令、2ワード目16bit)のロード
・指定レジスタ(R0~R255)の値をロード
・指定レジスタ(R0~R255)でアドレスを指定する主メモリの値をロード
・16bitリレラル値(2ワード命令、2ワード目16bit)で座標を指定する画像メモリ(VRAM)の値をロード
・指定レジスタ(R0~R255)が座標を指定した画像メモリ(VRAM)の値ロード
・現在のプログラムカウンタの値をロード(サブルーチンコール時の戻り番地保存用)
・入力ポートの値をロード(入力ポートは16bit。16個のトグルSWに直結。キーボード入力はトグルSWとのワイヤードORとなる)

上記のロード系命令は全てロード時に以下の単項演算、もしくはアキュムレータとの二項演算を同時に行うことが可能。

・単項演算はインクリメント(1加えた値をロード)、デクリメント(1引いた値をロード)の2種
・二項演算は、加算・減算・AND・OR・XORの5種

ストア系命令(ポート出力命令含む)

ストア系の命令は全てアキュムレータからのストアとなります。但しLEDへのストア命令は指定された主メモリの値も同時に出力されます。

・16bit(2ワード命令、2ワード目16bit)で与えられるアドレスへのストア
・指定レジスタ(R0~R255)へストア
・指定レジスタ(R0~R255)がアドレスを指定する主メモリへストア
・指定レジスタ(R0~R255)がアドレスを指定する主メモリの内容をアドレスとする主メモリへストア(レジスタ多重間接)
・16bit値(2ワード命令、2ワード目16bit)で座標を指定した画像メモリ(VRAM)へストア
・指定レジスタ(R0~R255)が座標を指定する画像メモリ(VRAM)へのストア
・アキュムレータと、8bitリテラル値(後半8bit)を32個のLEDに表示する
・アキュムレータと、6bitリレラル値(2ワード命令、2ワード目16bit)を32個のLEDに表示する
・アキュムレータと、指定レジスタ(R0~R255)の値をロードを32個のLEDに表示する
・アキュムレータと、指定レジスタ(R0~R255)でアドレスを指定する主メモリの値をを32個のLEDに表示する

上記の全ての命令は、次項に述べる分岐命令と同じ実行条件を指定可能。

分岐命令

分岐命令は下記4種

・ショートジャンプ(プログラムカウンタの下位8bitを書き換える)
・ロングジャンプ(プログラムカウンタ全体を書き換える)
・レジスタジャンプ(プログラムカウンタの値を、指定レジスタの値で書き換える)
・レジスタ間接ジャンプ(プログラムカウンタの値を、指定レジスタがアドレスを指定する主メモリの内容で書き換える)

上記のそれぞれに対し、下記のいずれかの条件を指定できる。

・無条件
・加減算でキャリー(ボロー)が生じた
・加減算でキャリー(ボロー)が生じていない
・二項演算で二項が同じ値
・二項演算で二項が異なる値
・演算結果がゼロか正
・演算結果が負
・画像表示が帰線消去期間(画像表示時のチラツキをソフトウェアで軽減する際に使用する特殊条件、詳細説明は別途)

その他の命令

・アキュムレータの左シフト命令(右シフト命令はない。右シフトはアキュムレータとアキュムレータ自身の加算で代用可能)
・アキュムレータの右ローテート命令(左ローテート命令はない。31回繰り返すと、左ローテート命令1回と同値となる)
・停止(HALT)命令
・無効(NOP)命令
・倍長無効(NOP)命令(自分自身と次の1ワードの計2ワードが無効となる)

使用部品

使用した全ての半導体(ダイオード、発光ダイオード、電源関係を除く)をコンピュータを構成する要素毎に並べたものです。
これだけで、大体の回路構成がお解り頂ける方がいたら嬉しいです。(詳細回路図は別途公開予定)

構成要素 使用半導体(個数)  補足説明
アキュムレーター  74LS194 (4)  4bitのシフトレジスタを4つ並べ、16bitのアキュムレータを構成 
ALU(演算器)  74LS181 (4)  加算・減算・インクリメント・デクリメント・AND・OR・XOR の7種類の演算を行う
フラグレジスタ  74LS379 (1)  4bitのD-FF。このうち3bitを使用。「ゼロ」「キャリー」「サイン」を保持する 
プログラムカウンタ  74LS569 (4)  4bitカウンタ4つで、16bitのアップダウンカウンタを構成。ダウンカウント機能は使用せず 
アドレスレジスタ  74LS569 (4)  カウント機能は手動でプログラミングをする時に用いる。実行時は単なるレジスタ扱い 
出力ポートレジスタ  74LS563 (4)  32個のLEDに直結。このLEDはプログラミング時はアドレスとデータの表示器となる 
入力ポートバッファ  74LS257 (4)  2組の入力があるが入力Aをトグルスイッチに直結して使用。入力Bはアキュムレータの3S出力化に使用 
汎用レジスタ  下記主メモリ内  256本の汎用レジスタ。但し実体は主メモリの一部を使う「仮想レジスタ」である 
主メモリ  HM62256PL10 (4)  32KBのSRAMを4つ使用し、64Kワード(128Kバイト)のメモリ空間を構築 
命令レジスタ  74LS377 (1)  8bitのD-FF。現在実行中の機械語命令のオペコードを保持する  
フラグレジスタ  74LS379 (1)  4bitのD-FF。この内3bitを使用して、演算命令実行後の「ゼロ」「キャリー」「サイン」を保持する 
フラグセレクタ  74LS151 (1)   条件分岐命令等において、どのフラグを参照するかを、命令語のビット並びを元に選択するセレクタ 
ステージカウンタ  74LS161 (1)  1つの命令は全て6つのステージで処理される。現在どのステージを実行中かを保持するカウンタ 
ステージデコーダ  74LS138 (1)  上記ステージカウンタの出力をバイナリから個々のステージ毎の信号に変換するデコーダ
命令デコーダ  右を参照 (3) 74LS155 (2)、74LS138(1)。機械語命令を各種レジスタ等のゲートで制御信号に変換するデコーダ 
演算コード変換  74LS138 (1)  機械語の演算種別指定ビットの並びをALUに対する演算指定コードに変換するために使用
チャタリング防止等  74LS279 (1)  4回路のRS-FF。各種制御スイッチのチャタリング防止に2回路、他は実行/停止の状態保持用に使用 
単純ロジックゲート  右を参照 (4) 74LS00(NAND)、74LS02(NOR)、74LS32(OR)、74LS04(NOT)を各々1個ずつ使用 
基準信号発振器  SG-8002DC (1)  27.000MHzのPLL発振器。液晶モニタ表示回路への基準信号とCPUクロックを兼ねる 
ビデオRAM  SRM2B256SLMX55 (1)  主メモリに用いた62256と同等品。62256PL10ではアクセス速度が追いつかないのでこれを使用した
画像水平方向分周  74LS161 (3)  液晶モニタの水平方向のタイミング制御。 
画像垂直方向分周  74LS393 (2)  液晶モニタの垂直方向のタイミング制御。非同期カウンタであるが垂直は速度が遅いので十分追従する 
画像同期信号生成  74LS139 (1)  液晶モニタに対する同期信号を生成する 
VRAMアドレスバス制御  74LS541 (4)  3Sバッファ。VRAMのアドレス線の制御権をCPUに渡す際のバス切替器の役目を担う 
VRAMデータバス制御  74LS245 (1)  8bit双方向3Sバッファ。VRAMのデータをCPUがアクセスする際のバファ 
USB⇔パラレル変換  FT245RL  USB経由でプログラムの保存と復元をする際に使用。コンピュータとしての性能とは無関係
    総 計   59個  ダイオード・発光ダイオード・電源(スイッチングレギュレータ)内部の半導体を除く 

一部のTTLは入手困難の為、LSではなくALSやFを使用しております。