DDT誌のLattice基板で試してたAVR_Coreってあれから…

去年の今頃、私は何をしてたか…確か主人の引き合いで全く関係ない職種(今も兼業で
してるけど)から2Xさいでこの世界に首突っ込んで三相交流とかまだ存在すら知らなくて
"if(hoge=0)"とかお約束のボケかましててUSBaspすげぇぇぇぇぇぇぇぇとかいちいち感心
してたころかしらね・・・
でもまったくの未経験な私でもしっかり飯食わしてくれてるこの業界は素晴らしいとおもうよ!?
でも来年くらいには私はまた違う場所で違う仕事やってるんだろなーともおもう・・・。




少し前にAVR_coreの記事についてコメントいただいたので思い出したようにやりかけて
たのを引っ張り出していじっていました。
以前AVR_Coreで組んだプログラムはごくごく簡単な処理だったのでちゃんと動いている
ように見えましたが、少し複雑な処理(重たい処理)をしだすとすぐコケることが分かり安定
させるための方法を5月以降ず〜〜〜〜〜〜〜っと探っていました。

現時点で分かった致命的なところは、複数の割り込みがかかるような、たとえば送信受信の
リングバッファ組んだシリアルで大量のデータを吐かせながらタイマ割り込み動かしてると
確実に不安定になるという問題で(実機は全く問題なし)、ねむいさんはこれを秘孔と呼んで
現状ではこの状況におちいるのを避けるようにプログラムを組むように心がけてます。

次にAVR_Core本体のコードなのですが…pm_fetch_dec.vhd内のフラグの処理にバグが
あったらしく、opencoresにある最新のものでは修正が入ってましたのでこちらの修正を移植
してます。これやっとかないと割り込みとかなにもかけなくても単にループ回してるだけで
10分に2~3回くらいは"ひでぶ"してたもんで・・・



とりあえず上記2点の考慮で今のところは安定かな?といったものがやっとこできてきたので,
LPC2388基板やSTM32基板でやってたことをAVR_Core上で再現してみました。
ChanさんがぷちFatFsなるものを公開されていたのでこれもついでに盛り込んでます。

以前はROM:8192Byte,RAM:4096Byteとってましたが(ねむいさんの力量では)こんだけ入れると
コードが入りきりません。仕方ないもんでRAMを2kByteに削りROMを16kByteに増強してます。
んで、RAM削ると今度はmega103のスタックの定義が合わなくなってまたべつの問題ががg
・・・・・・しかし、よくよく調べてみるとmakefile内でスタックのアドレスを明示してやるだけで
よいことが分かりWinAVR付属のmega103用のリンカスクリプトは一切いじらずにやり過ごす
ことができました。

プログラムの流れは下図のとおり。エレキジャックでおまけに付いてたLM73のルーチンも
ついでなんで突っ込んどきました。
うー
ずっとソフトウエアi2c使ってきたのはもとはと言えばAVR_Coreでi2cデバイス動かしたかった
からと言うのもあります…。決して内蔵レj(ry
VHDLはいまだに"--"くらいしかまともに出来ないけどLatticeの基板でここまで出来たぞー!!
と言うわけで今日のおソース…試される場合は自己責任で…
うー
そうだね基板使い回しだね






きょうのおまけ
うー
ATMEGA32で上のプログラムの再現・・・そうだね使い回しだね
ソフトi2cとmega32内蔵のi2cいずれの方法でもアクセスできるようにしてます。
あとAVR_Coreの予習のためにソフトspi使っています・・・。
こちらに

もう一つおまけ
うー
先日の日記で公開したLPC2388のプログラムの中にLM73のルーチンも突っ込んどきました。
あとRTCの処理に起因するバグ(6月34日とか表示される)と環境によってコンパイル・エラー
になる場所(ST7032i.c & rtc.c内の部分)も修正してますので、真似して試される場合は
前回公開したのはつかわないでなるべくこっちを使ってほしいんだ

Comments

yaccです。
AVRコアのアップデート拝見しました。
私の方はまだIPコア探しの旅の途中です。
AVRマイコンは使い慣れているのですが、残念ながらverilogな人なのでVHDLで記述されているコアは使い辛いのです。
今は一周回ってMico8に再チャレンジしています。

所で、CPUコアをFPGAにいれて利用する時に困るのがプログラムのデバッグです。
AVRコアも合成に恐ろしく時間がかかるので、ちょっとしたプログラム修正でもすごく時間が必要になります。
ねむいさんはどのようにされていますか?

ispLEVERにはMemory Initializing Toolというのがあって、再合成を行わずにncdファイルの中のメモリの初期値を変更できるようです。このツールを使用するにはROMをIP Expressで生成して、Latticeの指定しているメモリ初期値ファイルで初期化しておかないといけないと思います。

  • yacc
  • 2009/07/14 12:33 AM

こんばんは。ねむいです。

ソフトCPUの論理合成は確かにものすごく時間かかりますね…AVR_Core"も"と
言うことはLatticeお抱えのMico8もやっぱし合成にそれなりの時間がかかると
いうことですか…

もうご存知かと思いますが、OPENCORESにある最新のAVR_CoreはJTAGインターフェース
を備え、ROMとして論理合成されたブロックRAMの領域にJTAGICE等の既成のツールで
プログラムの書き込みができるようになっています。
残念ながらDDT誌の基板にはそれを載せるに足る資源がないので、結局合成に
メタクソ時間がかかる古いほうのコードでせこせこやっていますorz
論理合成中は空いた時間利用してATmega32(実機)で動作の予習したりしてました。
Memory Initializing Tool使う方法はまだまったく試してないので、使い物になるか
どうか少し調査してみます。少しでも時間の短縮につながればよいですね〜。

それとAVR_Coreをverilogへのトランスレータを行われてる方がいました。
ttp://japanese.sugawara-systems.com/opencores/benchmark/benchmark_AVR.htm
ご参考までに…

AVRコアは今はJTAG経由でプログラムの書き換えが出来るのですか…
勉強不足で知りませんでした。
JTAGのコードが入らないのであれば、Memory Initializing Toolを是非活用して下さい。デバッグ効率がずいぶん上がるはずですよ。
Mico8は小さいので合成も数分で終わります。それでもプログラムを書き換えるたびに合成するのは避けたいですね。

AlteraのFPGAにも同様の機能があり、以前にAVRコアを実装した時に利用しました。
#ええ、以前にもAVR_Coreを使った事があるのですよ。今、古いファイルを探したら2003年の日付でした。
#途中で投げ出しちゃったような記憶があるので、知らないのと同じです。
#もしかしたら、ご指摘のバグがあったのかも。ちょっと複雑なプログラムを書くと変な動作をしていたような気がします。

Xilinxはあまり使用経験がないのですが、PicoblazeというCPUコアにはJTAG経由でプログラムを変更する追加機能(AVR_Coreと同じ方式ですね)がありました。

Mico8の方は、シミュレーションが動きはじめました。
branch命令でとんでもない所にジャンプしているようです。
もうちょっと頑張ります。

  • yacc
  • 2009/07/15 11:39 PM

ねむいです。こんばんは。

LatticeのMemory Initializing Toolを使う方法、(VHDLの勉強をしつつ)進展があったら
また日記に書かせてもらいますね〜。

yaccさんが行われているMico8の検証もうまく行くようご武運を祈っております…。

Post a Comment








Go to top of page