Qiitaに初めての投稿になります。これまで趣味も含めて15年以上技術(電子回路・組み込み技術)とかかわってきましたが、こうやって公に自分の書いた制作物を出すのは初めてです。
私は学生時代AVRマイコン(Atmel社製、現在はMicrochipに統合)を使っていろいろ作るのが好きでした。今後記事にしようかと思っていますが(10年以上前なので制作物残ってるかな?)、MP3プレーヤをCADで基板設計~ソフトウェア作成までして作ったことがあります。PICマイコンも少しいじっていましたが、レジスタのバンク切り替えもろもろが面倒、とかいろいろな理由でAVRのほうが好きです(笑)。
AVRと聞いてご存じの方もいらっしゃると思いますが、有名なArduino UNOに使われているAtmega328Pが代表的なAVRマイコンです。
さて、本題に入りますが就職してよくFPGAを触るようになってから、CPU自作に関心を持つようになり「もしやAVRをFPGAで実装できるのでは?」と思いちょうど数年前の新型コロナが出た時期ぐらいにAVRをVHDLで実装し始めました。
仕様は以下になります。
・Atmega328Pに近い(一部レジスタのアドレスなどは一部変更)仕様
・基本的な算術命令(addなど)
・スタックを使いサブルーチンが構築できる仕様(rcall,ret)
・条件分岐命令
・まだ割り込みは実装していません
・PORTA~D実装
・アセンブラはavrasm2.exe(AtmelStudio7に付属)を使って吐き出されたHEXファイルをQuartusのOnChipRAMの初期値として設定
まだ実装していない命令もあり完璧なコードではないですが(更新予定)、ある程度動くようにはなっているのでGithubにあげてあります。
https://github.com/ykhr7121rkhy/AVR_single_cycle_core
・検証方法
① avrasm2.exeを使い任意のアセンブリコードからHEXファイルを生成
② modelsimでhexファイルを含めコードをコンパイルし、命令がちゃんと実行されているかどうか波形確認
これくらいの命令数であればLチカ~簡単なキャラクタLCD操作ぐらいであれば実現可能です。
●今後の目標、改善点など
・Arduinoで動かせたら面白い
・割り込みも付けたい
・現状シングルサイクルなのでパイプライン化したい(ハザードとか面倒そう)
・ほかのマイコンの疑似コアも作ったら面白そう
以上になります。
簡単な紹介ではありますが、読んでいただいてありがとうございました。