※このサイト内の情報は一切保証されません。参考にする際はすべて自己責任となります。
2023/07/02 Misskeyリンクの追加(内容に変更ありません)
2023/02/11 アクセスカウンタ・アクセス解析タグ入れ替え(内容に変更ありません)
2019/04/05 Yahoo!ジオシティーズ廃止に伴う参考サイトのリンク先修正
2016/01/30 解析タグ追加(内容に変更ありません)

目次

1. 概要
2. レジスタの置き換え
3. マルチプレクサの置き換え
4. フルアダーの置き換え
5. カウンタの置き換え
6. 命令デコーダの置き換え
7. 構成
8. その他の問題
9. あとがき
10.参考にさせていただいたサイト・情報

1. 概要

NANDゲートには機能的完全性があり、NOT/AND/OR/NOR/ExORや、それを利用した複雑な素子もすべてNANDゲートで置き換えることができます。そこで、「CPUの創りかた」(著者:渡波 郁 出版:毎日コミュニケーションズ)に登場するTD4をすべて2入力NANDゲートに置き換えたものをLogisim上で製作してみました。

2. レジスタの置き換え

まずは74HC161を置き換えます。
74HC161は同期式4bitバイナリカウンタですが、イネーブル端子があるため、レジスタとプログラムカウンタの二種類に用いられています。
レジスタは要するに74HC74が4つならんでいるものなので、NANDゲートでD-FFをつくればよいということになります。
TD4はせいぜい10Hzの動作なのでイネーブル端子はクロックとのANDを取るという無茶苦茶な方法で実装します。
74LS74の内部ロジックは次のようになっています。



この3入力NANDを2入力にし、PRE端子を取り払い次のようになります。



これを4つ作り、CLR・CLK端子をまとめて、一つのレジスタとします。
また、キャリーフラグもD-FFであり、PRE端子は常にHであるため、ここで構成したD-FFを用います。

3. マルチプレクサの置き換え

74HC153は4入力マルチプレクサが2素子入っていて、これを2つつかうことで4bitのデータを4つの中から1つ選ぶようにしています。
マルチプレクサは2入力マルチプレクサを3つ構成し、2つの出力をを1つの入力に接続することで4入力マルチプレクサとできます。



しかしながら、TD4ではC3(A=B=Hのとき)がゼロに固定されているため、ここは省略できます。
C3はL固定であるため、C3の接続されているNANDゲートはAの入力にかかわらずHしか出力しません。したがって、次の段のNANDゲートは事実上、C2が接続されているNANDゲートに対するNOTゲートとしてしか機能しません。
よって、下側のマルチプレクサは次のように省略されます。



これを4つ用意することで4入力4bitマルチプレクサとなります。また、A/Bの各端子に接続されているNOTゲートは各1bit分で共有できる(ファンアウトが十分である限り)ため、4bit分にするとで合計6つのNANDゲートが除かれます。

4. フルアダーの置き換え

TD4は演算器として74HC283(4bit全加算器)を用いています。これを置き換えます。
フルアダーは、ハーフアダーを2つで構成され、1つの和の結果をもう1つの入力に接続し、キャリーはORを取ります。
よって、1bitの全加算器は次のようになります。



このCoを上位bitの全加算器のCiに接続することで4bitの全加算器とします。
また、TD4では74HC283のC0はL固定であるため、最下位bitはCiを受ける必要がありません。したがって最下位bitだけはハーフアダー1個とすることができます。ただし、ハーフアダーの時点ではキャリーが負論理であるため、NOTゲートを追加する必要があります。

5. カウンタの置き換え

カウンタはレジスタと同じ74HC161を用いています。
一般的に、カウンタはグリッジを無視すれば、D-FFの/Q端子をDと次段のCLKに数珠つなぎにすることで、非同期カウンタとして簡単に構成できます。
しかし、TD4ではプログラムカウンタとして使うため、同期式ロード機能が必要となります。
よって、同期式かつロード可能なカウンタとします。
同期式カウンタも各bitにD-FFを用意するという点は同じですが、クロックはすべて同じタイミングで入力されます。そしてD端子には、現在のQに対して"+1"された値を入力します。
これだけではただカウントするだけでロードができないため、D端子に直接"+1"した値を入力するのではなく、マルチプレクサを用いてロードするデータと"+1"された値を切り替えられるようにします。
したがってカウンタのブロック図は次のようになります。



2入力マルチプレクサと4bitレジスタはすでにNANDゲートに置き換え済みなので、あとは"+1"する部分を構成すればよいわけです。
この設計にはカルノー図を用います。カルノー図の使用方法は割愛しますが、次のような表となります。

MUX_A0=/A

MUX_A1=(/A AND B) OR (A AND /B)

MUX_A2=(/B AND C) OR (/A AND C) OR (A AND B AND /C)
=(/A OR /B) OR (A AND B AND /C)
=(/(A AND B) AND C) OR ((A AND B) AND /C)

MUX_A3=(/C AND D) OR (/B AND D) OR (/A AND D) OR (/D AND C AND B AND A)
=((/A OR /B OR /C) AND D) OR (A AND B AND C AND /D)
=(/(A AND B AND C) AND D) OR ((A AND B AND C) AND /D)

(/X AND Y) OR (X AND /Y)というのは、ハーフアダーの結果(排他的論理和)を示しています。よって、"+1"をする部分は次のようになります。



これを3.で示したマルチプレクサを応用して構成した4bit2入力マルチプレクサに接続し、マルチプレクサの出力をD-FFのD端子に接続することで、同期ロード付4bitバイナリカウンタとすることができます。

6. 命令デコーダの置き換え

命令デコーダの置き換えは簡単です。各ゲートをNANDゲートの集合体に置き換えます。


7.構成

2.から6.で置き換えた要素をLogisim上で全て接続すると、以下のようになります。


(クリックで拡大)

そのまま置き換えたために、大きく縦にのびてしまい非常に見辛くなってしまいました。(^^;
Logisim上で操作することを考え、ROM/CLOCK/RESET/IN/OUTは一カ所に集合させています。
NANDゲートの総数は、LogisimのStatisticsで表示したところ、382個となりました。(74HC00換算で95個半に相当)

Logisimのcircファイルのダウンロードはこちらから

8.その他の問題

全NANDにしたことによって発生した問題があるため、解決のためにオリジナルのTD4とは仕様を変更した点があります。

TD4はクロックの立ち上がりで「レジスタへのストア」「プログラムカウンタのインクリメント」を同時に行い、命令やデータはROMから直接読み出します。
ゆえに、特にこのようにゲートを冗長に何段も重ねている場合、回路の遅延によって、加算器を通る前にデータ・命令やマルチプレクサの出力が変化してしまうと誤動作の原因となります。
そのため、プログラムカウンタはクロックの立ち下りでインクリメントして、レジスタへのストア中にデータ・命令などが変化しないようにします。

これに伴い、キャリーフラグの扱いも変更しています。
オリジナルのTD4では、命令の種類にかかわらず、クロックの立ち上がりでキャリーが更新されますが、この全NANDTD4では「Aレジスタの更新時」にのみキャリーフラグが変化するようになっています。
条件ジャンプ時に、クロックの立ち上がりでキャリーフラグが更新されると、立ち下がりでのプログラムカウンタのロードが行われる前に、キャリーフラグが降りてしまっているため命令が正常に実行できません。
そのため、Aレジスタの更新時に限ってキャリーフラグが変化するように変更しました。この点は改良の余地があると思われます。

これらの変更により、自動クロックを用いる場合、自動クロックへ切り替えた瞬間に、立ち下りからクロックが入力されてしまうと番地が一つ飛んでしまいます。これを防止するためには、2倍のクロックを生成し、D-FFを用いて分周し、RES端子をリセットボタンに接続します。
これによりリセット時に必ず立ち上がりからクロックを入れることが可能になります。

9.あとがき

TD4はもともとシンプルに設計されているため、非常に置き換えが楽でした。どのような構造を増やすにしても、通常であれば1素子で済むところを大量のNANDゲートにより構成しているため、TD4程度の規模でなければ置き換えは到底不可能のように思われます。
また、同時に遅延の問題が発生するため、そのままではマトモに動かないということもわかりました。仕様変更は本当はしたくなかったのですが自分の技量では仕様変更という手に頼らざるを得ませんでした。
各レジスタのロードイネーブルはクロックとのANDという方法で組んでしまいましたが、本来であればカウンタと同様にマルチプレクサを設けるべきです。

実際に74HC(LS)00を使っての実装は・・・ちょっと勇気が要りますね・・・

10.参考にさせていただいたサイト・情報


上へ
戻る