SoftCPU(ATmega103)のXilinxでの利用

ver 1.1


概要

SoftCPUであるOPENCORES.ORGの AVR_Core をXilinxのFPGAに実装出来るか試してみた。
簡単なTEST-Programだが動作確認が出来たので忘れないうちにHOWTO書を残しておく。


全体の説明

動作する迄の手順を以下に列挙します。
  1. 開発環境を揃える
  2. Firmwareのプログラム設計(C言語で書く)
  3. Firmwareのプログラムをコンパイル、アセンブル、リンクをしてHex-fileを生成
  4. FirmwareのHex-fileをSoftCPU側のVHDLソースに変換
  5. SoftCPUのVHDLソースを論理合成しFPGAへインプリメント
  6. ターゲットに焼き込む
  7. 火入れして動作確認

ターゲットは会社にあった試作基板を流用しての動作確認です。


開発環境を揃える


Firmware開発系

Debian GNU/Linux にて環境をそろえました。
aptが使用出来れば、以下のコマンド1発で、Cコンパイラ、アンセンブラ、リンカーとかが揃います。

# apt-get install gcc-avr avr-libc


FPGA開発系

今回はXilinxのFPGAをターゲットとしていますので、ISEの無料バージョンを利用した。
ISE WebPACK (6.2.03i)


HEX-fileからVHDL-fileへの変換TOOL

今回は自前で変換TOOL(hex2vhdl)を作った。 C言語で設計しました。 GCCでコンパイルして実行fileを生成。

変換前に実行fileのhex2vhdlを生成する必要があります。(最初の1回だけ必要)
後で説明する圧縮fileの解凍後に出来るvhdlディレクトリの下のtoolディレクトリにて、makeコマンドで実行fileを生成します。

$ make
生成したhex2vhdlをPATHの通るところに置くか、後で説明するfirmディレクトリに置いて準備完了です。


Firmwareのプログラム設計(C言語で書く)

まずは、 avrcore-200806130237.zip を解凍します。 firmディレクトリにavrtst.cがありますが、これが今回のC言語ソースです。
やっている事は、約1msのタイマー割り込みとUARTの受信割り込みです。 起動後、各初期化を実行し、UART経由(8bit-data,Non-Parity,1stop-bit,9600bps)で 起動メッセージを出力し、UARTは受信割り込み動作でのECHO-Back処理。 タイマーは1秒期間毎にBackGroudにFlagで起動指示し、BackGroudで動作している1秒EVENTの処理が動作。動作内容は汎用PortBitの出力のトグル動作。


Firmwareのプログラムをコンパイル、アセンブル、リンクをしてHex-fileを生成

firmディレクトリにてmakeコマンドでFirmwareのHex-file(avrtst.hex)を生成します。
$ make


FirmwareのHex-fileをSoftCPU側のVHDLソースに変換

firmディレクトリにてmakeコマンドでFirmwareのHex-file(avrtst.hex)からVHDL-file(prom.vhd)を生成します。
$ make vhdl

make内にて hex2vhdl を使用して変換してます。生成されたfileはvhdlディレクトリに書き込まれます以前のfileを置いてある場合は上書きされるので注意が必要。
また、ROM容量を決め打ち(アドレス幅が10bit長指定なので2^10=1024 -> 1Kword)していますので、本当はプログラム容量に適したパラメータに変更するべきです。


論理シミュレーション

vhdlディレクトリにて
$ make TB_TOP-VCD

または、
$ make TB_TOP

にて論理シミュレーションが出来ます。
※論理シミュレーションにはGHDLとgtkwaveを利用しています。


SoftCPUのVHDLソースを論理合成しFPGAへインプリメント

ISEを起動して、FPGAの指定とVHDL設計を指定し、vhdlディレクトリのVHDL-file群を読み込み。
論理合成し、MCS-file生成します。

素のAVR_CoreのソースではXilinxのBLOCKRAMを使用してくれなかったので、prom.vhdとDataRAM.vhdはXilinx向けに修正をしています。 また、ProgramCounter処理がうまく動作しないのでpm_fetch_dec.vhdもXilinx向けに修正しています。

※top_avr_core_sim.ucfは、今回使用したターゲットでのピン配指定のファイルです。


ターゲットに焼き込む

ISEのIMpactか MITOUJTAG でXCF02SにJTAG経由で焼き込みました。 MITOUJTAGだとMCS-fileを生成しなくてもBIN-fileで参照書き込みをしてくれるので何度もcut&tryする際に便利でした。


火入れして動作確認

UART通信出来るパソコンを用意してパソコン通信TOOL(Windows環境ならハイパーターミナルとか)を起動しておく。
私の環境では、DebianでuucpパッケージがInstallされているので、
$ cu -l /dev/ttyS0 -s 9600
で、起動しました。
ターゲット電源をONして、起動メッセージの確認をし、パソコンからの送信キャラがEchoBackしてくるのを確認。 また、1秒毎にトグル出力するPortBitを確認してタイマ処理の動作OKと判断しました。


コメント

色々な資料、データ、ツールを提供してくださった方々に感謝。


履歴