お断り
本稿はまだ完全に校正が終わっていません。誤字・脱字・タイポ・スペルミス等が多数あります。
TTLコンピュータの製造に必要なTTL
TTLコンピュータを作るのに必要なTTLの予備調査
当り前のことですが、TTLコンピュータを作るのにはTTLが必要です。
しかし、TTLの多くは製造中止品であり、入手が困難な型番が多数あります。
回路設計や基板設計が完了したのに部品が手に入らないのでは笑い話にもなりません。
TTLコンピュータはデータシート上に存在するTTLではなく、実際に入手可能なTTLで設計しなければならないのです。
画像は筆者手作り10機目となるTTLコンピュータ
(基板は20cm×15cmの片面感光基板を使用)
対象とするTTLは74LSファミリーのみとしますが(注)、動作可能速度や入手容易性の観点から74Fファミリーと74ALSファミリーも併用します。
また、主メモリはTTLで構築するのは困難ですので専用LSIを使用します。
【注】ここで述べるTTLは「1970年代のコンピュータを再現する」という趣旨から、当時最もポピュラーであった2.54mmピッチDIP型のバイポーラ型TTLのみを対象としています。
勿論、DIP以外の形状やCMOS型も対象とすると、より柔軟な設計が可能になりますが、それに関しては別の機会としたく思います。
機能毎に使えそうなTTLを考察する
本サイトではコンピュータを構成する回路を下記の11の機能ブロックに分け、それぞれのブロック毎にどの様なTTLを使うべきか(あるいは使えるか)を考察します。
プログラムカウンタ
ALU(算術論理演算ユニット)
ACC(アキュムレータ)
IR(インストラクションレジスタ)とFR(フラグレジスタ)
ワークレジスタ
出力ポート
入力ポート
命令デコーダ
バスセレクタとフラグセレクタ
その他の回路
・ステージカウンタ
・ステージデコーダ
・内部状態保持レジスタ
・チャタリング防止回路
・クロック発振器
LCDディスプレイドライバで用いるTTLに関しては別章(本ページ外)で紹介予定
主メモリ(main memory)
ROMかRAMか
主メモリはROMとRAMに分類できます。CPUをTTLで構築するならば、まずはRAMの内容をCPUを介さずに内容を書き換える手段(DMA=Direct Memory Access)を用意した上で、全てをRAMで構築するのが賢明です。CPUの動作がまだ不安定かもしれない状態で、多くの機械語命令を書き込んだROMのコードを一気に実行させるのは現実的ではないからです。
ここでは主メモリのROM化(OSの搭載等)は別途検討するものとし、全ての主メモリはRAMで構築するものとして先に進みます。
SRAMかDRAMか
RAMは更にSRAMとDRAMに分類できます。現在は市販パソコンの主メモリに用いるRAMと言えば、DRAMを示すのが一般的です。しかしTTLコンピュータの製作ではあえてSRAMを使います。その理由は簡単です。リフレッシュ回路を省略できるからです。
一時期(1980年頃まで)は、大容量のSRAMは高価だったため、リフレッシュ回路を用意してでもDRAMを用いる方法が有望でした。しかし現在はメガビットクラスの主メモリならばSRAMでも容易に構築できますので、DRAMを使う方法は設計構想から除外します。
SRAMに使えるTTL(74シリーズ)は存在するのか
結論から言うと「あるけど使えない」です。例えば74LS170や74LS670は16bitのRAMです。また、Fファミリになりますが、74F189や74F219は64bitのRAMです。しかし何れも容量が小さすぎます。もしこれらのTTLでBASICが走るコンピュータを作ろうとすると最低でも数百個を必要とし、配線の手間や消費電力を考えると現実的ではありません。それに加えて74シリーズのRAMは現在(=2015年)では殆どの品が入手困難です。
メモリは専用のSRAMを使う
結局、TTLコンピュータと言うえども、主メモリは専用のSRAMを使わざるを得ません。幸い、手頃な容量(1Mビット前後)のSRAMは容易に入手できます。
比較的入手が容易な可能なSRAM
スーファミのカセットに使われているSRAM(型番は本文参照)
いきなりの裏技で恐縮ですが、スーパーファミコン(スーファミ)のカセットに入っている「ゲームの途中経過保存用」用のSRAMを使うという方法があります。
中古スーパーファミコンのカセットは50円とか100円で売られている事もあるので、ある意味「お得」です。 但し、基板にハンダ付けされているRAMを綺麗に取り外すのは、慣れていない方にとっては大変な作業です。
スーファミカセットに搭載されているRAMの型番はゲームにより異なります。
容量は64Kbit(8bit×8192=HM6264相当)が多い用ですが、256Kbit(HM62256相当)や、それ以上の容量のRAMを使っているカセットもあります。
画像のカセットの場合GoldStar社のGM76X88L-15が使われていましたが、カセットによってはデータシートも見つからないような意味不明の型番品が使われていることもあります。
HM62256(日立型番)、TC55257(東芝型番)
いずれも、同等品を「スーファミカセット」から入手ますが新品購入も可能です。HM62256とTC55257は製造メーカーが異なるだけで仕様は全く同じ8bit×32Kの容量を持つ28pinのSRAMです。DIP形状でTTLに直結できるため、RETROFシリーズはこのSRAMを多用しています。
画像はRETROF-16に搭載したTC55257
但し、日立と東芝の以外にも様々なメーカーが製造しており、相互性があるのにも関わらず型番が全て異なる点が厄介です。更にまた同じメーカー品でもアクセス速度や消費電流、あるいはパッケージ形状により末尾に異なる英数字が付加されます。
(HM62256LP-10、TC55257DPL-70L等)
このため、購入する際は様々なメーカーの型番を調べ、その中から最も安いものを選ぶなどの考慮が必要になります。店や型番によって異なりますが1個数百円〜千数百円程度で売られています。
SRM2B256SLMX55(8bit×32K)、M68AF127B(8bit×128K)
共に秋葉原の老舗、秋月電子通商で売られているSRAMで、前者は5個300円、後者は5個500円という超低価格が魅力です。但し両者共、表面実装用の1.27mmピッチのSOPですので、実装時は変換基板を用いたり、この部品だけ表面実装にする等の工夫が必要です。
TTLに直結可能ですが、ドライブ能力は高く有りませんので74LSシリーズのTTLをドライブする際は、事前にファンアウトの計算を行う等の考慮が必要です。
画像は各種SRAMとDIPへの変換基板
左:TC55257PL-10(DIP 28ピン)
中央下:SRM2B256SLMX55
右下:M68AF127B
変換基板は多くのメーカーから様々な物が販売されているが、物によってはDIPサイズのICよりも面積が大きくなるので基板設計時に注意が必要。
プログラムカウンタ(program counter)
メモリの次に重要な部品はプログラムカウンタ
多くの方がコンピュータを作る際にALU(演算ユニット)の設計や実験から始めようとします。確かにコンピュータ=電子計算機ですから、計算を担う回路は重要です。
しかし演算ユニットは「単なる電卓」にも必要な回路です。やはり「単なる電卓」ではなく「コンピュータ」を作ろうとするならば(あるいは作らずに学ぶだけでも)、主メモリの次は、プログラムカウンタの周辺の設計を先に考えるべきです。
プログラムカウンタに必要な機能と不要な機能
16進カウンタ(バイナリカウンタ)であること
74シリーズのカウンタは16進カウンタと10進カウンタが同程度存在します。当然の事ながら、16進カウンタ(バイナリカウンタ)でないといけません。
「なぜ10進カウンタだとまずいのか」が直感で判らない方は、これから先の話は理解が難しくなると思います。大変失礼ですが、「2進法と10進法」だとか「メモリの基本的な使い方」等の入門書に戻ることをお勧めします。
同期カウンタであること
カウンタには同期カウンタと非同期カウンタがあります。非同期カウンタでもタイミング設計さえきちんと行えばプログラムカウンタとして使用することは可能です。しかしMHzオーダーの速度で動かすことを前提とするならば同期カウンタの方が有利ですので、ここでは同期カウンタのみを対象とし、非同期カウンタは選択の対象から外します。
尚、同期カウンタであっても多段接続すると非同期カウンタと同様に「桁上り時の遅れ」が発生するので注意が必要です。
ロードができること
プログラムカウンタは普段は1つずつインクリメントされますが、分岐命令を実行する場合はそのアドレスをロードする必要があります。74シリーズの同期式4bitカウンタは全てロード機能を有していますが、74LS191と74LS193は同期式ロードではないので、自分自身の出力値を利用して自分自身の値を設定する事(相対分岐等がこれにあたる)ができない点に注意が必要です。
クリア端子はあれば便利
プログラムを0番地からスタートさせたい場合は、値0をプログラムカウンタにロードすれば良いのですが、プログラムカウンタにゼロクリアをする機能があると、それを簡単に実現できます。同期クリアと非同期クリアのどちらが便利化は微妙ですが、手動で実行/停止を操作する場合は、非同期式の方が回路は若干簡単になると思います。
デクリメント機能は常識的には不要
プログラムカウンタはデクリメント(カウントダウン)されることはありません。ですから使用するTTLもカウントダウン機能は不要です。
但し、手動で特定の番地の内容を見たり書き換えを行う機能を実現する際に、そのアドレス指定を、プログラムカウンタで行うならば、カウントアップとダウンの両方の機能があると手動プログラミングが楽になります。(手動プログラミング回路に関しては別途解説予定)
出力をHi-Z(ハイインピーダンス)である機能は是非欲しい機能
プログラムカウンタの役割は主メモリに対して実行すべき命令が格納されているアドレスを与えることです。しかし主メモリに対しアドレスを与えるのはプログラムカウンタだけではありませんので、複数のTTLが主メモリのアドレス制御権を奪い合うことになります。
この奪い合いの調停は主メモリのアドレスバスにセレクタを付けることでも実現できますが、3ステート機能を持つTTLを用いるとセレクタ無しで調停できるので、大幅に部品数を減らせます。
プログラムカウンタとして使えるTTL一覧
下記の表が4bitのバイナリカウンタの一覧です。他にも8bitカウンタや特殊なカウンタもありますが、基本的にはこの中から選ぶことになりなります。
選び方の基本的な考え方は、「3ステート出力が可能なものが入手できるならばそれを選ぶ」ですが、500番台600番台は入手が難しいものが多いです。
具体的には「74LS561が入手可能ならそれを、無理なら比較的入手が容易な74LS161の出力制御を外付で行う」といった所でしょうか。
またプログラムカウンタをDMA制御時のアドレス指定レジスタと兼用するならば、ダウンカウントのできる74LS569(無ければ74LS169、但しクリア端子なし)となります。
型番 | 出力 | ロード | クリア | U/D | PIN | 備 考 |
---|---|---|---|---|---|---|
74LS161 | ノーマル | 同期 | 非同期 | 不可 | 16 | もっとも基本的なアップカウンタ |
74LS163 | ノーマル | 同期 | 同期 | 不可 | 16 | 161のクリアを同期式に変えたもの |
74LS169 | ノーマル | 同期 | 不可 | 可 | 16 | 161のクリア端子をU/D選択に変えたもの |
74LS191 | ノーマル | 非同期 | 不可 | 可 | 16 | 169のロードを非同期にしたもの |
74LS193 | ノーマル | 非同期 | 不可 | 可 | 16 | アップ用とダウン用のクロックが個別にある |
74LS561 | Hi-Z可能 | 両方 | 両方 | 不可 | 20 | もっとも基本的なHi-Z可能なアップカウンタ |
74LS569 | Hi-Z可能 | 同期 | 両方 | 不可 | 20 | 561の非同期ロードをU/D選択に変えたもの |
74LS669 | ノーマル | 同期 | 不可 | 可 | 16 | 169とほぼ同じだが、桁上処理が若干遅い |
74LS691 | Hi-Z可能 | 同期 | 非同期 | 不可 | 20 | 161の出力にDレジスタを付ける等の改良 |
74LS693 | Hi-Z可能 | 同期 | 同期 | 不可 | 20 | 163の出力にDレジスタを付ける等の改良 |
74LS697 | Hi-Z可能 | 同期 | 非同期 | 可 | 20 | 169の出力にDレジスタを付ける等の改良 |
74LS699 | Hi-Z可能 | 同期 | 同期 | 可 | 20 | 679の同期クリア版 |
ALU(Arithmetic Logic Unit)
ALUは最も入手が困難なTTL
74シリーズのALUはTTLで計算機を構築するために開発された品です。以下に74シリーズのALUの一覧を示しますが、TTLで計算機を構築する必要が無くなった今、ALUはいずれも入手が困難です。
型番 | bit数 | 可能な演算 | PIN | 備 考 |
---|---|---|---|---|
74N80 | 1bit | 加算 ALUではない(参考掲載) | 14 | ノーマルファミリのみ存在 |
74N82 | 2bit | 加算 ALUではない(参考掲載) | 14 | ノーマルファミリのみ存在 |
74LS83 | 4bit | 加算 ALUではない(参考掲載) | 16 | |
74LS183 | 2bit | 加算 ALUではない(参考掲載) | 14 | 1bitの加算器を2つ実装 |
74LS283 | 4bit | 加算 ALUではない(参考掲載) | 16 | 7483のピン配置を変えたもの |
74LS181 | 4bit | 加減算、AND/OR/EXOR/他、計32種 | 24 | 32種の中には無意味な演算も多数有 |
74LS281 | 4bit | 加減算、AND/OR/EXOR/他、計15種 | 24 | ALU出力にシフトレジスタ付 |
74LS381 | 4bit | 加減算、AND/OR/EXOR/他、計8種 | 20 | 8種類にはセットとリセット含む |
74LS382 | 4bit | 加減算、AND/OR/EXOR/他、計8種 | 20 | 74381のキャリーの扱いを改良 |
74LS681 | 4bit | 加減算、AND/OR/EXOR/他、計16種 | 20 | シフトレジスタ付、レジスタ付 |
74LS881 | 4bit | 加減算、AND/OR/EXOR/他、計32種 | 24 | 74181の外形をスリム24pinにした |
単なる実験機なら演算は加算のみでも構いませんが、最低限の実用性(BASICインタプリタを走らせる等)を確保するのであれば加減算と論理演算は必須です。
上記表中のTTL中いずれも入手が困難ですが、しいて言えば最も多く生産されたと思われる74LS181が入手できるかと思います。
入手の容易性を問わないのであれば、アキュムレータも内蔵されている74LS281か74LS681がより回路を簡単にできます。
いずれにせよ、基本的には上記の型番の中から入手できた物を使うしかありません。
(入手不可場合の対策は後述)
条件付分岐命令との相性
ALUには単に演算をするだけではなく、演算結果にどのような特徴があるかを検出する役割もあります。具体的には「ゼロになった」「ゼロ以外になった」「桁あふれ(carry)が生じた」「桁あふれが生じなかった」等があります。一般にこの演算結果は条件付き分岐命令の条件判断に用いられますので、演算結果の特徴検出機能が多いほど、多彩な条件分岐命令を実現できます。以下は主な条件判断とALUとの相性です。
ゼロか非ゼロか?
アセンブラレベルだと最も多用する条件判断ですが、これが外付けTTL無しで実現できるALUは、74LS181(74LS881)のみです。他のALUは外付けの比較回路が必要です。
キャリーが発生するか否か?
これは全てのALUが持つ、G(Generate)出力端子、P(Propagate)出力端子で判断できます。74LS381以外はCn+4端子がありますので、そちらを参照するとより簡単です。
正負判別
これはALUの型番に関係なく、単に演算結果の最上位ビットを見れば判ります。但しこの方法はゼロは正の値に分類されるので、それを厳密に区別するならゼロ判断も必要です。
大小判別
これは実際に引き算を行った結果の正負判別と同じです。キャリー(引き算なので正確にはボロー)の発生の有無を見る方法もあります。同じ値の場合はゼロ判断も必要です。
奇偶判別
シリアル通信の制御が開発目的にあったインテル8080では標準装備ですが、これを実現するには奇偶判別専用のTTL(74LS180、74LS280など)が別途必要です。無理に実装しても使う機会は殆どないので、どうしても必要ならばソフトウェア側で処理した方が得策です。
ALUを使わない方法(1)
ALUを使わずに、単純ゲート(AND/OR/EXOR)を使ってALU自体を構築する方法もありますが、部品数の増加や基板の大型化は避けられません。私自身は前述のALUをある程度所有しているので、この方法でのTTLコンピュータの作成経験はありませんが「加算器の仕組み」を学ぶならば最適な方法でもあります。
単純ゲートには様々なものがありますが、1〜5の入力を持つ物の内、代表的な物を以下に紹介します。74シリーズは似た機能で異なる型番も多く、また人によって多用する型番は異なりますので、参考程度に眺めてください。
表の「素子数」は一つのパッケージに格納されているそのゲートの個数です。
型番 | 回路数 | ゲートの種類と入力数 | PIN | 備 考 |
---|---|---|---|---|
74LS04 | 6 | NOTゲート | 14 | |
74LS08 | 4 | 2入力ANDゲート | 14 | |
74LS00 | 4 | 2入力NANDゲート | 14 | |
74LS32 | 4 | 2入力ORゲート | 14 | 3入力以上のORは存在しない |
74LS02 | 4 | 2入力NORゲート | 14 | NORは74LS36を好む方も多い |
74LS86 | 4 | 2入力EXORゲート | 14 | 3入力以上のEXORは存在しない |
74LS11 | 3 | 3入力ANDゲート | 14 | |
74LS30 | 3 | 3入力NANDゲート | 14 | |
74LS27 | 3 | 3入力NORゲート | 14 | |
74LS21 | 2 | 4入力ANDゲート | 14 | |
74LS20 | 2 | 4入力NANDゲート | 14 | |
74LS260 | 2 | 5入力NORゲート | 14 |
ALUを使わない方法(2)
ALUも単純ゲートも用いずに「演算装置」を実現する方法があります。
それはROMを使う方法です。ROMと言っても命令やデータを格納するのではなく、予め全ての演算の組み合わせの解(演算結果)をROMに書き込み、それをALUの代りに使う方法です。
「全ての演算の組み合わせ」というと莫大な量に思える方もいるでしょうが、例えば4bit同士の2項演算で演算の種類が8種類ならば、その組み合わせは11ビットに過ぎません。また出力は桁上がりを含めても5bitです。
実際には、入力として「下位からの桁上がり」や「上位の大小比較結果」などが必要で、出力として「大小比較結果」等が必要ですが、アドレス線が14ビット以上でデータ線が8bitのROMならば、書き込みの手間さえ惜しまなければ、TTLを使うよりもはるかに簡単にALUを構築できます。
ちなみに、この目的に最適と思われるフラッシュメモリが秋葉原の老舗部品店で販売されています。
(筆者自身はまだ実際にこれを使ったことはありません。TTLとの相性等は調べておりません。ALUとして利用するならば、自己責任でお願いします)
型番 | アドレス線bit数 | データ線bit数 | 形状 | 価格(2015年5月現在) |
---|---|---|---|---|
EN29F002T | 18 | 8 | PLCC 32ピン | ソケット付で2個250円 |
MX29F040TC | 19 | 8 | TSOP 32ピン | 2個300円 |
アキュムレータ(accumulator)
アキュムレータとレジスタの違い
計算機用語としてのアキュムレータという言葉は、時代によりその意味が大きく変わっています。「計算結果を一時的に蓄える装置」とか「2項演算においてアドレスを指定する必要が無い方の記憶装置」と言われていた時代もあります。また、現在ではレジスタとアキュムレータを区別せずに両者を共にレジスタと呼ぶ方も増えています。
ここでは異論が多々あることを承知の上で、アキュムレータを「ALUの出力に直結されるレジスタ」の意味に限定して、話を進めます。
シフト機能
TTLとして存在するALUにはシフト機能を持つものはありませんので、(注1)除算を実現するためにも(注2)アキュムレータにシフト機能は欲しい所です。逆に言うとシフト命令を割愛するのであれば、アキュムレータとして特別なTTLは不要で、レジスタの項で示したTTLをそのまま使えます。
以下はシフト命令を実装することを前提としてシフト機能をもつTTLの中からアキュムレータとして使えそうな型番を考察します。
(注1)74LS281、74681はシフト機能を持つアキュムレータが内蔵されていますが、ALU自体にシフト機能はありません。
(注2)シフト命令を使わずに減算の繰り返しで除算を実現する方法もありますが、ここではその方法は除外しています
右シフト、左シフト、ビットローテーション等に関する補足
左シフトは変数(レジスタ)に変数自身の値を加える(つまり2倍する)ことにより実現できます。
また、ビットローテションは最上位ビットと最下位ビットの一方を参照してその値をもう一方にセットすることにより、命令数は増えますがシフト命令に置き換え可能です。
このほかにも「符号を保存するシフト」や「キャリーフラグを含めるシフト」など、様々な命令が考えられますが、ここではどうしても必要なのは「右シフト命令」のみとします。
シフト機能をもつレジスタ
アキュムレータとして使用できるTTLの一覧を以下に示します。パラレル入力とパラレル出力の両方が無いものは除外しています。また入出力線が共通のタイプはアキュムレータとして使用するのは入出力制御が煩雑になるのでお勧めできません。
従って、一般のレジスタと同様に3S機能を持つものを優先するならば74LS395か、多段接続時に制限がありますが74LS295しか選択の余地はありません。3S機能を諦めて両方向にシフトできる事を優先するならば、74LS194となります。入出力が共通の型番はALUとの接続が煩雑になるので避けるのが賢明です。
型番 | ビット数 | 出力 | クロック | クリア | PIN | 備 考 |
---|---|---|---|---|---|---|
74LS95 | 4 | ノーマル | N-Edge | なし | 14 | ロードとシフトはクロック独立 |
74LS96 | 5 | ノーマル | P-Edge | 非同期 | 16 | ロードの前にクリアが必要 |
74LS178 | 4 | ノーマル | N-Edge | なし | 14 | |
74LS179 | 4 | ノーマル | N-Edge | 非同期 | 16 | 最終段は反転出力もあり |
74LS194 | 4 | ノーマル | P-Edge | 非同期 | 16 | 両方向可能 |
74LS195 | 4 | ノーマル | P-Edge | 非同期 | 16 | 最終段は反転出力有。初段はJ/K入力 |
74LS198 | 8 | ノーマル | P-Edge | 非同期 | 24 | 両方向可能 |
74LS199 | 8 | ノーマル | P-Edge | 非同期 | 24 | 初段はJ/K入力 |
74LS295 | 4 | Hi-Z可能 | P-Edge | なし | 14 | Hi-Z状態では次段に伝達不可 |
74LS395 | 4 | Hi-Z可能 | P-Edge | 非同期 | 16 | Hi-Z状態でも次段に伝達可能 |
74LS299 | 8 | I/O共通 | P-Edge | 非同期 | 20 | 両方向可能、323の非同期クリア版 |
74LS322 | 8 | I/O共通 | P-Edge | 非同期 | 20 | 入力は2系統を選択可能 |
74LS323 | 8 | I/O共通 | P-Edge | 同期 | 20 | 両方向可能、299の同期クリア版 |
シフト機能を持つTTLが入手できない場合
上記のTTLがいずれも入手が困難な場合は、単純ゲートと普通のD-FF等を組み合わせて任意のシフトレジスタを構築する事も可能です。しかしそこまでするよりも、シフト機能を諦めて、普通のレジスタで構築した方が賢明かと思います。
また普通のレジスタではなくアップダウンが可能なカウンタを用いて、ALUを使わずにアキュムレータの値をインクリメント/デクリメントをする命令を用意する等も考えられます。
そのほかの方法としては、ALUの項で紹介したROMを使って演算する方法があります。この方法はシフト演算にも応用できます。
IRとFR(instruction register & flag register)
IRとFRは3S出力機能が不要
IRは実行すべき命令(機械語コード)を格納するレジスタです。
FRは条件分岐命令の条件一致判断時に参照するフラグ群を格納するレジスタです。
両者共に一般のレジスタと同じTTLを用いても全く問題はないのですが、IRの出力は命令デコーダに直結されるため他と競合を起こしません。またFRの出力は条件一致の判定回路に直結されるため他と競合を起こしません。
従って、この両者は無理に3S出力機能があるTTLを用いる必要はなく、3S出力機能のないレジスタもその候補の対象にすることができます。
3S出力機能があるTTLの一覧は次項の「ワークレジスタ」の項で紹介しますので、ここでは4bit以上の3S出力機能のないD-FFのみを参考までに列挙します。
クロックイネーブル端子のある74LS377がお勧めです。
型番 | ビット数 | クロック | イネーブル | クリア | PIN | 備 考 |
---|---|---|---|---|---|---|
74LS174 | 6 | P-Edge | なし | 非同期 | 16 | |
74LS175 | 4 | P-Edge | なし | 非同期 | 16 | 出力は反転と非反転の2系統 |
74LS273 | 8 | P-Edge | なし | 非同期 | 20 | |
74LS276 | 4 | N-Edge | 入力はJK | 非同期 | 20 | クロックが各bit毎に独立している |
74LS298 | 4 | N-Edge | なし | なし | 16 | 2系統の入力をセレクト可能 |
74LS376 | 4 | P-Edge | 入力はJK | 非同期 | 16 | |
74LS377 | 8 | P-Edge | あり | なし | 20 | |
74LS378 | 6 | P-Edge | あり | なし | 16 | |
74LS379 | 4 | P-Edge | あり | なし | 16 | 出力は反転と非反転の2系統 |
74LS396 | 4×2段 | P-Edge | なし | なし | 16 | 4bitを2回取り込み8bitに変換する |
74LS398 | 4 | P-Edge | なし | なし | 20 | 399に反転出力を加えたもの |
74LS399 | 4 | P-Edge | なし | なし | 16 | 2系統の入力をセレクト可能 |
ワークレジスタ(work registers)
ワークレジスタとは
ワークレジスタという言葉は人によってその概念や定義が様々です。ここではCPUを構成するレジスタの内、これまでに紹介したプログラムカウンタ、アキュムレータ、インストラクションレジスタ、フラグレジスタの4つの素子以外の、バスの値を一時的に保持する素子をワークレジスタと呼ぶこととします。
ワークレジスタに適しているTTL
3S機能のあるものを選ぶ
前述のカウンタでは3S機能がある物は入手困難な物が多かったのですが、単に値を記憶するだけの素子ならば、出力に3S機能がある物も比較的入手が容易です。ワークレジスタの殆どは他の素子と出力が衝突しますので、3S機能を持つものを選ぶのが得策です。
エッジセットかレベルか
自分自身の現在の値が、自分自身の設定値に使われる場合はエッジセットタイプ(D-FFタイプ)である必要があります。それ以外の場合はレベルセットタイプ(ラッチタイプ)でも構いません。
入手しやすい方を選ぶのが前提ですが、両タイプともに入手できるにであれば、タイミング設計がし易いエッジセットタイプを選ぶ方が得策です。
イネーブル端子はあれば便利
ワークレジスタを含め、CPU内で使われる全てのレジスタは常に値を更新するのではなく、特定の命令を実行するときのみ値を更新します。ですから値を更新するか否かを選択できる入力端子(イネーブル端子)があると便利な場合が多いです。
クリア端子は基本的に不要
プログラムカウンタはゼロクリアがあればゼロ番地スタートが簡単になりますが、ワークレジスタはゼロクリアして使う機会は殆どありません。基本的にはゼロクリア端子は不要ですが、「ワークレジスタに記憶した値の上位ビットのみをクリアする」等という処理が必要になる場合もあり、絶対に不要だとは言い切れません。
反転出力タイプに注意
TTLの中には記憶した値を反転して出力するものもあります。入出力関係を除くと、わざわざ反転タイプを用いることは殆どありません。むしろ反転出力は間違って購入しないように注意をする方が大事かと思います。
4bitか8bitか
カウンタが4bit単位であるものが多かったのに対し、3S機能があるレジスタは8ビット単位の物が殆どです。常識的に考えると1つのパッケージで処理できるビット数は多い方が好ましいのです。しかしそのレジスタに接続される素子が1パッケージ4ビットの場合は、レジスタも4bitとした方がプリント基板のレイアウトが美しくなることがあります。
プリント基板のレイアウトの容易さを見越して部品を選ぶのも、部品選択では重要です。
ワークレジスタの候補となるTTL一覧
以上の考察を元に「3S出力のエッジセットタイプ」を全て洗い出したのが以下の表となります。800番台は入手が困難ですので、4bitなら74LS173、8bitなら74LS574を選ぶのが妥当です。74LS374は74LS574と同機能でより入手しやすいのですが、ピンの配置が74LS574に比べると使いずらいので注意が必要です。
(レベルセットタイプのレジスタは「入出力ポート」の項で詳細を解説予定)
(3S出力以外のレジスタは「インストラクションレジスタ」の項で詳細を解説済)
型番 | ビット数 | クロック | イネーブル | クリア | PIN | 備 考 |
---|---|---|---|---|---|---|
74LS173 | 4 | P-Edge | 2系統有 | 非同期 | 16 | 4ビットながらも多彩な機能がある |
74LS388 | 4 | P-Edge | なし | なし | 16 | 出力は3Sとノーマルの2系統 |
74LS364 | 8 | P-Edge | なし | なし | 20 | 374の出力をCMOS用に変えたもの |
74LS374 | 8 | P-Edge | なし | なし | 20 | |
74LS534 | 8 | P-Edge | なし | なし | 20 | 出力反転型 |
74LS564 | 8 | P-Edge | なし | なし | 20 | 出力反転型、534のピン配改良型 |
74LS574 | 8 | P-Edge | なし | なし | 20 | 374のピン配改良型 |
74ALS575 | 8 | P-Edge | なし | 同期 | 24 | 574に同期クリアを追加したもの |
74ALS576 | 8 | P-Edge | なし | なし | 20 | 564と同じ。 |
74ALS577 | 8 | P-Edge | なし | 同期 | 24 | 576に同期クリアを追加したもの |
74ALS874 | 4bit×2 | P-Edge | なし | 非同期 | 24 | クロック、クリア、3Sは独立 |
74ALS876 | 4bit×2 | P-Edge | なし | 非同期 | 24 | 874の出力反転型 |
74ALS878 | 8 | P-Edge | なし | 同期 | 24 | クロック、クリア、3Sは独立 |
74ALS879 | 8 | P-Edge | なし | 同期 | 24 | 878の出力反転型 |
型番にALSとあるのはALSファミリーには存在するが、LSファミリーでの存在が確認できなかった型番
出力ポート(output port)
出力ポートはD-FF
出力ポートは何を制御するのかによって、その考え方や設計方針が大きく変わります。
仮に単にLEDを点灯/消灯するだけの単純パラレルポートならば、D-FFの入力をCPU内のデータバス等に、出力はLEDに接続するだけでも十分です。
出力ポートにバス監視機能を持たせる裏技
LEDを点滅させるだけのポートにあえてD-FFではなくラッチを用い、強制的にラッチのゲートを開放状態にすると(注)、出力ポートを「バス監視装置」として使えます。これはハードのデバッグに絶大な効果を発揮します。
【注】D-FFでも常に連続したクロックを与えることにより、同様の機能を実現できますが、手動でCPUにクロックを与える「ステップ実行」時にも、常に出力ポートに高速のクロックを与える必要があります。
ラッチTTL一覧
出力ポートに「バス監視機能」を兼任させるか否かは別としても、D-FFの一覧表は既に「レジスタ」「IRとFR]の項で紹介済みですのでここではレジスタや出力ポートとして使えるラッチのみを紹介します。出力ポートにLEDを接続する場合は出力論理が負のものを選んだ方が、より多くの電流を流せます(注)。
最近のLEDは僅かな電流でも十分明るく点灯しますので、出力論理が正でも特に問題はありません。
型番 | ビット数 | 出力 | ラッチ | クリア | PIN | 備 考 |
---|---|---|---|---|---|---|
74LS75 | 4 | 正負 | Hold=L | なし | 16 | |
74LS77 | 4 | 正 | Hold=L | なし | 14 | |
74LS363 | 8 | 正 | Hold=L | なし | 20 | 出力電圧高め(CMOSへの接続用) |
74LS373 | 8 | 正 | Hold=L | なし | 20 | |
74LS375 | 4 | 正負 | Hold=L | なし | 16 | 75のピン配を改良したもの |
74LS533 | 8 | 負(3S可) | Hold=L | なし | 20 | |
74LS563 | 8 | 負(3S可) | Hold=L | なし | 20 | 533のピン配を「bit対向型」に改良 |
74LS573 | 8 | 正(3S可) | Hold=L | なし | 20 | 373のピン配を「bit対向型」に改良 |
74ALS580 | 8 | 負(3S可) | Hold=L | なし | 20 | 563と同じ。ALSのみ存在 |
74ALS841 | 10 | 正(3S可) | Hold=L | なし | 24 | LSは存在せず |
74ALS842 | 10 | 負(3S可) | Hold=L | なし | 24 | LSは存在せず |
74ALS843 | 9 | 正(3S可) | Hold=L | あり | 24 | LSは存在せず、プリセット端子あり |
74ALS844 | 9 | 負(3S可) | Hold=L | あり | 24 | LSは存在せず、プリセット端子あり |
74ALS845 | 8 | 正(3S可) | Hold=L | あり | 24 | LSは存在せず、プリセット端子あり |
74ALS846 | 8 | 負(3S可) | Hold=L | あり | 24 | LSは存在せず、プリセット端子あり |
74ALS873 | 8 | 正(3S可) | Hold=L | あり | 24 | LSは存在せず、制御線は4bit毎に独立 |
74ALS880 | 8 | 負(3S可) | Hold=L | あり | 24 | LSは存在せず、制御線は4bit毎に独立 |
74ALS412 | インテル8212(8080用の8ビット双方向ラッチ)相当品。LSは存在せず | |||||
74ALS432 | 412の出力反転タイプ。LSは存在せず |
入力ポート(input port)
入力ポートは3Sバッファ
入力ポートも何を入力するのかによって、その考え方や設計方針が大きく変わります。
ここでは、3Sバッファの出力をCPU内のデータバス等に接続し、入力をスイッチ等に接続するだけの入力ポートを指定します。
3Sバッファ一覧
以下に74シリーズとして存在する4bit以上の3Sバッファを紹介します。3Sバッファは入力ポートに用いるだけではなく、3S出力機能を持たないカウンタやレジスタを3S出力化する目的にも使用します。多くの種類がありますが、8bitならば74LS541がシンプルで使いやすく、4bitならば2系統の入力がある74LS254をお勧めします。
型番 | ビット数 | 出力 | 3S論理 | 3S制御 | PIN | 備 考 |
---|---|---|---|---|---|---|
74LS125 | 4 | ノーマル | Lで出力 | 独立 | 14 | |
74LS126 | 4 | ノーマル | Lで出力 | 独立 | 14 | |
74AS230 | 8 (4+4) | 混在 | Lで出力 | 4+4 | 20 | 出力は4bitがノーマルで、4bitが反転 |
74AS231 | 8 (4+4) | 反転 | LとH | 4+4 | 20 | 4bitの双方向バスバッファに適す |
74LS240 | 8 (4+4) | 反転 | Lで出力 | 4+4 | 20 | |
74LS241 | 8 (4+4) | ノーマル | LとH | 4+4 | 20 | 4bitの双方向バスバッファに適す |
74LS244 | 8 (4+4) | ノーマル | Lで出力 | 4+4 | 20 | |
74LS257 | 4×2 | ノーマル | Lで出力 | 共通 | 16 | 入力は2系統を選択できる |
74LS258 | 4×2 | 反転 | Lで出力 | 共通 | 16 | 入力は2系統を選択できる |
74LS425 | 4 | ノーマル | Lで出力 | 独立 | 14 | 125からクランプダイオードを外した |
74LS426 | 4 | ノーマル | Lで出力 | 独立 | 14 | 126からクランプダイオードを外した |
74LS365 | 6 | ノーマル | L・Lで出力 | 共通 | 16 | 3S制御線が2本ある |
74LS366 | 6 | 反転 | L・Lで出力 | 共通 | 16 | 3S制御線が2本ある |
74LS367 | 6 (2+4) | ノーマル | Lで出力 | 2+4 | 16 | |
74LS368 | 6 (2+4) | 反転 | Lで出力 | 2+4 | 16 | |
74LS465 | 8 | ノーマル | L・Lで出力 | 共通 | 16 | 3S制御線が2本ある |
74LS466 | 8 | 反転 | L・Lで出力 | 共通 | 16 | 3S制御線が2本ある |
74LS467 | 8 (4+4) | ノーマル | Lで出力 | 4+4 | 16 | |
74LS468 | 8 (4+4) | 反転 | Lで出力 | 4+4 | 16 | |
74LS540 | 8 | 反転 | L・Lで出力 | 4+4 | 20 | |
74LS541 | 8 | ノーマル | L・Lで出力 | 4+4 | 20 | |
74AS756 | 8 (4+4) | O.C. | Lで出力 | 4+4 | 20 | 240のオープンコレクタ型 |
74AS757 | 8 (4+4) | O.C. | LとH | 4+4 | 20 | 241のオープンコレクタ型 |
74AS760 | 8 (4+4) | O.C. | Lで出力 | 4+4 | 20 | 244のオープンコレクタ型 |
74LS795 | 8 | ノーマル | L・Lで出力 | 共通 | 16 | 465の別名(実質的に同一品) |
74LS796 | 8 | 反転 | L・Lで出力 | 共通 | 16 | 466の別名(実質的に同一品) |
74LS797 | 8 (4+4) | ノーマル | Lで出力 | 4+4 | 16 | 467の別名(実質的に同一品) |
74LS798 | 8 (4+4) | 反転 | Lで出力 | 4+4 | 16 | 468の別名(実質的に同一品) |
型番にASとあるのはASファミリーには存在するが、LS/ALSファミリーでの存在が確認できなかった型番
命令デコーダ(instruction decoder)
命令デコーダの役割
命令デコーダはインストラクションレジスタが保持している命令を解読して、個々のレジスタやプログラムカウンタ等に与える信号を作り出す役割を持ちます。
命令デコーダとして使えるTTL
「命令デコーダに適したTTLはどれか?」という問いは、「どんな命令をどの様にデコードするのか?」が決まらないと答えれません。そのため下記表には命令デコーダとして使えそうな全てTTLを記載しました。
但し、実際には3ステートやオープンコレクタである必要性もなく、出力の論理もも負論理が適していますので(TTLの制御信号入力は負論理アクティブのものが多い)、下表の背景を黄色にしたTTLのどれかを使うのが現実的です。
型番 | 変換ルール | 選択出力の論理 | イネーブル | PIN | 備 考 |
---|---|---|---|---|---|
74LS139 | 2bit→4 ×2 | 負 | L(独立) | 16 | セレクト独立 |
74LS155 | 2bit→4 ×2 | 負 | LLとLH | 16 | セレクト共通 |
74LS156 | 2bit→4 ×2 | 負(O.C.) | LLとLH | 16 | 155のオープンコレクタ型 |
74LS239 | 2bit→4 ×2 | 正 | L(独立) | 16 | 139のセレクト出力を反転 |
74LS255 | 2bit→4 ×2 | 負(3S) | LとH | 16 | 155の3S型 |
74LS539 | 2bit→4 ×2 | 正負(3S) | L(独立) | 20 | セレクト独立 |
74LS131 | 3bit→8 | 負 | LH | 16 | 入力にD-FF付(P-Edge) |
74LS137 | 3bit→8 | 負 | LH | 16 | セレクト入力にラッチ付 |
74LS138 | 3bit→8 | 負 | LLH | 16 | |
74LS237 | 3bit→8 | 正 | LH | 16 | セレクト入力にラッチ付 |
74LS238 | 3bit→8 | 正 | LLH | 16 | |
74LS256 | 1→8 | 入力値をラッチ | なし | 16 | アドレス線でラッチビットを決める |
74LS259 | 1→8 | 入力値をラッチ | なし | 16 | 256と同じ |
74LS538 | 3bit→8 | 正負(3S) | LLHH | 20 | |
74LS42 | 4bit→10 | 負 | なし | 16 | イネーブル付の3bit→8として使用可 |
74LS43 | 4bit→10 | 負 | なし | 16 | セレクト入力値が3〜12の特殊用途 |
74LS44 | 4bit→10 | 負 | なし | 16 | セレクトがグレイコードの特殊用途 |
74LS45 | 4bit→10 | 負(O.C.) | なし | 16 | 出力は30V耐圧80mA |
74LS145 | 4bit→10 | 負(O.C.) | なし | 16 | 出力は15V耐圧80mA |
74LS445 | 4bit→10 | 負(O.C.) | なし | 16 | 出力は7V耐圧80mA |
74LS537 | 4bit→10 | 正負(3S) | LH | 20 | |
74LS154 | 4bit→16 | 負 | LL | 24 | |
74LS159 | 4bit→16 | 負(O.C.) | LL | 24 |
バスセレクタとフラグセレクタ (selectors )
バスセレクタ
セレクタとは複数の信号線の中から1つの信号を選ぶものです。バスに対し、3S出力ではない複数のTTLを接続する場合はセレクタによる調停が必要になります。これをバスセレクタと呼びます。バスに接続されるTTLの出力が全て3S出力の場合は、バスセレクタは不要となりますので、バスセレクタを使うのは3S出力のTTLが入手できなかった場合に限ります。
フラグセレクタ
フラグセレクタとはフラグレジスタが保持する複数のフラグから1つのフラグを選択して条件分岐命令等を司る回路に結果を渡す役目を持ちます。
例えば、インテル8080の場合は/NZ/Z/NC/C/PO/PE/P/Mの8つのフラグがあり、これを命令コード中の3bitの値で1つを選び、条件付命令の実行/非実行を判断しています。8080は全体が1つのLSIですが、内部にはフラグセレクタと同じ回路があります。
バスセレクタ・フラグセレクタとして使えるTTL一覧
以下にセレクタとして使えるTTLの一覧をまとめました。表中のストローブは選択状態にかかわらず出力を強制的に特定の値にできる信号線の有無を意味します。例えば「HでZ」はHにすると出力が強制的にZ(ハイインピーダンス)になる信号線がある事を示します。
型番 | 選択ルール | 出力論理 | ストローブ | PIN | 備 考 |
---|---|---|---|---|---|
74LS157 | 2→1 ×4 | 正 | HでL(共通) | 16 | |
74LS158 | 2→1 ×4 | 負 | HでH(共通) | 16 | |
74LS257 | 2→1 ×4 | 正(3S可) | HでZ(共通) | 16 | |
74LS258 | 2→1 ×4 | 負(3S可) | HでZ(共通) | 16 | |
74LS298 | 2→1 ×4 | 正(FF) | なし | 16 | 出力にD-FF(N-Edge)が付いている |
74LS398 | 2→1 ×4 | 正負(FF) | なし | 20 | 出力にD-FF(P-Edge)が付いている |
74LS399 | 2→1 ×4 | 正(FF) | なし | 16 | 出力にD-FF(P-Edge)が付いている |
74LS153 | 4→1 ×2 | 正 | HでL(独立) | 16 | |
74LS253 | 4→1 ×2 | 正(3S可) | HでZ(独立) | 16 | |
74LS352 | 4→1 ×2 | 負 | HでH(独立) | 16 | |
74LS353 | 4→1 ×2 | 負(3S可) | HでZ(独立) | 16 | |
74LS151 | 8→1 | 正負 | H(備考参照) | 16 | ストローブは正出力がL、負出力がH |
74LS152 | 8→1 | 負 | なし | 14 | |
74LS251 | 8→1 | 正負 | HでZ | 16 | |
74LS351 | 8→1 ×2 | 負(3S可) | HでZ(共通) | 20 | 8ビットの内、4ビットは2回路共通入力 |
74LS150 | 16→1 | 負 | HでH | 24 |
その他の回路(other circuits)
ステージカウンタ
1つの機械語命令は複数のステージに分けて実行されます。現在どのステージを実行しているのかをカウントするのがステージカウンタです。ステージカウンタに使えるTTLはプログラムカウンタとして使えるTTLと同じですが、3S出力である必要はなく、また16進カウンタではなく10進カウンタの方が適している場合(1命令を5ステージで実行する場合など)もあります。以下に非3S出力の10進アップカウンタの代表的な型番のみを紹介します。
型番 | 概 要 | PIN | 備 考 |
---|---|---|---|
74LS160 | 10進同期カウンタ(非同期クリア) | 16 | 74LS161の10進版 |
74LS162 | 10進同期カウンタ(同期クリア) | 16 | 74LS163の10進版 |
ステージデコーダ
ステージカウンタに接続され、現在実行しているステージに対応した信号を作りだすためのデコーダーです。候補となるTTLは命令デコーダと同一です。
内部状態保持レジスタ
内部状態保持レジスタとはコンピュータの内部状態を記憶するレジスタです。例えばCPU自身が実行状態にあるのか停止状態にあるのかの記憶がそれにあたります。基本的にはフラグレジスタと同じTTLが使えますが、よりビット数が少ないもので十分な場合も多く、以下の様なTTLを使う事が考えられます。
型番 | 概 要 | PIN | 備 考 |
---|---|---|---|
74LS74 | 2回路のD-FF 、各回路は完全独立 | 14 | クリアとプリセット付 |
チャタリング防止
手動でプログラムを主メモリに書き込む際に、書き込むアドレスをアップ/ダウンする時などに必要になります。シュミットトリガとCR(コンデンサと抵抗)を使う方法と、RS-FFと双投スイッチを使う方法などあります。
型番 | 概 要 | PIN | 備 考 |
---|---|---|---|
74LS14 | 6回路のインバーター(NOTゲート) | 14 | シュミットトリガー |
74LS257 | 4回路のRSフリップフロップ | 16 |
クロック発振器
基準クロックとなる矩形波を生成する回路です。74LS00や74LS04等の反転出力型のゲートと水晶発振子(またはセラミック発振子)を使う方法もありますが、電源を供給するだけで安定した矩形波を得られる専用の発振素子を使う方が賢明です。種々の周波数のものが数百円程度で販売されています。
この章の終わりに
本章の冒頭でも述べましたが、2015年現在、かなりの数の型番が入手困難もしくは入手不可能です。TTLコンピュータの製造はまずは本章で紹介したTTLを「入手可能品」と「入手不可能品」に仕分けして、入手可能品のみを用いて設計しなければならないという大きな制約があります。
(具体的にどの型番を使い、どのように設計を進めたのかは次章以降で解説予定)
(2015年5月吉日)初出