| ホーム | 私の電子工作作品集 |
[ 初公開日:2013年6月17日 ] |
2003 年 9 月に発売された、「CPUの創りかた IC10個のお手軽CPU設計超入門 」(著者:渡波 郁、出版社:毎日コミュニケーションズ) という本で紹介されていた、
"CPUの創りかた TD4" です。(以下、TD4 教科書と呼ぶ)
|
| 回路図 (4bitCPU_TD4.CE3) | ページトップ |
・ クロック回路の抵抗値 TD4 教科書の回路図では、1Hz 用には 33KΩ、10Hz 用には 3.3KΩ の抵抗値が指定されているが、この値では実際には少々遅くなってしまう。 そこで、60 秒間でのクロックの数を、 実際に抵抗値別に数えてみたものが次の表である。 この表から分かるように、33KΩ ではなんと 51/60 = 0.85 Hz となってしまう。 そこで1Hz を得るためには、やはり表から分かるように、28.3KΩ (E24 系列の抵抗値から選ぶと、 33K と 200K とを並列に接続する) を使用した場合に、丁度 60/60 = 1 Hz となった。 なお、10Hz 用には、1Hz 用の 1/10 の抵抗値で、 2.83KΩ (3.3K と 20K とを並列に接続する) を使用した。
・ メモリ(ROM)回路のディップスイッチ TD4 教科書では、ROM 回路での 0/1 のビット指定に 8 bit のディップスイッチを 16 個使用しているが、ここではディップスイッチの使用をやめて、2 x 8 連のピンヘッダと ジャンパーピンを 16 組使用して代理した。 ディップスイッチは、種類にもよるが比較的高価なことと、一番の問題はプリント基板上のスペース的な問題からである。 TD4 教科書ではディップスイッチとダイオードアレイで構成をしているが、ダイオードアレイは特殊で入手がかなり困難なこと。 そのため通常のアキシャルリードタイプのダイオードを 使用せざるを得ないためである。 ・ メモリ(ROM)回路のアドレス指定 TD4 教科書の回路図では、ROM 回路のアドレス指定に、一度に 4 bit がデコードできる 74HC154 を使用しているが、ここでは 3 - 8 デコーダの 74HC138 を2個使用して 同等の回路を得た。 これは単に、私の手持ち IC に、74HC138 がたくさんある … という理由からである。 ・ ALU(全加算器)としての IC ALU として使用する全加算器に、TD4 教科書の回路図では 74HC283 を使用しているが、 ・ アウトポートのブザー回路 アウトポートにつながるブザー回路は、TD4 教科書の回路図では、発振回路内蔵の圧電ブザーと、そのドライバ用 IC に 74HC04 の NOT ゲートすべての6個を使用しているが、 ここでは安価な発振回路なしの圧電ブザーと、74HC00 の NAND ゲート2個を使用して発振回路を作製している(残りの 2/4 個のうち1個は、後に拡張回路で必要になってくる)。 回路図の CR 定数で、約 3.8 KHz を発振している。 ・ LED によるロジック確認回路 LED の基本的な考え方回路は示されてはいるものの、TD4 教科書の回路図には、具体的な使用回路は示されてはいない。 そこで私作の回路では、前項の 回路図 に示す通り、赤 LED を 18 個、緑 LED を 12 個、黄 LED を 20 個の、計 50 個を使用して、各部の信号の有無が一目で確認できるように考慮した。 ・ その他の変更点 メモリの拡張を行って "TD4 改" に変更後、クロック回路、リセット回路について改良を試みた。 詳細は 下記 を参照のこと。 ……… ちなみに "TD4" とは、TD4 教科書(P.136)によると、"とりあえず動作するだけの 4 bit CPU" の意味で名付けたそうだ。……… |
| ページトップ |
プリント基板の正面斜め上から見たところ | プリント基板の右側面斜め上から見たところ |
| ページトップ |
| プリント基板パターン図 (部品面) (4bitCPU_TD4_PC.CE3) | ページトップ |
| プリント基板パターン図 (ハンダ面) (4bitCPU_TD4_PC1.CE3)
| ページトップ |
TD4 では 12 種類の命令が定義されていて、その全命令一覧をここにまとめておきます。 下図の右端に示す SelB, SelA, Ld0, Ld1, Ld2, Ld3
は、オペレーションコードとフラグから作成されるデコード信号を表します。 イミディエイトデータを A レジスタに転送する。 実行時、C フラグの影響を受けない。 実行後、C フラグが 0 になる。 イミディエイトデータを B レジスタに転送する。 実行時、C フラグの影響を受けない。 実行後、C フラグが 0 になる。 B レジスタを A レジスタに転送する。 実行時、C フラグの影響を受けない。 実行後、C フラグが 0 になる。 A レジスタを B レジスタに転送する。 実行時、C フラグの影響を受けない。 実行後、C フラグが 0 になる。 イミディエイトデータを A レジスタに加算する。 実行時、C フラグの影響を受けない。 実行後、キャリー発生時に C フラグが 1 になる。 イミディエイトデータを B レジスタに加算する。 実行時、C フラグの影響を受けない。 実行後、キャリー発生時に C フラグが 1 になる。 入力ポートのデータを A レジスタに転送する。 実行時、C フラグの影響を受けない。 実行後、C フラグが 0 になる。 入力ポートのデータを B レジスタに転送する。 実行時、C フラグの影響を受けない。 実行後、C フラグが 0 になる。 イミディエイトデータを 出力ポートに転送する。 実行時、C フラグの影響を受けない。 実行後、C フラグが 0 になる。 B レジスタを 出力ポートに転送する。 実行時、C フラグの影響を受けない。 実行後、C フラグが 0 になる。 イミディエイトデータで示された番地へジャンプする。 実行時、C フラグの影響を受けない。 実行後、C フラグが 0 になる。 C フラグが 0 のとき、イミディエイトデータで示された番地へジャンプする。 C フラグが 1 のとき、何もしない。 実行時、C フラグにより動作が変化する。 実行後、C フラグが 0 になる。 |
| ページトップ |
以下のプログラムは、TD4 教科書に紹介されていた "LED ちかちか・プログラム" です。
ADDR OBJECT OP ;COMMENT 0000 1011 0011 OUT 0011 ;"0011" を出力ポートへ 0001 1011 0110 OUT 0110 ;"0110" を出力ポートへ 0010 1011 1100 OUT 1100 ;"1100" を出力ポートへ 0011 1011 1000 OUT 1000 ;"1000" を出力ポートへ 0100 1011 1000 OUT 1000 ;"1000" を出力ポートへ 0101 1011 1100 OUT 1100 ;"1100" を出力ポートへ 0110 1011 0110 OUT 0110 ;"0110" を出力ポートへ 0111 1011 0011 OUT 0011 ;"0011" を出力ポートへ 1000 1011 0001 OUT 0001 ;"0001" を出力ポートへ 1001 1111 0000 JMP 0000 ;0 番地へジャンプ(無限ループ)
以下のプログラムは、同じく TD4 教科書に紹介されていた "ラーメンタイマー・プログラム" です。
ADDR OBJECT OP ;COMMENT 0000 1011 0111 OUT 0111 ;LEDを3つ点灯 0001 0000 0001 ADD A,0001 ;Aレジスタを +1して… 0010 1110 0001 JNC 0001 ;キャリーが発生するまでループ(16回ループ) 0011 0000 0001 ADD A,0001 ; 0100 1110 0011 JNC 0011 ;ここも16回ループ 0101 1011 0110 OUT 0110 ;LEDを2つ点灯 0110 0000 0001 ADD A,0001 ; 0111 1110 0110 JNC 0110 ;ここも16回ループ 1000 0000 0001 ADD A,0001 ; 1001 1110 1000 JNC 1000 ;ここも16回ループ 1010 1011 0000 OUT 0000 ;LEDを全部消灯 1011 1011 0100 OUT 0100 ;LEDを1つ点灯 1100 0000 0001 ADD A,0001 ; 1101 1110 1010 JNC 1010 ;ここも16回ループ 1110 1011 1000 OUT 1000 ;終了のLEDを点灯(ブザーを鳴動) 1111 1111 1111 JMP 1111 ;自分自身へジャンプ(無限ループ)
| ページトップ |
"CPUの創りかた TD4" が一応完成はしたものの、16 WORD のメモリというのは、あまりにも酷い。 CPU としての機能が低いのは
仕方がないとしても、16 WORD のメモリというのは、あまりにも少なすぎる。 前々から考えていたのですが、何とかならないものか。 そこで、メモリの拡張を試みることにしました。 といっても回路的にあまり複雑にならない程度に、最小限の改造で済むように心掛けました。 メモリとしては 16 WORD を増量して、倍の 32 WORD 構成とすることにしました。 したがって、プログラムカウンタ(PC)も 1 bit 増やして 5 bit 必要となりますが、 当然ながらこれは避けられません。 またメモリを倍増したことによって、ジャンプ命令での番地の指定についても考えなければなりません。 単純に思いつくのは、番地を指定するためのイミディエイトデータも 1 bit 増やすことです。 しかしこれは正当な方法ですが、現在 8 bit/Word 構成の命令を 9 bit/Word 構成にするということで、ハードウエアを改造するにあたって大変なことになりそうです。 既に完成しているプリント基板上のメモリ部分に、1 bit x 16 Word 分の空きエリアが必要 (実は一応考慮はしてある)ですし、またその増やした bit を処理するための IC や、ダイオード、ジャンパーピン用の端子(ピンヘッダ)等の部品点数も増加することになります。 できればこの方法は避けたいところです。 ジャンプ命令の、番地を指定するためのイミディエイトデータを 4 bit のままで、如何にして 32 WORD のメモリ空間を指定すれば良いのか … 。 前項の TD4 全命令一覧 をよく見てみると、オペレーションコードのうち、 "8", "A", "C", "D" の4つが未定義となっています。 このうちの2つを使用して新たな命令 JMP2, JNC2 を作成すことにしました。 そしてその新しい命令 JMP2, JNC2 を指定した場合には、 イミディエイトデータで示された番地 + 16 番地へジャンプするのです。 そのため JMP2, JNC2 を指定した場合のみ、5番目のビット bit4 = "1" を生成するのです。 ここで新たな命令のためのデコード回路も、極力簡潔で 複雑にならないようにしなければなりません。 既存の命令のオペレーションコードが JMP ("F"), JNC ("E") となっていますので、新しい命令には JMP2 ("D"), JNC2 ("C") を割り付けました。 これはオペレーションコード bit7, bit6, bit5, bit4 のうち、bit5 だけが異なっており、JMP, JNC では bit5 = "1"、JMP2, JNC2 では bit5 = "0" の関係になっています。 したがってデコード回路の簡潔化が期待できます。 プログラムカウンタ(PC)の増分 1 bit の処理用に、現在 74HC74 が半分未使用で余っているため、始めこれを利用しようとも思ったのですが、そのためには 他にゲート IC がかなり必要となりそうなので断念し、単純に新たに 74HC161 を設けて処理することにしました( 1 bit しか使用しないので 3 bit は未使用となる)。 次に、新たに定義追加した2つの命令を示します。 イミディエイトデータで示された番地 + 16 番地へジャンプする。 実行時、C フラグの影響を受けない。 実行後、C フラグが 0 になる。 C フラグが 0 のとき、イミディエイトデータで示された番地 + 16 番地へジャンプする。 C フラグが 1 のとき、何もしない。 実行時、C フラグにより動作が変化する。 実行後、C フラグが 0 になる。 |
| ページトップ |
| 回路図 (4bitCPU_TD4b.CE3) |
クロック回路とリセット回路を、少々変更しました。 クロック回路については、回路そのものについての変更はありませんが、そのクロック数を測定するのに、改造前は LED の点滅を目視で数えていたのですが、
これは大変だったので、外部カウンタ(例:かなり前に作製した "7セグメントLED4桁表示カウンター" 等)を使用して正確に測定ができるようにと、
その信号を取り出すための /CLK 端子を設けました。 また、外部カウンタ等への 電源供給も簡単に行なえるように、プリント基板上に供給用の電源端子も設けておきました。
その後の変更 クロック回路についてなんですが、"TD4 改" の完成後もいろいろなプログラムを走らせていて、どうも気になって仕方がないことがありました。 それは RESET スイッチを押下中にも関わらず、 CLOCK LED が点滅していることです。 これはクロック数を測定していて気が付いたのですが、RESET スイッチを押下中には、やはりクロック出力は停止すべきではないでしょうか … 。 そこで上記 (TD4 改) 回路図 に示すように、余っている NAND ゲートを使って、RESET 信号を条件に加えてクロック出力を取り出すように変更をしました。 その他の回路検討 拡張メモリ用のデコード回路についてですが、上記 (TD4 改) 回路図 では、ブザーの発振回路で使用した残りの 1/4 74HC00 と新規の 74HC04 を使用したために、 配線が少々面倒になってしまいました。 これは次の回路図に示すように新規に 74HC02 を使用すれば、回路図もすっきりするし配線量もその分少なくて済んだのですが、 … 後の祭りでした。 |
| ページトップ |
|
| ページトップ |
以下のプログラムは、拡張メモリを使用した "TD4 改" 用の "3-3-7拍子・プログラム" です。 10 Hz クロックで動作をさせてください。
ADDR OBJECT OP ;COMMENT ;3-3-7拍子 プログラム (クロック: 10 Hz ) ; ; Copyright (c) 2011 by M.Yamamoto ; 00000 0111 1110 J1 MOV B, 16-2 ;3拍子を2回 00001 0011 1101 J2 MOV A, 16-3 ;3拍子 00010 1011 1000 J3 OUT 8 ;これ以降4クロックオン 00011 1011 1100 OUT 8+4 ; 00100 1011 1110 OUT 8+4+2 ; 00101 1011 1111 OUT 8+4+2+1 ; 00110 1011 0000 OUT 0 ;これ以降4クロックオフ 00111 1011 0000 OUT 0 ; 01000 0000 0001 ADD A, 1 ; 01001 1110 0010(00010) JNC J3 ; ; 01010 1011 0000 OUT 0 ;これ以降8クロックオフ 01011 1011 0000 OUT 0 ; 01100 1011 0000 OUT 0 ; 01101 1011 0000 OUT 0 ; 01110 1011 0000 OUT 0 ; 01111 0101 0001 ADD B, 1 ; 10000 1110 0001(00001) JNC J2 ; ; 10001 0011 1001 MOV A, 16-7 ;7拍子 10010 1011 1000 J4 OUT 8 ;これ以降4クロックオン 10011 1011 1100 OUT 8+4 ; 10100 1011 1110 OUT 8+4+2 ; 10101 1011 1111 OUT 8+4+2+1 ; 10110 1011 0000 OUT 0 ;これ以降4クロックオフ 10111 1011 0000 OUT 0 ; 11000 0000 0001 ADD A, 1 ; 11001 1100 0010(10010) JNC2 J4 ; ; 11010 1011 0000 OUT 0 ;これ以降8クロックオフ 11011 1011 0000 OUT 0 ; 11100 1011 0000 OUT 0 ; 11101 1011 0000 OUT 0 ; 11110 1011 0000 OUT 0 ; 11111 1111 0000(00000) JMP J1 ; 上記のプログラムでは、テンポが少々スローだったので、25 % ほど早くした "3-3-7拍子・プログラム(2)" です。 10 Hz クロックで動作をさせてください。 ADDR OBJECT OP ;COMMENT ;3-3-7拍子 プログラム(2) (クロック: 10 Hz ) ; ; Copyright (c) 2011 by M.Yamamoto ; 00000 0111 1110 J1 MOV B, 16-2 ;3拍子を2回 00001 0011 1101 J2 MOV A, 16-3 ;3拍子 00010 1011 1100 J3 OUT 8+4 ;これ以降3クロックオン 00011 1011 1110 OUT 8+4+2 ; 00100 1011 1111 OUT 8+4+2+1 ; 00101 1011 0000 OUT 0 ;これ以降3クロックオフ 00110 0000 0001 ADD A, 1 ; 00111 1110 0010(00010) JNC J3 ; ; 01000 1011 0000 OUT 0 ;これ以降6クロックオフ 01001 0000 0000 NOP(ADD A,0) ; 01010 0000 0000 NOP(ADD A,0) ; 01011 0101 0001 ADD B, 1 ; 01100 1110 0001(00001) JNC J2 ; ; 01101 0011 1001 MOV A, 16-7 ;7拍子 01110 1011 1100 J4 OUT 8+4 ;これ以降3クロックオン 01111 1011 1110 OUT 8+4+2 ; 10000 1011 1111 OUT 8+4+2+1 ; 10001 1011 0000 OUT 0 ;これ以降3クロックオフ 10010 0000 0001 ADD A, 1 ; 10011 1110 1110(01110) JNC J4 ; ; 10100 1011 0000 OUT 0 ;これ以降6クロックオフ 10101 0000 0000 NOP(ADD A,0) ; 10110 0000 0000 NOP(ADD A,0) ; 10111 1111 0000(00000) JMP J1 ; 以下のプログラムは、 上記 の TD4 教科書に紹介されていた "ラーメンタイマー・プログラム" を、"TD4 改" 用に全く新しく作り直したものです。 上記のプログラムでは、メモリが少ないために十分なプログラミングができなく、かなりアバウト(ブザーを鳴動まで 194 クロック = 3 分 14 秒)な時間設定になっていましたが、 このプログラムでは、ぴったり "3分" のタイマーができました。(ちなみに本プログラムでは、181 クロック目と同時に "ブー" の長音が鳴る) ADDR OBJECT OP ;COMMENT ;"3分" ラーメンタイマー プログラム(改) ; ; Copyright (c) 2011 by M.Yamamoto ; 00000 1011 0111 OUT 4+2+1 ;LEDを3つ点灯 00001 0111 1110 MOV B, 16-2 ; 00010 0011 0011 J1 MOV A, 16-13 ; 00011 0000 0001 J2 ADD A, 1 ; 00100 1110 0011 JNC J2 ;2 x 13 = 26 クロック ; 00101 0101 0001 ADD B, 1 ; 00110 1110 0010 JNC J1 ; ; ;ここまで 60 クロック経過 ; 00111 1011 0110 OUT 4+2 ;LEDを2つ点灯 01000 0111 1110 MOV B, 16-2 ; 01001 0011 0011 J3 MOV A, 16-13 ; 01010 0000 0001 J4 ADD A, 1 ; 01011 1110 1010 JNC J4 ;2 x 13 = 26 クロック ; 01100 0101 0001 ADD B, 1 ; 01101 1110 1001 JNC J3 ; ; ;ここまで 60 x 2 = 120 クロック 経過 ; 01110 0011 0011 MOV A, 16-13 ; 01111 1011 0000 J5 OUT 0 ;LEDを全部消灯 10000 1011 0100 OUT 4 ;LEDを1つ点灯 10001 0000 0001 ADD A, 1 ; 10010 1110 1111 JNC J5 ;1 + 4 x 13 = 1 + 52 = 53 クロック ; 10011 1011 0000 OUT 0 ;LEDを全部消灯 10100 1011 1100 OUT 8+4 ;"ブッ" 6 秒前 10101 1011 0000 OUT 0 ;LEDを全部消灯 10110 1011 1100 OUT 8+4 ;"ブッ" 4 秒前 10111 1011 0000 OUT 0 ;LEDを全部消灯 11000 1011 1100 OUT 8+4 ;"ブッ" 2 秒前 11001 1011 0000 OUT 0 ;LEDを全部消灯 ; ;ここまで 60 x 3 = 180 クロック 経過 ; 11010 1011 1000 OUT 8 ;"ブー" 終了のLEDを点灯(ブザーを鳴動) 11011 1101 1011 J6 JMP2 J6 ;自分自身へジャンプ(無限ループ) |
| ページトップ |
使用したプリント基板は、"秋月電子通商" の 155 x 210 mm (通販コード P-04798 ) と、155 x 114 mm (通販コード P-04708 ) サイズのガラスエポキシ片面ユニバーサル基板です。 後者については少々大きかったため、右下の図のようにカットをしました。 |
| 部品配置図 (メイン基板) (4bitCPU_TD4a_PC2.CE3) | ページトップ | |
| 部品配置図 (拡張メモリ基板) (4bitCPU_TD4a2_PC2.CE3) | |
(ヒント) 各LEDをプリント基板に取り付けるにあたって、それらを直に取り付けるのではなく、間にスペーサーを挟んで取り付けています。 専用のスペーサーは高価なので、 私はピンヘッダのピンを抜いた残りの台座部分を、LED数に応じて適度な長さにカットしたものを利用しています。 |
| プリント基板(改)パターン図 (部品面) (4bitCPU_TD4a_PC.CE3) | ページトップ |
| プリント基板(改)パターン図 (ハンダ面) (4bitCPU_TD4a_PC1.CE3) | ページトップ |
| プリント基板(2)パターン図 (部品面) (4bitCPU_TD4a2_PC.CE3) | ページトップ |
| プリント基板(2)パターン図 (ハンダ面) (4bitCPU_TD4a2_PC1.CE3) | ページトップ |
メモリの拡張基板も作り "TD4 改" に機能アップしたのをきっかけに、プリント基板全体をケースへ収納することにしました。
何か適当なものがないかと 100 円ショップをあちこち探した結果、セリア大曽根店でぴったりなケースを見つけました。 "フリーケース A5 L8998 (サナダ精工株式会社)"
というもので、サイズ:幅241 x 奥行167 x 高さ39 mm、材質:ポリプロピレン です。 ぴったりなケースと書きましたが、実は内寸で奥行(下図では横幅)がせめて 1 mm でも大きければ本当にぴったりな物になるのですが … 。 現状では少しばかり無理をして収納しているため、ケースがほんの少し外側に湾曲しています。 そのため蓋をするときに少々無理がかかりますが、 特注ではないし、まあ、OK の範囲内でしょう。
| ケース加工図 (4bitCPU_TD4_CS.CE3) | ページトップ | また、パネル取り付け型ジャックの使用でケース内の下部分に少々の空きスペースができたため、そこに電池ケースを収納してバッテリ駆動も可能なようにしました。 単3電池 x 4本で使用をしますが、電圧が 6V となるため、ダイオードを1本直列に挿入して順方向電圧(約 0.6V)の分だけ降圧をしています。 |
|
(主要部品: IC, トランジスタ等) | (データシート) | ||
HC-MOS IC (Quad. 2-input NAND Gates) | .......... | μPD74HC00C | |
HC-MOS IC (Hex Inverters) | .......... | HD74HC04P | |
HC-MOS IC (Triple 3-input NAND Gates) | .......... | HD74HC10P | |
HC-MOS IC (Hex Schmitt-trigger Inverters) | .......... | HD74HC14P | |
HC-MOS IC (Quad. 2-input OR Gates) | .......... | HD74HC32P | |
HC-MOS IC (Dual D-type Flip-Flops) | .......... | HD74HC74P | |
HC-MOS IC (3-to-8-line Decoder/Demultiplexer) | .......... | μPD74HC138C | |
HC-MOS IC (Dual 4-to-1-line Data Selectors/Multiplexers) | .......... | HD74HC153P | |
HC-MOS IC (Syncronous 4-bit Binary Counter) | .......... | TC74HC161P | |
HC-MOS IC (4-bit Binary Full Adder) | .......... | TC74HC283AP | |
HC-MOS IC (Octal Buffers and Line Drivers (with 3-state outputs)) | .......... | M74HC540P | |
スイッチングダイオード | .......... | 1N4148 | |
赤色LED | .......... | OSDR3133A | |
緑色LED | .......... | OSNG3133A | |
黄色LED | .......... | OSYL3133A |
| 部品表
| Excel ファイル (4bitCPU_TD4_parts.xls)
| ページトップ |
CPUの創りかた(書籍) | .......... | http://www.amazon.co.jp/gp/product/images/4839909865/ref=dp_image_0?ie=UTF8&n=465392&s=books |
CPUの創りかた ファンページ | .......... | http://www.cable-net.ne.jp/user/takahisa/td4/index.html |
CPUを作る TD4への道 | .......... | |
TD4 互換機の製作 | .......... | |
4BitCPU製作 | .......... | http://zairyo.susi.oita-u.ac.jp/kondolab/sige/cpu.htm |
「CPUの創りかた」の作り方 | .......... |