SoftCPU(ATmega103)のXilinxでの利用
ver 1.1
概要
SoftCPUであるOPENCORES.ORGの
AVR_Core
をXilinxのFPGAに実装出来るか試してみた。
簡単なTEST-Programだが動作確認が出来たので忘れないうちにHOWTO書を残しておく。
全体の説明
動作する迄の手順を以下に列挙します。
- 開発環境を揃える
- Firmwareのプログラム設計(C言語で書く)
- Firmwareのプログラムをコンパイル、アセンブル、リンクをしてHex-fileを生成
- FirmwareのHex-fileをSoftCPU側のVHDLソースに変換
- SoftCPUのVHDLソースを論理合成しFPGAへインプリメント
- ターゲットに焼き込む
- 火入れして動作確認
ターゲットは会社にあった試作基板を流用しての動作確認です。
- FPGAは、Spartan-IIE XC2S300E-6FT256C
- FPGAのPROMは、FlashDeviceのXCF02Sを使用しJTAG経由で書き込みをする
- 供給CLOCKは、OSC(48MHz)
- SoftCPU自体にはFPGA内部にて、供給CLOCKを分周して12MHzを供給
開発環境を揃える
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と判断しました。
コメント
色々な資料、データ、ツールを提供してくださった方々に感謝。
履歴