教育用の最小CPU。命令は READ と WRITE の2つだけ。 計算・ジャンプ・入出力はすべて「決まったアドレスへの読み書き」で行う(Transport-Triggered Architecture)。
| 項目 | 決定 |
|---|---|
| ボード | Sipeed Tang Nano 20K (GW2AR-18) |
| HDL | Verilog(小中学生が読んで分かりやすいため。VHDL から変更) |
| 土台 | Gemini 相談の最初の案(7bit アドレス、READ/WRITE のみ)。拡張版(64KB 間接アクセス、ISA_VERSION、HDMI デバッガ、CPU 上の TinyBASIC)は v1 では採用しない |
| 追加 | IMM(即値)、ALU_SUB(引き算)、JZ は絶対番地ジャンプ |
| 名前 | 計算用の箱は ALU_A / ALU_B、変数は $A〜$Z・$0〜$5 |
| 言語 | TinyBASIC改。PC(ブラウザ)上でコンパイルして機械語にする |
| デバッガ | ブラウザ版:ブロック図+値表示、ソース/アセンブラ対比、ステップ実行、ボード模擬表示 |
7 6 0
+---+-------------------+
|R/W| アドレス (7bit) |
+---+-------------------+
0 = READ addr : V ← [addr]
1 = WRITE addr : [addr] ← V
READ IMM だけは2バイト命令:次の1バイトを V に入れ、PC は +2。| アドレス | 名前 | READ | WRITE |
|---|---|---|---|
| 0x00 | ALU_A | ALU_A | ALU_A ← V |
| 0x01 | ALU_B | ALU_B | ALU_B ← V |
| 0x02 | ALU_ADD | ALU_A + ALU_B | — |
| 0x03 | ALU_NAND | ~(ALU_A & ALU_B) | — |
| 0x04 | ALU_SUB | ALU_A − ALU_B | — |
| 0x10 | JMP | — | PC ← V |
| 0x11 | JZ | — | ALU_A == 0 なら PC ← V |
| 0x12 | IMM | ROM[PC+1](読んだあとPCは+2) | — |
| 0x20–0x39 | $A〜$Z | 変数 | 変数 |
| 0x3A–0x3F | $0〜$5 | 変数 | 変数 |
| 0x7E | IN | bit0 = S1, bit1 = S2(押すと1) | — |
| 0x7F | OUT | — | bit0–5 = LED(1で点灯、bit0 が右端) |
その他のアドレスは READ で 0、WRITE は無視。プログラム ROM は 256 バイト(別空間)。
ALU とは? Arithmetic Logic Unit(算術論理演算装置)のことで、CPU の中心で計算・演算を行う部分です。 ALU_A と ALU_B に数を入れると、ALU_ADD(たし算)・ALU_SUB(ひき算)・ALU_NAND の答えがすぐに読み出せます。
変数は $A〜$Z と $0〜$5 のちょうど32個で、RAM 32バイトと1対1に対応する。
アセンブラでも TinyBASIC改 でも同じ名前を使う。
ADD・SUB・NANDに、RAMとJZ/JMPを組み合わせて計算手順を作る。 乗算・除算・論理演算の具体例は 発展1 を参照。 実装は8bit演算、32バイトのRAM、256バイトのプログラムROMを持つ。 容量やデータ幅を増やす案は 発展2 で扱うが、現行ISAには未実装。
リセットはクロック同期で、stepより優先する。PC・V・ALU_A・ALU_B・LEDとRAM全32バイトを0にする。 エミュレータも同じ初期値とし、再リセット時にもRAMを消去する。
| 信号 | ピン | 備考 |
|---|---|---|
| clk 27MHz | 4 | |
| S1 / S2 | 88 / 87 | 押すと 1(実機で確認済み、BTN_ACTIVE_LOW = 0)。「TANG NANO 20K」が読める向きで S2 が左上、S1 が左下 |
| LED bit0–5 | 20–15 | 0 で点灯(トップで反転)。USB を左に置いて bit0 = 右はし(基板印字 LED5)… bit5 = 左はし(印字 LED0)。cst で並びを逆にしている |
CPU_HZ)。0.5秒 ≒ 500 命令。READ R / WRITE JMP で戻る。| ボタン | 模様(0.5秒ごと) |
|---|---|
| なし | _____○ / ______ |
| S1 | _____○ → ____○_ → … → ○_____ |
| S2 | ○____○ → _○__○_ → __○○__ |
| S1+S2 | ○_○_○_ / _○_○_○ |
ボタンは押している間だけ有効で、約0.5秒ごとに確認する。iverilog シミュレーションで全モードの動作を確認済み。
文法は docs/tinybasic.md。PC 上のコンパイラ(tools/tbasic.js)で TTA-8 のアセンブリに翻訳する。
$A〜$Z、$0〜$5/式 + - AND OR NAND/IF = / <> THEN/GOTO GOSUB RETURN/OUT POKE PEEK IN/WAIT n(n × 0.01秒)/END REMhdl/ tta8.v (CPU), top_tangnano20k.v, tangnano20k.cst, minimal_cpu.fs (ビットストリーム)
FPGA_Tool/ Windows/ (openFPGALoader, Zadig, 0〜3_*.bat), Mac/ (0〜3_*.sh), README.md
tools/ tta8asm.js (アセンブラ), tbasic.js (BASIC コンパイラ), tta8sim.js (エミュレータ), test.js
programs/ flasher.asm, add.asm, count.asm / basic/ に .bas
debugger/ index.html (ブラウザ版デバッガ「TTA-8 ラボ」、「ボード用に保存」で program.hex を出力), src/lab.html, build.py
sim/ tb_flasher.v (iverilog)
docs/ architecture.md, tinybasic.md, guide/ (せつめい書 md + index.html + PDF), video/ (動画3本の台本・絵コンテ・素材 mp4)
tools/build_guide.py せつめい書の Web / PDF をビルド
tools/video/ 動画素材アニメ (anim.html, render.py)
README.md GitHub トップ
hdl/minimal_cpu.fs を生成、書き込みは FPGA_Tool/(openFPGALoader、Windows は Zadig で WinUSB 化)-f)とも成功。電源を入れ直しても なし/S1/S2/S1+S2 の全モードが動作$readmemh("program.hex") のパスが通るか → 実機ビルドで確認RAM全32バイトの同期リセットを追加。CPU本体はコメント・空行を除き53行。 同梱フラッシャーのビットストリームを再生成し、27MHzのタイミング制約で配置配線を確認。 今回の版の実機書き込みは未実施。検証方法と結果は verification.md を参照。