MIPS/kを書いてみて、ふとMIPSとPICは用途は大幅に違うけどけっこう似たところがあるんじゃないかと思うようになりました。
例えば、
(1) インストラクションが固定長
(2) 1つのインストラクションで扱うデータが固定長
(3) インストラクション数が少ない
両方ともRISCだからあたりまえといえばあたりまえです。
似ているということは、MIPS/kのソースをちょっと書き換えればPICになるんじゃないかと思いました。しかも、元がMIPSなのでパイプライン化したPICです。
ということで、書き換えてみます。
MIPSのときと同じように、レジスタが入るところを考えると、
(1) プログラムカウンタ
(2) インストラクション用のブロックRAM
(3) レジスタファイル用の分散RAM(読み出し)
(4) レジスタファイル用の分散RAM(書き込み)
となります。
PICはレジスタとデータメモリの区別がない(全部レジスタと見ることもできるし、Wレジスタ以外は全てデータメモリと見ることもできる)ので、上記のように4段になります。
実チップが4クロック/サイクルなのと符合します。
今回は、14ビットインストラクションのコアを作ります。割り込みと、CLRWDT,SLEEPは実装しません。I/OはGPIOを1ポート作ります。
アセンブラは、Microchip純正のMPLABを使います。
まずiverilogでシミュレーションして、その後MIPS/kと同じようにFPGAでN-Queensが動くところまで作りました。
結果、やっぱりPICとMIPSはけっこう似ていることが分かりました。
PICも、どうすればシンプルになるかを追求して作られたアーキテクチャだと感じました。MIPSはクリティカルパスを短くするためにシンプルに、PICは回路を減らすためにシンプルにという感じです。
数年前にPICを初めて扱ったときは変なインストラクションセットだと思ったのですが、回路を作ったあとにもう一度見返してみると整理された綺麗なインストラクションセットに見えてくるから不思議です。
まだちゃんとしたデバッグはしていませんが、規模が小さいので容易だと思われます。パイプライン化したため1クロック/サイクルで走るので、例えば50MHzで動かせば実チップの200MHzに相当します。結構使えるかもしれません。
テトリスを走らせてみる
何年か前に、PICだけでビデオ信号とサウンドを作ったテトリスが話題になりました。
Webで探すと、Rickard Gunee氏のPIC-TetrisがあったのでPIC/kコアのデバッグを兼ねて乗せてみました。
せっかくソフトウェアだけでやっているものをFPGAに乗せるのは本末転倒というか何というか...
まあ、コアの検証ということで。
一応、走ることは走ったのですが、ちょっと水平方向に乱れています。
すべての命令は実チップの4倍速で走るのですが、例外としてPCLレジスタにロードするときだけ1クロック余分にかかります。
これはパイプラインのペナルティで、避けがたいのでこのまま仕様にします。
その他の分岐を伴う命令でも同様にペナルティがあるのですが、実チップでもなぜか1サイクル余分にかかるので差は出ません。
ISEWebpack8.1.01i,XC3S200-4,エリア優先で使用スライスは215でした。あと、プログラムメモリ用とEEPROM用にブロックRAMを2つ使います(データメモリは分散RAM)。
また、最小周期は25nS(40MHz)でした。今回は3MHzで走らせているので、能力的には10倍以上余裕があります。
download(version0.2)
上記ファイルを展開して、PIC-TetrisからNTSCTETR.HEXを落としてきてmakeすると、スパルタン3スターターキット用テトリスができます。
このソースは、非営利目的に限り自由に使用できます。
なお、いっさいの保証やサポートはありません。
割り込み追加&Xilinx専用に
割り込み入力を1本付けました。
また、KX_MIPSと同様、プリミティブライブラリを使用したためXilinx専用になりました。名前はKX_PICとしました。
あと、前のバージョンではPCLレジスタにロードするとき1クロック余分にかかっていましたが、PCをフォワードすることによりこれを解消し、全ての実行速度は実チップの4倍となりました。
OPENCORESにあるrisc16f84_clk2xとサイズ、速度を比較してみました。
インストラクションメモリ、レジスタファイル、I/Oポートを含まない、コアのみの比較です。
ISE9.2.01i(webpack)のエリア優先で、デバイスはXC3S50-4TQ144としました。
KX_PIC | 126スライス |
risc16f84 | 326スライス |
risc16f84 | 15.462nS |
KX_PIC | 17.206nS |
速度はちょっと劣りますが、risc16f84_clk2xは2クロック/インストラクション、KX_PICは1クロック/インストラクションであり、実行速度で見れば有利です。
download(version0.3)
このソースは、非営利目的に限り自由に使用できます。
なお、いっさいの保証やサポートはありません。