SPI-ROMの使い道がいまいち…

DDT誌に勧められるままに購入し、取り付けたSPI-EEPROM(M25P40)ですが、Lattice
の石はチップ自身にコンフィグROMが内蔵されているため、コンフィグ速度が遅い
外付けのSPI-ROMはぶっちゃけ出番がありません。しかも書き込み方法がispVMから
ではないとできないのでやっぱり使い道がありませんorz。
でもせっかく買っちゃったのでそれっぽく使ってみることにしました…。


20110527追:
ispVMがFT2232デバイスに正式対応になりました!
もちろん外付けSPIROMの書き込みも可能です!!



















SPI-ROMの書き込み方法はispVMを使用しJTAG経由でSPI通信を行って行うわけですが、
私はJTAGkeyしか持ってないので(コンフィグもSVFでやってるし)それと同等の機能を
持つソフト経由で書き込む必要があります。酔漢氏が作成されたasagaoはズバリそのもの
な機能があってこちらを使わせていただくことにしました。


以下の検証内容はこちらの記事で紹介してることが全て出来ていることが前提です!それとSPI-ROMは付けとくように!


基本的な操作方法はasagaoのマニュアルに従ってくだい。また、一番難解なLFXP2_5E用の
ターゲット設定ファイルは、私がすでに作成していますのでこちらを使用してください。

※USE AT YOUR OWN LISK

うー
設定ファイルを読み込み、"Target Device"を"CQ-FRK-LXP2"に設定すると、ちゃんとJTAG
のチェインが繋がっていれば上記画面のように表示されます。


うー
"detect"ボタンを押したところ。SPI-ROMのIDを読みだし表示できています。ここまで
きたらあとはもう書いたり消したり自由自在です。勝ったっッ!(愚地克己顔で)


うー
"Erase All"したところ。


うー
適当なhexファイルを選んで書き込み。残念ながら最速の6MHzでも遅い。


うー
書き込み完了。Blank Checkもちゃんと機能しています。



…これでSPI-ROMを無駄にしなくて済みましたが、こいつの実際の使い道…どうしようか…
コンフィグ用途に使用するのは(内蔵フラッシュと比べて)遅いし、この基板のコンフィグ
モードだとコンフィグ後はCCLKがユーザI/Oとして使用できなくなる
(=自由にSPIROMにアクセスできなくなる)ので基板をリワークしてセルフダウンロード
モードにするか、もしくはCCLKピンと別のGPIOとを直結してやる必要があります。
I/O数は有り余っているのでSPI-ROMを使い倒したい方は後者の方法がベストでしょう。

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内の部分)も修正してますので、真似して試される場合は
前回公開したのはつかわないでなるべくこっちを使ってほしいんだ

DDT誌付録のLatticeXP2基板にAVR_Coreを実装する(するだけ)

少し前から下描きでずっと放ってあったいないさんの画像レス用の絵を
ガーっと仕上げて二次裏内で本人にいくつか使用してもらいました。
思えば私、ひさびさに真面目に虹メ&女主人らしい活動をした気がします。
やればできるジャン私!…そして滞るブログの更新。






少し前にAVR_CoreのLED点滅&UART垂れ流しのデモSVFだけ公開してましたが、
ある程度まとまりましたのでここに実装の仕方とか箇条書きで記しておきます。
ねむいさんが後から読んでわかるレベルのことし書きませんので悪しからず。
なんせまだ検証途中なもんでこれから先もどんどん変わる。

「お前の前フリはいつも長い」という方の為にソースは最初につけておきます。
自己責任でどうぞ。

1.ハードウエアを準備しないとね
 a.LatticeXP2基板はLDO&外部OSCを必ずつける。
  内部も使えますがシリアル吐かせたい時は正確なクロックが必要なので。
  クロックは30MHzを使用(kawasan氏のソースは内部で4分周してるので実際は
  7.5MHzでうごいてます)。これは私がやってるお勧めできない実装例

 b.LatticeXP2に何らかの手段で書き込みができるようにしておく。
  内蔵フラッシュにはUrJTAG+JTAGkeysvfファイルの再生という形で
  コンフィグができます。
  JTAGkey(と互換回路)は持ってるけどLPTポートが無いPCやなひたふさんの
  78kライタが使用できる基板を持ってない&無駄にCOMポート増やしたくない
  なんて人は私がやってる方法で試してみてください。

2.論理合成用のソフト群のインストール…
 アカウントもらえるの時間かかるけどがんばれ。
 れっつごー

3.AVR_Coreのソースは…
 kawasan氏がxilinx用に実装を試みています。今回はこちらを使わせてもらって
 LatticeXP2向けとして実装していきます。

4.プロジェクト作って…
 ねむいさんは鳥頭でvhdlの文法はもうすっかり忘れてしまいました。だから
 なるべくソースはいじらない方向で、かついきなり本体に実装で行きます!!
 (シミュレーション等を一切考えてないとか一番ダメな手法だろうけど…)。
 プロジェクトに統合したvhdファイル群と階層構造はこちら
 
5.AVR側のプログラムは…
 WINAVR(20090313)を使用してATMEGA103用のプログラムをコンパイルします。
 後述しますがRAMは実デバイスとほぼ同じ4096バイト取るのでコンパイラ側で
 リンカスクリプトなどの細工とかを考える必要は全くなしです。
 (cyclone基板の頃はDWM誌に具体的な説明が何一つなくてホント苦労した)
 kawasan氏のhex2vhdl.cを実行形式ファイルにしておいて、make一発で
 prom.vhdまでプリッと出るようにしておきました。kawasan氏に感謝です。
 肝心のプログラムの内容はソースを参照のこと(はしょるはしょる)
 とりあえず前回とほぼ同じで、動いてますよ程度のものです。

6.とにかく一回合成してみる
 時間長い。すげぇ長い。仮想PC上で動かしてるからこんなものなのでしょうね多分。
 合成の結果を見てみるとROM、RAM共ブロックRAMを類推してくれてます。
 kawasan氏のxilinx用のものがそのまま使えるようです。kawasan氏にマジ感謝です。

7.外部に信号を出す
 外部に引っ張り出す信号の設定をします。今回は最小限の確認なので
 こんな感じに。後述しますがreset引っ張るときは元のソースは論理が反対に
 なってるので注意です。

8.jedファイルに落とす
 ピン配設定まで終わったらここでjed作ります。jedからsvfはこちらを参照のこと。

9.svfを書きこむ
 UrJTAGのバッチモードで一気に。svfファイル内のeraseいじっておくとあっとい
 う間に終わるのは前にも述べたとおり
 あと、何度かやってるうちに分かりましたが、バッチで動かすとUrJTAGがdetect
 に入ったときに時折フン詰まりになることがわかりました
 バッチの記述にdetectの前にfrequencyの設定を2回記述して回避してます。
 (原因はあとで調べます…)

10.うごいた。
 動いてます。ねむいさん自身はほとんど何もしてません。先達が残された偉大な
 足跡に感謝ですね…。というわけでもう一回おソース。冒頭のと同じです。
 試されるときは自己責任でどうぞ(定型文)

11.考察
 a.AVR側のプログラム容量の制限
  なんも考えなしにべーっと合成した場合、RAM:4096byte(固定),ROM:8192byte
  が限度でした。ブロックRAMは166kbitあるのでRAMが4096byteだとROMは
  16384byteでもギリでいけると思いましたが…駄目。
  RAMを2048に減らすと通るかしら?そうなるとRAMENDを細工しなきゃならない
  のでしたくないのですが、でも現状こんだけRAMROM使えたらおんの字ですよね!?
  
 b.AVR_Core側
  kawasan氏のvhdlソースをなるべく変えないスタンスで行きましたが、
  DDT誌基板のSW入力ピンをリセットとして使うと、論理が逆になってしまう
  のでソース中の記述も変えました。
  また、ROM容量を8192byteまで取ったのでROMのビット幅も変えてます。
  この二つの変更だけでDDT誌のLatticeXP2基板にAVR_Coreを実装できました。
  あ、prom.vhdのこと忘れてた。



…実装は上手くいきましたが、AVR_Core使う場合はこっからがやっとこ始まり
ですね〜…一応RAM&ROM容量の見積もりがついたんで作りたい物のめどはつけてます…
vhdlとか論理回路とかの再おべんきょは避けられないのかorz

ディジタル・デザイン・テクノロジ付録基板のLatticeXP2にUrJTAG+JTAGkey互換回路でコンフィグする

2011.05.26追:
LatticeのISPVMがFT2232デバイスに正式対応となりました!
これで手軽に読み書きができるようになります。
いい時代となりましたね♥
追の追:
内蔵Flashに書くときは.jedファイルを指定します。
SPI-ROMに書くときは.bitファイルを指定します。
あとHS-1はGNDに落としておくこと。

2009.07.31追:
Latticeの付録基板を使用中、書き込み・消去が失敗すると以後基板からヤバ目
の発振音がしてJTAGで一切アクセスできなくなる事態に陥いることがあります。
これは「不完全なコンフィグ->コア電流異常消費->電圧ドロップ->再コンフィグ」
のループを繰り返してデッドロック状態に陥ってるからです。

この状態から回復するにはnPROGピンを(Lattice基板上でCN2_B07を)LOWに
引いたまま電源を投入して電源投入直後のコンフィグを開始させない状態で
JTAGにアクセスし、書き込みor消去を正しく完了させる必要があります。
依然としてこのページのアクセスが非常に多く大事なことだから2度言います。




DWM誌が廃刊休刊となり、新たにディジタル・デザイン・テクノロジ誌
略してDDT誌が刊行されました。ご多望にもれず、付属基板なんかがついてます。
石はLatticeのLFXP2-5E-5TN144Cですね。フラッシュベースの不揮発型FPGAですって。

ねむいさんはLPC2388基板と秋月ARM基板動かすのに夢中になってたので
ほうっておいていましたが少しだけ触ってみましたよ。LPTの書き込みアダプタはもはや
作る気がなく、なひたふ氏の78kを使ったライタはCOMポートが増殖してしまいます。
ねむいさん的にはテストを兼ねてUrJTAG+JTAGkeyを使ってSVFファイルの
再生と言う形でLatticeの基板に書き込みをして見ようと思います。


…5月17日現在、ネットで検索してもデモのLEDチカチカを書きこんだ!
以外の作例が全くと言っていいほど見当たりません。
それどころかLEDチカチカの記事すらほとんどないのがさらに不安をあおります。
唯一chanさんはミクを動かしてレヴェルの違いを見せつけてくれていました。すげぇ。


私も一つ組んでみました。30Mhzの水晶とM25P40-VMN6P、LDOのADP3339なんか
つけてみました。あれ?このADP3339って…とお思いの方、かわいそうに…そう、+5V電源を
指示どおりに接続すると高い確率で発振するかのSH2基板に乗っかっていたアレですね〜。
今検索すると"「接続すれば発振する」は通用しない"と言う一文がトップに躍り出て
とても意味深です。でもADP3338/ADP3339はわるないよ?

それはおいといてこんな感じに各部品を実装。電源は容易に脱着できるように
JST-XAを。JTAGの端子は10Pinありますが、実際に信号が出てるのは
TCK,TMS,TDO,TDI,Vcc,GNDだけなので、馬鹿避け用に真ん中の一本はカットしてます。
ついでに9,10Pinもカット(最初からつけなきゃよかったorz)もちろん対になる8Pinコネクタ
(どうせ残りの9,10Pin繋がってないし…)はカットした真ん中の一本に
メクラをかませて馬鹿避けを実現してます。

ADP3339用のコンデンサは裏に実装してます。VinにはGRM21BB31C106KE15を、Voutには
秋月のこの子を付けて常時安定した+3.3Vの供給を行っています。
秋月のセラコンは+3.3V以下のセラコン対応のLDO用に大量に買っておいてもいいと思います。
あ、言い忘れてた、ADP3338/3339使うときはRP1、RP2は必ず除去してください!
真似する人はちゃんとデータシートで確認すべし。
さらに今回はSPIEEPROMは付けたけど一切無視するのでHS1のジャンパもカット。
やっとかないとSVFで書けません。

書き込む準備は出来ましたので次はsvfファイル生成ですね。
ISPLEVERとその他ツールはインストールしてあるものとして話を進めます。
jedの生成までは紙面にあるので省きますよ!!
(ツールをインストールするまで一苦労でしたね〜…認可もらえるまで
時間やたらかかったり、まぁその分しっかり審査しているということなのでしょう。
ちなみに私は組織名:二次裏メイド協会、名前:キリ・イセノミヤで通りました。
はぢめて上司が役に立った(笑)…っていいのかこれで)



では行きましょうか。
というわけでだいぶ端折ってjedが生成されたところからスタート。
これから先は画像付きで。
jedが生成し終わったらispVMを起動する
ChainConfigration1と言うウィンドウは即効消す。
UniversalFileWriterを起動
生成ファイルにSVFを選択
InputDataFileに先に生成したjedを選択
RUNTEST FROM REV.C をONにする
OutputDataFile名を指定する。
Genereteボタンを押してSVFを生成

はい出来ましたね?できてなくても次行きます。
次はいよいよ書き込みです。前ふり長くなりましたがこっからが本番です。
UrJTAGをダウンロードしてインストールしてください。JTAGkeyと通電した基板を接続し、
UrJTAGを起動。生成したsvfをUrJTAGと同じフォルダに置いて以下のコマンドを順番に。
その前に!HS1のジャンパカットし忘れてたら電源落としてカットしておいてね!

>cable jtagkey
>detect(ちゃんと繋がっていればここでチェーンが見える)
>part 0
>instruction length 8
>svf (生成したSVFのファイル名) progress
1分ほどたつと
>Scanned device output matched expected TDO values.
と表示され、FPGAがロードされます。

あと小技ですが、svfファイルの中のeraseの記述で
>! Erase the device
>
>! Shift in ISC ERASE(0x03) instruction
>SIR 8 TDI (03);
>! wait 1.20e+002 SEC
>RUNTEST IDLE 120000003 TCK;

>RUNTEST IDLE 120000003 TCK;

>RUNTEST IDLE 5000003 TCK;
くらいに減らしてやると書き込み時間を大幅に短縮できます。
最速で40秒くらいでコンフィグできます。それぞれの環境で調整して見てください。

また、もし書き込みが失敗してFPGAが不安定な状態に陥ったらnPROGピンを(基板上で
CN2_B07を)LOWに引いたまま電源を投入して再び書き込みを行って回復して
くださいね。基板捨てんじゃねぇぞ!あきらめるな1!!(←乙女の雄叫び)




こんなかったるいコマンド入力いちいちやってられるか!!と言う
方はバッチで実行するやり方もありますのでご紹介します。
こちらの中にサンプル付きでありますので中のファイル見てねむいさんが
何をしたいかが理解できる人だけ自己責任でどうぞ。
30MHzの外部OSC必須です。でもUART要らない人は特に周波数に気にしなくてもいいです。

Go to top of page