TD4とは
かの名著「CPUの創りかた」という書籍に載っている学習用の4bitCPUです。
回路図も掲載されているので、自作することができます。
新宿の紀伊國屋書店へ行ったら平積みしてました。発売日は2003年で19年ほど前ですが、今でも売れ続けているのでしょう。
今回、自作するにあたり、PCBの設計から行いました。
なぜ自作したのか
平積みしているぐらいロングセラーな本に載っているCPUは、もちろん他に多くの人が制作を行いその工程や回路図等をインターネットで公開されています。PCBを作成し部品とセットで販売している方もいます。
では、既製品を使用せず、なぜ自作したのか。
作りたかったからである。
今回制作するCPUは学習用であり、完成しても生活が豊かになったり便利になったりするものではありません。回路・PCB設計から制作・完成までを楽しむのが目的です。ついでに、クロック周波数を高くしても動くのか(オーバークロック)実験を行いました。
(知識が増えることで生活が豊かになるかもですが)
shigobu版TD4の特徴
shigobu版だけの特徴(私の知る限り)
- 小型(スルーホール部品のみにしては)
- 外部クロック入力端子
- 入力部分のDIPスイッチを無くし、ピンヘッダで引き出す
- 入力ピンと出力ピンのそれぞれに電源(VCC・グランド)ピンを追加し、6ピンに変更
その他の特徴
- 実行中メモリ位置確認用LED
- 74HC154を入手しやすい74HC138×2へ置き換え
小型
今回は、PCBから設計するので、ギチギチに部品を詰めてなるべく小さくなるようにしました。配線を自分でする必要が無いので、詰められる隙間はできるだけ詰めました。省略できる部品は省略しました。そのおかげか、縦 145mm×横 130mmに収める事ができました。
表面実装部品を使えば更に小さくできますが、表面実装部品ははんだ付けしたことが無いのと、部品点数が多くリフロー装置も無いし手ハンダも無理だろうと思い、全てスルーホール部品を使いました。PCB設計はKiCadを使用しました。
LEDも最小限にしました。
もとの回路図に無いLEDとしては、実行中メモリ位置確認用LEDをメモリであるDIPスイッチの横に設置しました。選択中のクロックソースを示すLEDも搭載しました。これは、4つある内の1つしか点灯しないので、1つの抵抗につないでいます。
外部クロック入力端子
オーバークロック実験用に、外部クロック入力端子を搭載しました。オーバークロック実験は、今回の「ついで」の目的でもあるので必須です。端子は3ピンで、クロックソースへ電源供給もできるようにしました。
クロックソースを「内部・手動・外部」から選択することになるので、切り替えをロータリースイッチにしました。使用したロータリースイッチが2回路4接点だったので、1回路を選択中のクロックソースを示すLEDに使用しました。
入出力ピン
入出力にはピンヘッダを取り付け、他基板と連携できるようにしました。また、他基板へ電源を供給できるように、それぞれのピンにVCC・グランドピンを追加し、6ピンとしました。
このようにすることで、柔軟に他基板と連携ができるようになりました。
実行中メモリ位置確認用LED
これは、他の方のTD4でもよく見られるLEDです。メモリであるDIPスイッチの横に設置し、実行中メモリ位置を確認できるようにしてるやつです。このLEDは16個ある内の1個しか点灯しないので、部品点数削減のため全てまとめて1個の抵抗につないでいます。
74HC154を入手しやすい74HC138×2へ置き換え
現在、74HC154はとても入手しづらいです。入手できたとしても、600mil幅であったり、価格が高かったりします。他の人の記事を参考に、74HC138を2個使用する回路へ置き換えました。74HC138は秋月電子で購入できて値段は1個30円です。
オーバークロック実験
元の回路では最大10Hz動作ですが、外部クロック入力端子を搭載したので、任意の速度で動作させることができます。これを使用して、オーバークロック実験を行います。
実験方法
早押しボタンプログラムを作成し、ボタンを押したときに正常に動作するかどうかを確認します。早押しボタンは、動作速度が早ければ早いほど良いので、限界までクロック周波数を高くします。
クロックソースには、秋月電子の「マルチ周波数オシレータキット(通販コード K-06436)」をとりあえず使いました。これは、1Hz/10Hz/100Hz/1kHz/10kHz/100kHzの矩形波を出力することができます。100kHz以上は、また別の機会に実験することにします。
早押しボタンのプログラム
早押しボタン
アドレス 命令 コメント 0000 IN B 入力端子の状態をBレジスタへ転送 0001 MOV A,B BレジスタをAレジスタへ転送 0010 ADD A,1111 Aレジスタへ1111を加算 0011 JNC 0000 Cフラグが1ではないときに、0へジャンプ 0100 OUT B Bレジスタの内容を出力 0101 JMP 0101 無限ループ、停止
左の番号はアドレスです。
まず、Bレジスタへ入力端子の状態を取り込みます。入力端子には、プルダウンした押しボタンスイッチを接続するので、ボタンを押すと1が入力されます。次に、BレジスタをAレジスタへ転送(コピー)します。転送したAレジスタへ1111(2進数)を加算します。Aレジスタが0以外の場合(入力が有る場合)キャリーが発生するので、入力があったかどうかの判定ができます。キャリーフラグが無い(入力が無い)場合は、アドレス0へ戻り、入力取り込みへ戻ります。キャリーフラグが有る場合は、Bレジスタの内容を出力し終了します。
実際には「MOV A,B」と「ADD A,1111」は同時に実行できます。TD4の転送には必ずALUを経由するので、「MOV A,B」はイミディエイトデータとBレジスタを加算した上で、Aレジスタへ転送されます。書籍では、イミディエイトデータを0000とすることで転送命令としています。
この裏技を使用し、実際には以下のようなプログラムになります。Address 01で「MOV A,B」と「ADD A,1111」を同時に実行しています。
早押しボタンの回路
各入力ピンにプルダウンしたボタンをつなげます。
各出力ピンにはLEDをつなげ、どのボタンが押されたかを表示します。
TD4のIN端子を早押し回路のOUTへ、TD4のOUT端子を早押し回路のINへ接続します。
結果
周波数 | 結果 |
---|---|
100Hz | 正常 |
1kHz | 正常 |
10kHz | 正常 |
100kHz | 正常 |
100kHzまでは、正常に動作してるようです。
書籍には、おまけとして最大動作周波数について書かれているコーナーがあります。そこには、TD4の最大動作周波数は「3MHz程度と考えられる」と書いてあります。100kHz動作は余裕っぽいですね。
ということで次回、1MHz以上のパルスを出せるオシレーターを使用し実験をしようと思います。
全体回路図データ等
回路図は、以下のリンクからダウンロードできます。
部品表も含まれています。
https://1drv.ms/u/s!AiMx-zBfSCjCnXDn1ujUwE1N9B9p?e=pBEmsE
次回
投稿者の人気記事
-
shigobu
さんが
2022/01/15
に
編集
をしました。
(メッセージ: 初版)
-
shigobu
さんが
2022/02/02
に
編集
をしました。
-
shigobu
さんが
2022/05/17
に
編集
をしました。
ログインしてコメントを投稿する