2023年7月8日土曜日

自作CPUで遊ぶ

前回まででスコア表示機能の追加が出来た。iCE40LMボードやブロック崩しゲームで次にやってみたいことや作ってみたいことが色々と頭に浮かんでいるのだが、このテーマは一旦お休みして次は自作CPUで遊んで見ることにした。

11年位前にこのブログで32bit CPU(zumi32)を開発した。このCPUはハーバード・アーキテクチャのRISC型32bit CPUで、パイプライン数は3段だ。割り込みや例外にも対応している。レジスタは17個ありR0は値0の固定値、R15はPC(プログラムカウンタ)、R1からR14は汎用レジスタだ。この他に割り込みや例外発生時の戻り番地を格納するEPCレジスタも持っている。フラグはキャリーフラグとゼロフラグを持っている。命令実行のスループットは、load/store/swapを除いて1命令/1cycleで実行する。分岐時は最小でも2サイクルパイプラインがストールする。また、分岐は遅延分岐になる。乗除算命令は持っていないが、その代わりにシフト命令(バレルシフタ)を持たせた。プログラム開発は、CPU開発時に簡易アセンブラも作って当初はそれでプログラムを作成していた。その後、C言語でもプログラミング出来るようにしたくなったのだが、独自の命令セットにしたので既存CPU用のGCCを流用することが出来ずにgcc-4.5.2をzumi32用にポーティングした。GCCの資料が難解でこれには1〜2年ぐらいかかった。
当時はzumi32をインプリしたデザインをSpartan3E、Spartan6、Cyclone IIIに実装して動かした。 割り込みも使えるのでファグラウンドでマンデルブロート集合を描画し、タイマ割り込みでを使ってその中に周期的に文字列を描画させたりしていた。マンデルブロート集合の計算は固定小数で計算した。
zumi32はSYSCALL(ソフトウェア例外)命令も実装したので、次にリアルタイムモニタ(FreeRTOS)を実装してみた。マンデルブロート集合を描画するタスクと、FPGAボードのLEDを点滅させるタスクの2つのタスクを動かし、フォアグラウンドのIdleタスクでは別のLEDを点滅させた。この実装でzumi32の遅延割り込みのバグが見つかったが無事修正できた。
・・・と、長々と説明してきたが、今度はこのCPUで何か作って動かしてみたいと考えている。




0 件のコメント:

コメントを投稿

ERROR: Failed to spawn fakeroot worker to run ...

なにかと忙しくてなかなか趣味の時間を確保できない。 ...orz  家の開発機のOSはLinux Mintなのだが、最近バージョンを22に更新したところ、myCNC用のpetalinuxをビルドできなくなってしまった。ビルドの途中で ERROR: Failed to spawn ...