PICを書いたら、やっぱり次はAVRかなぁ。
ということで、AVRを書きます。
なんだか、「山があるから登る」状態になってます。

AVRは、AtmelはRISCだと言っていますが、けっこうCISC的なところがあります。
MIPSとPICの共通点として、

(1) インストラクションが固定長
(2) ALUのビット数を超えるデータを扱わない
(3) インストラクション数が少ない

がありますが、AVRではどれも成立していません。
なので、PICのようにMIPSをちょっと書き換えて出来上がりという訳にはいきません。
それでも、次はAVRかなぁ、と思ってしまったので書いてみます。

とりあえず、ATtiny系を作ります。割り込みは省略します。
また、インストラクションセットのうち、以下のものを省略します。

RETI,BRIE,BRID,SEI,CLI,SPM,SLEEP,WDR,BREAK

PICと同じように4段パイプラインにしますが、フォワードのロジックがちょっと複雑です。
ポインタ(x,y,z,sp)とステータスレジスタのフォワードが全て別々に必要になります。
気をつけないと、組み合わせ回路だけでループしているとXSTに怒られることもありました。

アセンブラはAtmel純正のAVR Studioを使います。
MIPS/k,PIC/kと同様にFPGAでN-Queensが動くところまで作りました。
このコアは、ロード/ストアが速く(1クロック)、AVR Studioによるシミュレーションに比べてN-Queensで14%ほどCPIが改善されています。
規模はavr_k_coreだけで500スライス以下なので、これに書き足していけば公開されているどのAVRコアより小さいものができるかもしれません。

download

MEGA化

ATmega化しました。割り込みも追加しました。
プログラムメモリ、データメモリのアドレシング能力は64kバイトで、EIJMP,EICALL,ELPM命令はありません。
その他、SPM,SLEEP,WDR,BREAKを省略しています。
プリミティブライブラリを使ったためXilinx専用になりました。名前はKX_AVRとしました。

OPENCORESにあるAVR Coreとサイズ、速度を比較してみました。
インストラクションメモリ、データメモリ、I/Oポートを含まない、コアのみの比較です。
ISE9.2.03i(webpack)のエリア優先で、デバイスはXC3S200-4FT256としました。

KX_AVR  452スライス+1MULT
AVR Core  955スライス

KX_AVR  26.854nS
AVR Core  32.750nS

(2007/11/25修正)
データ入力をRAMとI/Oに分離
加減算時のVフラグの誤りを修正
速度の改善
(2007/12/16修正)
ELPM命令を追加。プログラムメモリのアドレシング能力を128kバイトに。RAMPZレジスタは書き込みのみ対応
(2009/03/08修正)
分岐のディスプレースメントが'b1000000のときに誤ったアドレスに分岐する不具合を修正
SPM,SLEEP,WDR,BREAK命令を追加(デコードのみ)

download(version0.6)


このページからダウンロードできるソースは、非営利目的に限り自由に使用できます。
なお、いっさいの保証やサポートはありません。