メモリの周辺回路には3ステートを使用
全ての命令を16bitと決め、使用するメモリもアドレスバス15bit(内12bit分のみ使用)、データバス8bitと決めましたので、メモリ周りの回路は必然的に下記の概略図の様になります。
このような漠然とした回路図(ブロック図)でも、実際にそれを描ける段階になってくると、設計作業も加速しますし、完成後の動作イメージもおぼろげながら見えてきます。
例えば本機は命令が16bitであるのに対しデータバスは8bitですので、命令はメモリから2回に分けて命令レジスタ(IR : インストラクションレジスタ)に格納する必要があります。具体的な手順は下記の様になることがイメージできます。
(1)プログラムカウンタをクリアする(メモリのアドレスに与えられる値は0となる)
(2)メモリの内容を命令レジスタ上位8bitに格納する
(3)プログラムカウンタを1つインクリメントする
(4)メモリの内容を命令レジスタ下位8bitに格納する
(5)プログラムカウンタを1つインクリメントする
(6)命令レジスタ(上位+下位の計16bit)の値に対応する命令を実行する
(7)2から繰り返す
6番目の「命令を実行する」に必要な回路の詳細は未定ですが、命令実行時にはプログラムカウンタ以外にデータをロードしたりストアする番地を指定するレジスタ(図ではアドレス指定レジスタと記載)が必要です。
この点を考慮すると、より正確なブロック図は左記の形になります。
さて、ここで問題となるのは、アドレスバスの占有権を切り替える方法です。この図ではスイッチで表現していますが、ここにも何らかのロジックが必要です。40年前なら間違いなくSN74157等のセレクタを使用したのでしょうが、その後3S(3ステート)出力の74シリーズが次々と発表されました。3S出力のTTLを使用すると、バス切替用のTTLが不要になりますから、配線が格段にすっきりします。
しかし、74シリーズの全てが3S化されたのではありませんし、3S化された74シリーズでも入手が殆ど不可能になっているものあります。3S出力の74シリーズを使用すると決める前に、入手可能か否かを十分に吟味する必要があります。
プログラムカウンタに使用するTTLを決める
まず、74シリーズの同期バイナリカウンタで、ロード機能(注1)を持ち、かつ出力が3Sステートのものをリストアップしました。
(注1)プログラムカウンタに対するロード機能は、分岐命令を実装する際に不可欠な機能となります)。
型名 | ビット数 | アップダウン | ロード | クリア | その他の特徴 |
---|---|---|---|---|---|
74LS561 | 4 | Uのみ | 同期・非同期 | 同期・非同期 | |
74LS569 | 4 | U/D | 同期のみ | 同期・非同期 | |
74LS691 | 4 | Uのみ | 同期のみ | 非同期 | ラップタイム保持用出力レジスタ付 |
74LS693 | 4 | Uのみ | 同期のみ | 同期 | ラップタイム保持用出力レジスタ付 |
74LS697 | 4 | U/D | 同期のみ | 無し | ラップタイム保持用出力レジスタ付 |
74LS699 | 4 | U/D | 同期のみ | 無し | ラップタイム保持用出力レジスタ付 |
プログラムカウンタはダウンカウントを行うことはありませんし、クリア機能も合った方が便利ですが、ロード機能でも代用できます。従って上記の6種類のどれでも構わないのですが、何れも500番台、600番台のため、入手可能かどうかが心配です。そこで、主な通販店の在庫を先に調べました。
型名 | 秋葉M店 | 秋葉S店 | 秋葉W店 | 東京Z店 | 横浜T店 | 川崎S店 |
---|---|---|---|---|---|---|
74LS561 | 在庫無し | 在庫無し | 在庫無し | 在庫無し | 在庫無し | 在庫無し |
74LS569 | 在庫無し | 在庫無し | 在庫無し | 在庫無し | 在庫無し | 有 |
74LS691 | 在庫無し | 在庫無し | 有 | 在庫無し | 在庫無し | 在庫無し |
74LS693 | 在庫無し | 在庫無し | 有 | 在庫無し | 在庫無し | 在庫無し |
74LS697 | 在庫無し | 在庫無し | 有 | 在庫無し | 在庫無し | 在庫無し |
74LS699 | 在庫無し | 在庫無し | 有 | 在庫無し | 在庫無し | 在庫無し |
左記以外にも、Webで丹念に調べると、意外な「穴場」が見つかる可能性は十分あります。
また、価格はかなり割高になりますが、製造中止品、販売中止品を専門に扱う業者もあります。
上記は2011年2月現在です。辛うじて569が入手できました。プログラムカウンタは12bitですので、必要個数は3個ですが、念のため8個購入。また実際には使用しませんが折角なので699も4個購入しておきました。
【どうしても入手不可能な場合】 3Sではない同期カウンタ(74LS161や74LS163)に別途3Sバッファを購入して付加する方法で回避できます。
2013年追記: このRETROF-8の1年後に製作を開始したRETROF-16では、3Sの同期カウンタが入手困難になった為、74LS161と74LS257を組み合わせました。、
命令レジスタとアドレス指定レジスタを兼任させる
左図はメモリ周辺回路の再掲です。
図にはまだ記入していませんが、プログラムカウンタは出力のだけではなく入力線も必要です。この入力はプログラムカウンタの値を変える、すなわち分岐命令を実現する際に必要となります。
さて、このプログラムカウンタへの入力値は、どこの値を接続すれば良いのでしょうか?
「アドレス指定レジスタ」や「命令レジスタ」の出力か、それとも新たなレジスタを用意するか?
いろいろ迷いましたが、最も部品数が少なくなる方法を優先して考慮した結果、「アドレス指定レジスタ」と「命令レジスタ」を一つにし、その出力を「プログラムカウンタ」の入力値にするという結論に達しました。これを図式かしたのが下記の「メモリ周辺回路C」です。
単純な回路ですが、この回路を適切に制御すると下記の3機能を実現することができます。
(1)プログラムカウンタで指定された番地にあるメモリを8bitずつ2回に分けて命令レジスタに格納
(2)命令オペランド(命令の下位12bit)の値をプログラムカウンタに格納(分岐命令の実行)
(3)命令オペランドの値を、メモリのアドレス指定(ロード、ストア時)に使用
命令レジスタに使用するTTLを決める
命令レジスタに用いるTTLは3ステートの正論理D-FFになります。但し常にロードされるわけではありませんからクロックイネーブル付きが望ましいところです。例によってこの条件に合う74シリーズを洗い出し、パーツショップの在庫状況を調べることから作業を開始します。
型名 | ビット数 | clock enable | clock | クリア | その他の特徴 |
---|---|---|---|---|---|
74LS173 | 4 | L・L | ↑ | H(非同期) | |
74LS377 | 8 | L | ↑ | 無し | 3Sではない。別途3Sバッファが必要 |
74LS823 | 9 | L | ↑ | L(非同期) | |
74LS825 | 8 | L | ↑ | L(非同期 | 3Sコントロールが3入力 |
(74LS377の6bit版である74LS378は明らかに不利ですので74LS377が入手可能と判った時点で候補から除外)
SN74LS173は、生産数量が多かったのでしょうかどこの店でも入手は容易でした。SN74LS377も在庫が無い店が目立つものの何とか入手可能な様です。800番台は殆ど入手不可能でした。
ですから、74LS173を4つ使うか、74LS377に別途3Sバッファ(74LS244等)をペアにしたものを2組使うかの二者択一となります。どちらも必要なTTLは4個で差はないのですが、部品数ではなく必配線数で考えると74LS173が有利です。在庫も豊富なようなので今回は74LS173を選びました。
またこの時点でカウンタは4bitのLS569と決まっておりましたので、同じ4bitで入出力ピン対向のD-FFをカウンタと縦に並べて配置することにより配線パターンが単純になるとも考えました。
結局74LS173を20個ほど購入、また使用予定はありませんがLS377も4つほど購入しました。