74LS series · 15 packages · 4-bit

TTLで組む4ビットCPU

マイコンもFPGAも使わず、74シリーズのロジックIC 15個だけで組んだ4ビットCPUです。クロックを1発ずつ送りながら、機械語が実行されていく様子を 全ICの全ピンの 1 / 0 で追えます。

0CLOCKS
0PC
01OPCODE
SPEED 3.5 Hz
CLK0
A0000
B0000
OUT0000
C0
01

基板

左上のクロック発振器から時計回りに信号が流れます。ピンの外側の小さな枠がその端子の論理レベルで、橙が HIGH(1)、灰が LOW(0)。太い線は4本以上をまとめたバス、細い線は1本の制御信号です。線やピンにカーソルを合わせると同じネットだけが光ります。ICをクリックすると下に全ピンの一覧が出ます。

100% 横にスクロールできます
HIGH = 1 LOW = 0 バス(複数ビット) クロック/リセット(破線) ▽ = GND △ = VCC(+5V)
IC1 · 74LS161 Aレジスタ 全16ピン
PINNAMENETLEVEL役割
02

プログラム(ROM)と入出力

ROMは16番地×8ビットのダイオードマトリクスです。ビットをクリックするとその場でスイッチが入れ替わり、次のクロックから新しい命令が読まれます。上位4ビットが命令、下位4ビットが即値です。

PRESET
IN 3210
OUT 3210
番地命令部   即値部16進ニーモニック
実行トレース新しい順
03

1クロックで何が起きているか

このCPUは1命令=1クロックです。フェッチもデコードも実行も、クロックの立ち上がりまでの間に組み合わせ回路が同時に済ませてしまい、立ち上がりの瞬間に4つのレジスタが一斉に書き換わります。だから命令サイクルという概念がありません。

プログラムカウンタの値がROMの番地を選び、読み出した8ビットが「どのレジスタに書くか」と「何を足すか」を同時に決める。加算器の出力は4つのレジスタすべてに配られていて、書き込み許可をもらった1つだけが取り込む。
04

命令表

命令は16通り。Im は命令の下位4ビットです。この命令セットは『CPUの創りかた』のTD4と互換で、同書のプログラムがそのまま動きます。

上の表の 拡張 は、TD4では未定義だった符号がこの回路のデコーダでは自然に意味を持ってしまうものです。デコーダを簡単な論理式で組んだ副作用で、隠し命令が4つ生えています。

05

デコーダの論理式

命令デコーダはICを4個しか使いません。命令の4ビット Op3..Op0 から、書き込み先の選択とセレクタの選択が下の式だけで出てきます。

書き込み先(IC10 74LS139)

/LD_A   = /(¬Op3 · ¬Op2)
/LD_B   = /(¬Op3 ·  Op2)
/LD_OUT = /( Op3 · ¬Op2)
/J      = /( Op3 ·  Op2)

2-to-4デコーダ1個そのもの。Op3とOp2の2ビットで、A・B・OUT・PCのどれに書くかが決まります。

加算器に入れる値(IC11 04 / IC12 32 / IC13 00)

J      = ¬(/J)
SELA   = Op0 + J
SELB   = Op1 + J
COND   = Op0 + ¬C
/LD_PC = /(J · COND)

セレクタは (SELB,SELA) で A / B / IN / 0 を選びます。ジャンプ命令のときだけ強制的に 0 を選ばせるために J を足しているのがミソです。

JNCがキャリーを読めるのはなぜか。 キャリーフラグ(IC14 74LS74)は毎クロック加算器の桁上げを取り込むので、JNC自身も実行時にCを0にしてしまいます。しかしDフリップフロップの出力が変わるのはクロックの立ち上がりの瞬間で、その手前でロード条件を決める組み合わせ回路が読むのは直前の命令が残したCです。だからJNCは必ずADDの直後に置きます。

06

部品表

ロジックICは15個。ほかに抵抗・コンデンサ・LED・ダイオード・スイッチだけで、能動素子はTTLのみです。