DE0-Nano : Lチカできる2bitCPU
ほんの出来心でDE0-Nanoをメルカリで買った. FPGA初挑戦. 『CPUの創りかた』を読んだことがあったので, これを参考にとりあえずLチカができる小さなCPUを作ってみた.
開発環境
公式のIDEをいれる. IDEなしで開発する方法があればいずれそちらに移行する.
Quartus Prime Lite
Download Intel® Quartus® Prime Software
DE0-Nanoは Cyclone IV であり, Quartus Prime Liteに対応しているのでこれを使う. 他のStandardとかProとかは有料. 私の環境だとLiteではシミュレーションが使えなかった. 書き込みはできるので実機デバッグがんばる.
Archでは quartus-free-quartus
AUR と quartus-free-devinfo-cyclone
AUR をいれる1.
yay -S quartus-free-quartus quartus-free-devinfo-cyclone libxcrypt-compat
VSCode等
Quartus Primeはエディタ部分が弱いので 焼くとき以外はVSCodeとかで編集すると楽.
プロジェクト作成 / 書き込み
以下のサイトを参考に, いい感じにやる.
Quartus Prime で FPGA/PLD に書き込むまでの流れ - スクラッチ&スクラップ
DE0-Nanoに載っている石は Cyclone IV の EP4CE22F17C6N. あと基板上のLEDのピンなどはユーザーマニュアルにある.
CPU
『CPUの創りかた』を基に, 2bitだけのCPUを作る. 構造などはほとんど同じで, ただ小さくしたようなCPU.
作るCPUの仕様
-
ビット数は 2bit. 命令長も基本は2bit. つまり, ROMは4x4の2B.
-
レジスタは2個 (うち1つを外部I/Oに転用).
-
加算器はレジスタの値に1を足すことができる. 繰り上がったときはCフラグを建てる.
-
他はてきとう.
以下は命令コード表 ( W
はレジスタの値 ).
余裕でハンドアセンブルできる規模.
000a -> add W, a : Wにaを加算しWに保存
0010 -> out W : Wを出力
0011 -> in W : 入力をWに保存
01Im -> out Im : Imを出力
10Im -> jmp Im : Imに飛ぶ
11Im -> jnc Im : Cフラグが建っていないときImに飛ぶ
実装
クロックは基板上に50MHzの水晶が載っているのでそれを分周. ROMは外部に回路を組んでも良かったが, 所詮2Bなので仮想的にモジュールで再現. 命令デコーダ等コアは動くようにお膳立てしてあげた.
動作
実装した命令を 無理やり 使って動かしてみた.
Lチカ
出力の0を1秒おきに反転するだけ.
out 1 ; 0101
add W, 0 ; 0000
out 0 ; 0100
jmp 0 ; 1000
カウントアップ
0~3を順に出力するだけ.
add W, 1 ; 0001
out W ; 0010
jnc 0 ; 1100
jmp 3 ; 1011
エコーバック
入力を出力するだけ.
in W ; 0011
out W ; 0010
jmp 0 ; 1000
add W, 0 ; 0000
2bit は小さすぎるって, なにもできん.