「汎用ロジックでコンピュータを作る」のトップページ(目次)はこちら 著者のメインページはこちら
このページはデザイン確認用の仮UPです。本サイトにはこのページしかありません。上記の目次は意味を持ちません。
プログラムカウンタに要求される機能
プログラムカウンタはアドレス幅と同じ出力bit数が必要
命令を取り出すために、主メモリ(M)にアドレス値を与えるのがプログラムカウンタ(PC)の役割です。
左図はこの概念を表しています。この図ではPCとMが1本の矢印で接続されていますが、実際にはアドレスバス幅と同じ数の配線が存在します。バス幅が16bitならばPCとMは16本の配線で接続されることになります。
しかしPCはアドレスバスと同じbit数のカウンタならば何でも良いという訳ではありません。
プログラムカウンタにはロード機能が不可欠
CPUの命令セットに分岐命令は必須です。分岐命令はPCに分岐先のアドレスをロードすることで実現します。従ってPCとして使えるのはロード機能付のTTLに限定されます。
左図は青い矢印はアドレスバス幅と同じ幅の信号線です。具体的にどこから来る信号線なのかはここでは保留していますが、PCとして用いるTTLにはこの青い矢印で示される信号を受け入れる端子が必須です。
この端子は非同期式ロード端子か同期式ロード端子のいずれか(あるいは両方)となります。非同期式の場合はこの端子をアクティブにした瞬間にロードされますが、同期式の場合はこの端子をアクティブにした上でクロックを与えなければなりません。どちらが優れているかは一概には言えませんが、これを間違うと大変な事になりますので慎重に選択する必要があります。
3S出力のプログラムカウンタがあれば配線量を激減できる
メモリに対してアドレス値を与えるのはPCだけではありません。PCの値と無関係な場所のメモリ内容をアクセスする命令もあります。ですから一般にメモリのアドレス線には、アドレス値を出力する素子が複数組接続され、バスを奪い合いする形となります。
図はPCとXという名前のレジスタがMのアドレス制御を奪い合っている様子を図式化したものです。この様な場合はMがどちらの信号を受け入れるかを選択する「切替スイッチ」的な物が必要となります。
複数の信号線から1つの信号をを選択するTTL(セレクタ)には74153(4選択×2回路)や74157(2選択×4回路)等がありますが、何本もの信号線を切替える場合はそれらが大量に必要となります。その問題を解決するために考案されたのが3S出力のTTLです。
3S出力のTTLにはOE(Output Enable、出力許可)と呼ばれる端子があり、この端子をアクティブにしない限り、出力線は「断線」と同じ状態(正確に言うと高抵抗状態、一般にはハイインピーダンスと呼ばれHi-Z等と略記される)になります。
PCに3S出力のTTLを使用すると、セレクタが不要となり配線量を激減できます。但しその場合はバスを奪い合う全てのTTL(図ではXがそれにあたる)を3S出力とする必要があります。
クリア端子の必要性
PCをゼロクリアするのとPCにゼロをロードするのは基本的に同じです。ですからロード機能があればクリア端子は必須ではありません。しかしロード機能を用いるゼロクリアはPCのデータ入力端子を全てLレベルする仕組みが別途必要となりますので、当然の事ながらクリア端子がある方がPCをゼロクリアするのは簡単になります。但し「任意の番地から実行可能」とするCPUならば、ゼロクリアに特別な意味はなくなりますので、クリア端子に拘る必要はありません。
Up/Down機能の必要性
プログラムカウンタは常に値が増加する方向にカウントされます。ですからプログラムの実行にダウンカウントは必要ありません。しかしプログラム停止時に手操作でメモリ内容を確認したり変更する機能(手入力プログラミング機能)の実装を考えた場合、プログラムカウンタにUp/Down機能があるものを用いると、より使いやすい機能を提供する事ができます。
(このプログラムカウンタのダウンカウント機能の実例に関しては「手入力プログラミング機能」の項で詳しく述べる予定です。)
プログラムカウンタに用いるTTLの決定
プログラムカウンタに、用いるTTLの決定方法
下記の表が汎用ロジック(74シリーズ)にあるロード機能付きのバイナリカウンタの一覧です。この中のいずれかをプログラムカウンタとして使用する必要があります。この中には入手が困難である物も多々あります。もし、3S出力である74LS561、74LS569、74LS697、74LS699が入手可能なら、まずはそれを確保しておくべきです。
尚、下表の中にはLSよりもALSの方が入手しやすいものも有ります。LSやALS以外にもSやFも使えますので、LSが入手不可の場合はこれらを探してみる価値はあります。但しCMOSタイプ(HCやHCT)とは互換性はありませんので注意が必要です。
型番 | pin | bit | ロード | クリア | 出力 | ラッチ | カウント方向 | 入手容易性 |
---|---|---|---|---|---|---|---|---|
74161 | 16 | 4 | 同期 | 非同期 | 通常 | 無 | UPのみ | 比較的容易 |
74163 | 16 | 4 | 同期 | 同期 | 通常 | 無 | UPのみ | 比較的容易 |
74169 | 16 | 4 | 同期 | なし | 通常 | 無 | UP/DOWN切替端子有 | 比較的容易 |
74191 | 16 | 4 | 非同期 | なし | 通常 | 無 | UP/DOWN切替端子有 | 比較的容易 |
74193 | 16 | 4 | 非同期 | 非同期 | 通常 | 無 | UP/DOWNクロック独立 | 比較的容易 |
74561 | 20 | 4 | 両方 | 両方 | 3S | 無 | UPのみ | やや困難 |
74569 | 20 | 4 | 同期 | 両方 | 3S | 無 | UP/DOWN切替端子有 | やや困難 |
74669 | 16 | 4 | 同期 | なし | 通常 | 無 | UP/DOWN切替端子有 | やや困難 |
74697 | 20 | 4 | 同期 | なし | 3S | あり | UP/DOWN切替端子有 | 困難 |
74699 | 20 | 4 | 同期 | 同期 | 3S | あり | UP/DOWN切替端子有 | 困難 |
74867 | 24 | 8 | 同期 | 同期 | 通常 | 無 | UP/DOWN/LD/CLR切替 | 極めて困難 |
74869 | 24 | 8 | 同期 | 非同期 | 通常 | 無 | UP/DOWN/LD/CLR切替 | 極めて困難 |
型番は原則74LSXXか74ALSXXを想定。
pinはパッケージのピン数、bitはカウンタのbit数を意味する。
74697、74699はラッチ機能を使わずに「ラッチ無し」として扱う事は容易に可能。
入手容易性は筆者の主観。基本的には一般のパーツショップでネットから注文できる店が複数あるものを「比較的容易」とした。
筆者は2013年10月の時点で74ALS569を購入する事ができました。しかし74ALS569も入手が困難になりつつあります。入手の容易性で選択するのであれば、クリア機能優先なら74LS161か74LS163、Up/Down機能優先なら74LS169を選択し、その出力に別途3Sバッファを接続するのが良いかと思います。
カウントイネーブル端子に関する補足
74ALS569の多段接続
多くの同期カウンタは4bit出力です。16bitのカウンタとして用いる場合はこれを4つ並べなければなりません。この時に個々のカウンター間の結線に必要となるカウントイネーブル端子は、標準ロジックの中でも非常に解かりづらい端子です。
ここでは74ALS569を例として、多段接続時のカウントイネーブル端子の使い方を解説します。
ピン配置(上から見た図) | ピン略称 | I/O | pin |
---|---|---|---|
74ALS569のピン配置 画像はTIのHPより入手 |
Vcc / GND | ー | 電源(5V)とGND |
CLK | 入 | Clock(クロック)入力。 立ち上がり(positive edge)動作 | |
QA~QD | 出 | データ出力。QAが最下位ビット。OEがLの時のみ有効 | |
OE | 入 | Output Enable。これがLならば、QA~QDが有効になり、HならばQA~QDはHi-Zとなる | |
A~D | 入 | データ入力。Aが最下位ビット。LDがLの時のみ有効 | |
LD | 入 | Load。これがLの時にクロックが立ち上がると、この値がロードされる | |
ENT(CET) | 入 | Count Enable Trickle。CETあるいは単にETとも略される。以下本文ではCETと記述 | |
ENP(CEP) | 入 | Count Enable Parallel。CEPあるいは単にEPとも略される。以下本文ではCEPと記述 | |
U/D | 入 | Up/Down。これがHならばカウントアップ、Lならばカウントダウンとなる。 | |
ACLR | 入 | Asynchronous Clear。非同期クリア、Lにするとクロックとは無関係にゼロクリアされる。 | |
SCLR | 入 | Synchronous Clear。同期クリア、Lにすると次のクロックの立ち上がりでゼロクリアされる。 | |
RCO | 出 | Ripple Carry Output。U/D=Hなら出力が15の時、U/D=Lなら出力が0の時にLとなる。 | |
CCO | 出 | Clock Carry Output。ENT、ENP、RCOが全て0の時にCLKと同じ値をとる。他の場合はL。 |
同期カウンタが持つ端子の中で解り難いのがCETとCEPの使い方、もしくはCETとCEPの使い分けです。
両者ともに「カウントをするかしないか」の指示を与えるための信号線であり、74ALS569の場合は両者がともにLの時にカウントが許可されます。しかし何故2つもあるのでしょうか? しかも「Trickle」と「Parallel」という日本人にとっては解りづらい名前で区別されています。
この疑問の解決には、同期カウンタを複数並べた場合、「カウントをするかしないか」の指示は「カウンタの外」から行われる場合と「カウンタの中」から行われる場合があることを理解する必要があります。
「カウンタの外」とは、複数並べたカウンタ全てに対し「カウントを開始せよ」あるいは「カウントを止めよ」と指示することを意味します。複数並べたカウンタに対し指示するので「Parallel」です。
「カウンタの中」とは、複数並べたカウンタの中のあるカウンタが一杯になった場合(16進のアップカウンタならば値が15になった状態)に次段のカウンタにカウントを指示することです。一杯になった場合にのみカウントするので「Trickle」(溢れた水が滴る様子から)です。
同期カウンタの配線例
74ALS569を例とした具体的な配線を紹介します。但し下図はCETとCEP、およびRCOのみを抽出し、他のピンは省略しています。
(1)は最も単純な接続方法です。これでも正しく動きます。
しかし、CETとCEPの使い分けが全く解らないので「お手本」とは言い難い接続方法です。
(2)はCETとCEPの使い分けを明示できる「お手本」です。
CEPが全体制御を、CETが繰上り制御を担当している事が直感的に理解できる接続方法です。
(3)は(2)の変形。初段(一番右側)のCETはCEP(全体のカウント制御)と同じで良いと考える接続方法です。
(4)はCETとCEPの本来の意味を無視した接続方法です。
初段のカウンタが一杯になった事を2段目以降のカウンタに同時に伝えることで内部遅延を若干短くし、最大カウント周波数を上げるというトリッキーな回路です。動作速度に余裕があるならば「お手本」とすべき回路ではありません。
RETROF-16における実際の回路
16bitTTLコンピュータ「RETROF-16」は5機あります(内2機は未稼働)。5機ともに全て回路は微妙に異なります。ここで紹介するのは最新(2013年10月設計開始)のRETROF-16の回路図です。