naxjp の XCF01S サポート


せーさく中の基板は XC2S100E + XCF01S がコアになっている。 とりたてて好みとか都合があったわけではないんで、当時一番安かった組合せ、1 ペアで 2200 円なり。

コア部分だけ組み上げ、テストプログラムを書き込もうとしてつまずいた。 naxjp が XC2S100E も XCF01S もサポートしてねー ... 泣く泣く 1 周目は iMPACT 使ったけど、 やっぱ naxjp が使えたほうがいろいろ取り回しがよろし、というとこで実装してみた。

XCF01S と STMicro XC18V00

Flash なターゲット ROM としては世に三種:
UMC 製の旧 ROM
なひたふさん家のでいえば NP1003C までに載ってるやつ。XC18V01 の場合で IDCODE は 0x05024093.
STmicro 製の新 ROM
新 XC18V01 の場合で IDCODE は 0x05034093.
XCFxxS シリーズ (ちなみに STmicro 製)
NP1003E 以降に載ってる XCF01S 等。 XCF01S の場合で IDCODE は 0x05044093.

NP1003D には XC18V01 が載ってるが、新旧のどちらかは不明。 naxjp 0.79 のサポートは旧 XC18V01 まで。 新 XC18V01 は旧 X18V01 とはアルゴリズムが微妙に非互換で、naxjp 0.79 では書けない。 XCF01S の書き込みアルゴリズムは新 XC18V01 に同じ。

書き込みアルゴリズムの相異点に関する話はアプリケーションノート xapp058 のサンプルプログラム eisp_pc.zip に含まれるドキュメント readme_xc18v00_xcf00s.txt が図入りで分かりやすい。 要約すると新旧の非互換部分は 2 つ:

これだけわかれば実装できる (alg18.c):
@@ -165,7 +170,8 @@
        PrintMessage("ferase");
        csi->SetTDI(Num,0xec);          //FADDR CODE
        csi->OutputSIR(false);          //TDOチェックしない
-       csi->RunTestIdle(100000);
+        ClockTCK(false);
+       csi->RunTestIdle(15100000);
        return true;
 }

@@ -533,6 +539,7 @@
                        PrintMessage("fpgm");
                        csi->SetTDI(Num,0xea);          //FPGM CODE
                        csi->OutputSIR(false);          //no TDO check
+                        ClockTCK(false);
                        csi->RunTestIdle(14000);
                        printm(".");
                }
IDCODE のチェック部に XCF01S (0x5044) 等を付け加えるのは略。

なお、同じ XCF ファミリでも parallel 書き込みモードをもつ XCFxxP シリーズはまた書き込みアルゴリズムが違うらしい。 同じ方法では XCFxxP で動かない ... のかな。

Spartan IIE の bypass

何故か Spartan IIE は Virtex E と同じ IDCODE を持つ。 よって Spartan IIE をバイパスするのに
# naxjp -bypass XCV100E
でいける ... と楽で良かったんだがそういう訳にはいかなかった。ちぇ。 Spartan IIE は Spartan II と同じ config アルゴリズム (xapp188) を持ち、 Virtex E のアルゴリズム (xapp139) とは異なると。

てことで Spartan II と同じ手順でバイパスするため、そっちのソースに Spartan IIE の IDCODE を付加しておく(alg2s.c)。

@@ -27,6 +27,8 @@
                        break;
                case 0x0614:    //XC2S100
                        break;
+               case 0x0a14:    //XC2S100E
+                       break;
                case 0x0618:    //XC2S150
                        break;
                case 0x061c:    //XC2S200
てな感じ。留意点ふたっつ。

まぁ、どーせ bypass 等しかサポートしてないかんね。 副作用のある -write とかをサポートする前にはこのあたりもきちんとしないといけないだろうけど。

コード

Copyright notice に
2. NAXJPの仕様が固まるまでは、改変したものを配布しないでください。 
てあるので、コードそのものはだせない。問い合わせ中。
つーか、まだ GPL じゃなかったんね ...。

続報: この件、「ださんでくれ」つーことなので、必要な人は自前で書くか、暫く待ちましょう。 ← お返事

XCF01S

XC18V01 が高価だった頃のなごりで 24LC1024 とかを使う (似たようなプロジェクトがあっちこっちにある ...; xapp178) ってのも頭にあった。 が、XCF01S より廉価な ROM がないという現実の前に全てサスペンドした。

ついでに パラレルケーブル以外の、USB 経由などの高速書き込みへの野望とかも世に散見するが、 新 ROM の erase には絶対に 15 秒かかるので、 データ転送時間が 20 秒 → 1 秒になったとこで書き込み時間は半分にしかならないのであった ...。

ターンアラウンドタイムを短くするには、FPGA への USB 経由なりでの直接書き込みできるようにせんといかんと。 基板そのものは Spartan IIE の configuration のすべてのモード (xapp176) に対応させてあるので、 USB 経由 SelectMAP mode 書き込みの実験くらいは出来る ... ま、そのうち考えよう。

追記

naxjp は 0.8 になって XCFxxS 等をサポートした同時に、ソースコード配布が中止された。

References


[日記へ] [目次へ]