Tang Nano 1kでも使える小さなCPU第3弾、今回はCDP1802(COSMAC)です。
以前作ったエミュレータがこちら。
http://kwhr0.g2.xrea.com/cosmac.html
のように、Cコンパイラが使えます。
今回もVerilogで書き起こし、エミュレータと同じ動作になるまでデバッグ、までは順調でした。
pico9のときから使っているテスト基板で走らせてみると、正しく表示が出ません。
Cのソースを見返してみても原因が分かりません。
これはGAO(Gowin Analyzer Oscilloscope)の出番だ!
しかし、開発に使っているLinuxマシンではGowin EDAからの書き込みができず、openFPGALoaderを使っています。
GAOを起動しても、ケーブルが見つからないとエラーが出ます。
そりゃそうか。
調べたところ、macOS版だと使えるらしい。
メインマシンにダイレクトに開発環境を入れたくなかったので、
まずUTMを試したところ、仮想化はQEMUではなく、USBパススルーができないことが判明。
それじゃ使えない...
そこで開発用に中古のM2 Mac miniを入手してインストールしました。
これで純正プログラマで書き込めるし、GAOも使えるようになりました。
しかし、認識しないときはUSBを差し直す必要があるのは変わりません。
これは、スイッチ付きUSBハブを介すことでちょっと楽になりました。
で、GAOで観測した結果、I2Cが1バイト送信し終わってデータ受け入れが可能になる前に次のデータを送ろうとしていました。
なんのことはない、readyの判定が間違っていました。
テストベンチを見直すと入力する値が常にreadyになってる...
あとでちゃんと書こうとしてそのまま忘れ、間違いを検出できていなかったのが原因でした。
正しく動くようになったのでサンプルを作ります。
Cコンパイラがfloatを扱えるので、手軽なマンデルブロ。
ただ、使っているディスプレイが128x64ドットのモノクロなのでこれに結果表示は無理がある。
USBシリアルに送るのは味気ない。
デバイスに直結した液晶に表示したいけど、マンデルブロで標準的な80桁x25行を表示できるやつは高い。
そこで、表示に使う'0'〜'F'と' 'の17種類を色の違いで表現すれば小さい液晶で大丈夫と気が付きました。
ということで、160x128のカラー液晶を買いました。
# I2Cのデバッグは結果的に必要なかったことは気にしない
コントローラはST7735だったので、使えるライブラリを探したところ、
https://github.com/cpldcpu/uTFT-ST7735
が良さそうです。
これとエミュレータのときのソースを組み合わせて作りました。
途中、コンパイラがアセンブルできないソースを吐いて困ったりしましたが、回避するコードに書き換えたりして完成しました。
# commandList()の部分です
1802は、各命令を2または3サイクルで実行します(1サイクルは8クロック)。
この実装ではサイクル数は同じですが1サイクル=1クロックになっており、CPIは8倍改善しています。
GW1で40MHzくらいまで動くので、実チップの300MHz以上に相当します。
マンデルブロは6秒くらいでした。
サイズは250Logic未満で済んでいます。
pico9やf6100より小さく、Cコンパイラが使えるのでちょっとした処理に使うのに良さそうです。
https://github.com/kwhr0/f1802
実行中の様子。変な網模様はモアレです。