ほんの出来心で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 $^\mathsf{AUR}$ と quartus-free-devinfo-cyclone $^\mathsf{AUR}$ をいれる1.

yay -S quartus-free-quartus quartus-free-devinfo-cyclone libxcrypt-compat

VSCode等

Quartus Primeはエディタ部分が弱いので 焼くとき以外はVSCodeとかで編集すると楽.

プロジェクト作成 / 書き込み

以下のサイトを参考に, いい感じにやる.

Quartus Prime で FPGA/PLD に書き込むまでの流れ - スクラッチ&スクラップ

DE0-Nanoに載っている石は Cyclone IVEP4CE22F17C6N. あと基板上の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に飛ぶ

実装

xiupos/2bitcpu

クロックは基板上に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 は小さすぎるって, なにもできん.


  1. Intel Quartus Prime - ArchWiki ↩︎