2014年4月24日増補
CPLDP-8
CPLDP-8
ハードウェア 設計編
omiokone
MAXII240のLE(Logic Element)は4入力のLUT(Look Up Table)とフリップフロップ1つずつのFPGAのセルと比べ簡素なもので、7400シリーズIC換算数十個でしかない。PDP-8/Iの場合CPUだけでIC100個近くあり、周辺回路まで収めるにはかなりの工夫が必要となる。
タイミングジェネレータ
PDP-8同様シフトレジスタの一つのビットだけ1を立て、それを循環させてタイミング信号を発生する。CPLDP-8では各命令ごとに別系統のシフトレジスタを持つ。この方式ではフリップフロップの数は増加するが、組み合わせ論理を減らせてLEで余ったLUTは他で使えるのでLUTが不足しがちなMAXIIでは有利となる。
レジスタと演算
IR:Instruction Register
MBR:Memory Buffer Register
AC:Accumulator
MAR:Memory Address Register
PC:Program Counter
data busとAC出力は4種類の論理演算(data bus/AC/ACの反転/data busとACのAND)をしてACとMBRに供給される。MBRで間接アドレスのインクリメント用に加算器が必要なため、ACの加算もこちらで行う。例えばTAD(加算)命令は
MBRをクリアする。
MBRにACの値を加算して転送する。
data busのメモリ出力をMBRに加算する。
MBRの値をdata bus経由でACに移す。
面倒な動作をする理由は、MAXIIでマルチプレクサは1つのLUTで2:1の物1個しか作れず高くつくので、なるべく使わないためである。シフト演算は、右シフトはACをシフトレジスタとして使い、左シフトはACの値をMBRで加算して行う。
ROM
ブートローダをMAXIIのUFM(User Flash Memory)に格納している。UFMはアドレス/データ1本ずつのため直並列変換が必要。QuartusIIのmegafunctionでこの回路を生成するとLEを20個以上消費するため、MARをシフトレジスタとして使い自前で作成した。読み出した命令は外部データバスを経由することで、マルチプレクサを節約する。
ROMからRAMへの切換えはCPLDP-8では無用なOSR(スイッチレジスタ読み取り)命令を使い、次の命令(通常JMP)のフェッチ後RAMモードになる。
シリアルポート
PDP-8では110ボーの機械式テレタイプが標準の入出力装置だが、今回はシリアルポート接続したPCを端末として使う。そのため19200ボーのシリアル入出力をMAXIIに内蔵した。フロー制御でスタートビット検出時点からRTSをLに下げるよう改良して、PCによっては次の文字を送ってしまう問題に対応した。
ボーレイト発生分周器には変形LFSR(Linear Feedback Shift Register)を使った。その名の通りほとんどシフトレジスタなので、バイナリカウンタに比べLUTを4コ節約できる。
メモリ拡張制御とRAMディスク
PDP-8はオプションの3bit fieldアドレスによりバンク切換方式でメモリ空間を4K×8=32Kワードまで拡張できる。CPLDP-8ではさらに256Kワードに増強したいがMAXIIの余裕がない。そこでRAMディスクでは、割り込み中にfield値を退避する3bitレジスタを拡張field指定に使う。CPLDP-8ではシリアルポートしか割り込み要因がないので、ディスクアクセス時に割り込みを禁止する回路をつければ問題ない。
最終的にMAXII240のLE240個中237個を使用。コンパイルするとLE309個が生成されるうち、レジスタだけとLUTだけのLEを抱き合わせるためQuartusIIのfitterが何度も再試行してやっと収まり限界に近い。MAXIIではLE10個のブロック(LAB)の制約でLEがあっても配線リソースが先に枯渇する場合があり、12bitのCPUを作るには最適とは言えない。
lpm_counterなどのライブラリを使うと回路を圧縮できるが、RTLで書いた方が小さな回路を生成する場合もある。また少しの記述の違いで回路規模が変わることもあり、これらは実際に試すほかない。出来上がったHDLソースはパズルのような読みづらいものとなり、少々やりすぎの感がある。教育目的でPDP-8を作る場合MAXII570なら素直なRTL記述で楽に全機能が入るだろう。
以下の機能はCPLDP-8で実装していない。
コンソール機能(continue以外の実行制御、スイッチレジスタ)
乗除算命令オプション(含MQレジスタ)
PDP-8/E以降の追加命令(SKON, SRQ, GIF, RTF, SGT, CAF, BSW, KCF, KIE, TFL, TSK)