トランジスターCPU、NAND6TRの全回路図
2015年6月21日
半導体としてトランジスターのみを使ったCPUを作成中。NAND6TRと名付けている。写真は、クロック作成部まで完成したところ。
NAND6TRは、RISCアーキテクチャのCPUで、演算がNANDと左シフトだけであるのが特徴。レジスターは6ビットの物が4つ。命令は2ワード固定(12ビット)で、以下の通り。
アドレスラインは9ビット(512 ワード)であるが、RAMとして使えるのは、最後の64ワードのみ。4つのレジスターのうち、1つ(R0)は、RISCにありがちな特殊な物。NOP命令を実行するとR0=111111となり、この値を維持しなければならない。
トランジスターとしては、MOSFET-Nの、2N7000を用い、基本的に10 kΩでプルアップしてある。現在の設計では、使用トランジスターは651個で、インテル4004と比べても3分の1以下の数。
回路図の作成には、Quartus II 9.0 SP2を使用。以下に、このCPUの全回路図を示す。PDFファイルは、こちら。
まずは、全体像(クリックで拡大表示)。クロック処理部、プログラムカウンター、命令処理部、一時レジスター及び演算部、外部アクセスアドレス作成部からなる。
以下は、NMOSで作成したラッチ。
Dタイプのフリップフロップ。
カウンターを構成するための、Tタイプフリップフロップ。キャリーアウト、ロード機能付き。
クロック処理部。この記事最初の写真では、この部分の回路が完成している。
クロック処理部のシミュレーション結果は以下のようになる。実機でも、予想通りの動作であることを確認した。
発振器からのシグナルを12分周して、6つのステップに分けて処理している。それぞれのステップにおける動作は、次のように設計した。
ただし、mn:ニーモニック、op:オペランド、r1:一時レジスター1、
r2:一時レジスター2、res:結果。
プログラムカウンター。上記のTタイプフリップフロップを8つ繋げて実装してある。なお、アドレスラインは9ビットだが、最下位ビットにはカウンターは不要で、STP0かSTP2かを判断して出力している。
外部アクセスアドレス作成部。アドレスラインは別途、プルアップされていることに注意。
命令処理部。ニーモニック及びオペランドを記憶する回路。
一時レジスター及び演算部。ここでの一時レジスターは、ラッチを用いて形成されている。左上、12個のNMOSにより6つのNAND回路を形成している部分が、いわゆるALUに相当する部分で、NAND6 CPUではNAND演算だけである。その少し右あたりは、データーが1ビットずつずれて処理されており、左シフトに相当する。
メモリー読み出しシグナルを作成するための簡単な回路。なお、メモリー書き込みシグナルは、クロック処理部から出力される"/L5"と、同一である。
データーライン及びアドレスラインのプルアップ回路。実機では、10 kΩでプルアップしておくだけでよいのだが、Quartus IIでのシミュレーションではその様な回路が組めないので、代替のものである。
NAND6TRは、RISCアーキテクチャのCPUで、演算がNANDと左シフトだけであるのが特徴。レジスターは6ビットの物が4つ。命令は2ワード固定(12ビット)で、以下の通り。
00ddyy iiiiii: (yy)とiiiiiiiiのNAND値を(dd)に代入 01xxyy yyyyyy: (xx)を左シフトし(MLBは1)、キャリーがあればyyyyyyyy0にジャンプ 10ddyy zzzzzz: (yy)と(zzzzzz)のNAND値を(dd)に代入 11xxyy dddddd: (xx)と(yy)のNAND値を(dddddd)に代入
アドレスラインは9ビット(512 ワード)であるが、RAMとして使えるのは、最後の64ワードのみ。4つのレジスターのうち、1つ(R0)は、RISCにありがちな特殊な物。NOP命令を実行するとR0=111111となり、この値を維持しなければならない。
トランジスターとしては、MOSFET-Nの、2N7000を用い、基本的に10 kΩでプルアップしてある。現在の設計では、使用トランジスターは651個で、インテル4004と比べても3分の1以下の数。
回路図の作成には、Quartus II 9.0 SP2を使用。以下に、このCPUの全回路図を示す。PDFファイルは、こちら。
まずは、全体像(クリックで拡大表示)。クロック処理部、プログラムカウンター、命令処理部、一時レジスター及び演算部、外部アクセスアドレス作成部からなる。
以下は、NMOSで作成したラッチ。
Dタイプのフリップフロップ。
カウンターを構成するための、Tタイプフリップフロップ。キャリーアウト、ロード機能付き。
クロック処理部。この記事最初の写真では、この部分の回路が完成している。
クロック処理部のシミュレーション結果は以下のようになる。実機でも、予想通りの動作であることを確認した。
発振器からのシグナルを12分周して、6つのステップに分けて処理している。それぞれのステップにおける動作は、次のように設計した。
step # | STP0 | STP1 | STP2 | STP3 | STP4 | STP5 |
---|---|---|---|---|---|---|
data line | mn | r2 | op | (op) | r1 | res |
address line | pc | 1111111yy | pc | 111op | 1111111xx | 1111111xx or 111op |
fetch mn | fetch r2 | nand to r1 | res to Rxx | |||
fetch mn | fetch r2 | fetch op | shifted to r1 | res to Rxx | ||
fetch mn | fetch r2 | fetch op | nand to r1 | res to Rxx | ||
fetch mn | fetch r2 | fetch op | nand to r1 | res to (op) |
プログラムカウンター。上記のTタイプフリップフロップを8つ繋げて実装してある。なお、アドレスラインは9ビットだが、最下位ビットにはカウンターは不要で、STP0かSTP2かを判断して出力している。
外部アクセスアドレス作成部。アドレスラインは別途、プルアップされていることに注意。
命令処理部。ニーモニック及びオペランドを記憶する回路。
一時レジスター及び演算部。ここでの一時レジスターは、ラッチを用いて形成されている。左上、12個のNMOSにより6つのNAND回路を形成している部分が、いわゆるALUに相当する部分で、NAND6 CPUではNAND演算だけである。その少し右あたりは、データーが1ビットずつずれて処理されており、左シフトに相当する。
メモリー読み出しシグナルを作成するための簡単な回路。なお、メモリー書き込みシグナルは、クロック処理部から出力される"/L5"と、同一である。
データーライン及びアドレスラインのプルアップ回路。実機では、10 kΩでプルアップしておくだけでよいのだが、Quartus IIでのシミュレーションではその様な回路が組めないので、代替のものである。