Sun, 31 Jul 2005

shobon-JTAG 2005.7.5 (last update 2005.8.26)

トピックが長引きそうなので、一部新エントリに移動しました。

★shobon-JTAG ダウンロード

shobon-JTAG は、動作状態、あるいは内部回路と切り離した状態で、FPGA,CPLD 等の JTAG バウンダリスキャン(IEEE 1149.1)対応デバイスのピンの信号レベルをモニタするためのソフトです。

shobon-JTAG を作ったいきさつについては、こちらもお読みください→旧エントリ:JTAG の練習(6/13)

ジャンクソフトですので、ソースコードでの配布(VisualStudio.NET 2003 プロジェクトフォルダの圧縮 イメージ)となっています。

配布条件は一部私に著作権のないと思われるファイル( 他社デバイスドライブ用 DLL,ListViewX フォルダ以下のもの、 etc)を除き、現行 GPL に準じるものとします。

コンパイル済みバイナリ(アセンブリ)が展開フォルダの shobonjtag/bin/Debug の下に含まれている場合がありますが、 最新のソースでビルドしたものである保証はありません。できればリビルドをお勧めします。

上記のことから、shobon-JTAG を使ってみるには VisualStudio.NET 2003、実行には giveio.sys のインストール、および .NET Framework と NT 系 OS が必要です。

現在動作確認している OS および環境 は WindowsXP (SP2), Windows2000 Professional (SP4) 上の .NET Framework 1.1です。

現在手元にあって、shobon jtag での動作が確認できている JTAG ケーブルはパラレルポート接続の

★ByteBlasterMV(互換回路)
★Xilinx Parallel(互換品、HumanData さんの XC2 旧モデルの方
★ByteBlasterII (互換品、アルファプロジェクトさんのHJ-LINK

の3種類です。

giveio.sys の入手、インストールについては、google 様に聞いてください。

shobon-JTAG をロジックモニタとして実用的に使うには、ピン番号とバウンダリスキャンビット番号の対応情報を与える必要があります。これらは、デバイスメーカが配布している BSDL ファイルに記述されています。BSDL ファイルは VHDL のサブセットだそうで(Verilog しか使えない私にはよくわかりませんが)人間の読めるテキストファイルになっています。

大体、前半にピン番号とデバイス信号名称の対応テーブル、後半にバウンダリスキャンビット番号とデバイス信号名称の対応テーブルが記述されているようです。

BSDL ファイルの配布元
Xilinx: http://www.xilinx.com/support/sw_bsdl.htm
Altera: http://www.altera.com/support/devices/bsdl/bsdl.html

実際にモニタしたい信号数が少ない場合には、BSDL ファイルを眺めながら(笑)、バウンダリスキャンビット番号、ピン番号、信号名称を手入力でいれてもさほど手間ないではないとおもいます。データは View メニューで現れる ViewForm 上の右クリックメニューから 編集、Load、Save できるようになっています。

しかし、すべてのピンをざっと眺めたいというような場合には、手入力は非常に面倒です(っていうか、自分がそうでした)。そこで、shobon-JTAG(6/30 以降版) には、これらが記述された BSDL ファイル(のごく一部)を読む機能がついています。

デバイス選択後、Viewer ->(ListView 上の右クリックメニューの BSDL ほげほげ)。
偶然(笑)うまくよめた場合には、手入力の必要がありません。 現在 Device メニューにあるデバイスの BDSL は一応それなりに読めることを確認しております。
(なお、Xilinx ConfigRom の BSDL を読む場合はファイル名に、なんとか 1532 のついてないほうを使ってください。)

「(・ω・) JTAG 20050623」(ちょっと古い、間違いもありますが、シンプル。ちょっとのぞいてみようという方向け)

「(・ω・) JTAG 20050722」(余計なコード盛りだくさん。いちおう安定版)

「(・ω・) JTAG 20050826」(新しい。余計なコード盛りだくさん。β版)


-- shobon-JTAG 使い方まとめ --

1)giveio.sys インストール。

2)shobon-JTAG 本体起動。

3)ケーブルとベースアドレス選択。メインメニューの Config->Cable、Config->LPT Port。
デフォルトは ByteBlasterMV 、ポートアドレス 0x3BC (俺設定)になっていますので、それ以外のケーブル、LPT ベースアドレスの場合は起動のたびに選んでください。
んなことやってらんないよ!、という方は "Form1.cs" へGO!
してソースを改造してリビルド。あなたの「俺設定」をデフォルトにしてね。

4)デバイスを選択。
メニューにないよ、という方は「shobon-JTAG に新しいデバイスを追加して使ってみる例」に GO!。

5)「Back To Run-Test/Idle」ボタンを押します。下のボタンが押せるようになります。

6)「Capture-IR」ボタンを押します。ここでステータスバーに IR Capture Success (xx ms) の表示が出れば動作しています。

ステータスバーに Invalid Instruction Capture!! と表示されてしまった場合(・ω・)

うまく動作していないようです。以下をチェックしてください。

「ケーブルの選択」「LPT ベースアドレス」「ケーブルの接続」
「デバイスの電源」「自作デバイスクラスファイル IR データ」
特に "111111111""000000000" とか、連続して同じ状態が表示
(Capture した IR レジスタの内容は横の TextBox に出ます)される場合は
ケーブル種類とベースアドレス、電源を再チェックしてください。


なお、動作途中でデバイス、ケーブルを変えた場合は、一度 shobon-JTAG を再起動したほうが確実です。

7)「SAMPLE(...)」ボタンを押すたびにピンの状態をサンプルしてビット列が表示されます。何度も押してられない方は 「Continuous」をチェックしてからボタンを押すと、連続サンプルします。

8)"1010101010000101"とか見ても分けわかんないので、(Continuous のチェックを外した状態で) View -> ShowViewer を選択。ViewForm を開きます。

9)監視したいデバイス ViewForm の ListView の右クリックメニューから「Read Info from BSDL file」を選択。メーカ BSDL ファイルを読み込みます。

A)「SAMPLE」を押すたびにピンの情報が色分けされて表示されます。もちろん「Continuous」をチェックしておくと連続サンプルします。カラフルできれいです。
なお、連続サンプル時、メニューの反応が悪いときは、「Continuous」のチェック を一旦はずしてください。

B)WebPack6 をお使いの方、D2CAD をお使いの方は、Mentor ネットリストもしくは .ucf を読ませて、NAME 欄を利用している信号名称にできます。「Read Pin-Name Info ....」を選択して読ませてください。
Mentor ネットリストの場合は、どの石が該当デバイスかわかんないんで、ダイアログで IC7 とか U6 とか、入れてやる必要があります。

C)UCF も Mentor ネットリストもない方は、ピン名称を手で編集出来ます。ダブルクリックでダイアログが開きます。ピンの削除、ビットの追加は ListView 上の右クリックメニューからできます。

D)BDSL、ネットリスト、手編集の情報はファイルにしてセーブし、次回以降活用できます。ListView 上の右クリックメニューの「Save Item Info」でセーブしてください。

E)次回以降は 9)から先は BDSLやネットリスト、UCF のかわりに 「Load Item Info」でOKです。


-- 現在 Device メニューの選択肢にあるデバイス(・ω・) --
デバイス名 動作確認ボード等 備考
XC95144(PQFP160) 内製 -
XC95144(TQFP100) 内製 -
XC18V01_SO20 → XC2S30(TQFP144) 内製 ROMが先にチェーンに繋がっている
xcf01s_vo20 → XC2S30(TQFP144) 内製 ROMが先にチェーンに繋がっている
XC2S100(TQFP144) EZ-FPGA(オプティマイズ) EXO-3 20MHz を実装、10ピンヘッダコネクタ(アルテラ配列になってるとこ)に ByteBlasterMV を挿して試した
EP1C12F324(BGA) LiveDesign Evaluation Kit(Altium Japan) 付属のコンフィグケーブル。ByteBlasterMV モードで使用
EPF10K10(PLCC84) CSP-004(HuMAN DATA)

付属のコンフィグケーブル。
JTAG で使うには細工が必要
ByteBlasterMV モードで使用。

XC95108(PLCC84) XC95108/72評価基板(キット)/SK95108-84(共立電子)

ライタは HUMAN DATA 製 XC2
Xilinx Parallel モードで使用。

     
EP1C6Q240(QFP) 内製評価用(未テスト)

-- 未テスト --

     
     


基本的に私が持っている、もしくは仕事で使う必要のあるデバイスしかプログラム本体の Device メニューに追加する予定が(今のところ)ないので、お手持ちのデバイスで使用する場合には「shobon-JTAG に新しいデバイスを追加して使ってみる例」を参照して、Device メニューに追加して使ってください。

私が確認できない未サポートデバイスを試されて、クラスソースを追加して動作確認していただけた場合、もちろん大喜びで(・∀・)追加します。どんなデバイスで動作したか、しなかったか、教えてください。クラスソースファイルはコメント欄にでも貼ってやってください。


-- 変更履歴(・ω・) --

8/26 : ちょっとだけ(・∀・)になった?点。
1)EP1C6Q240 を追加。動作は未確認
2)プロジェクトアーカイブにサンプルの .vfd ファイル を添付。アーカイブ内の README 参照。

8/2 : ちょっとだけ(・∀・)になった?点。
1)XC95108_PC84 を追加。動作を確認。
2)XC18V01_SO20 + XC2S30_TQ144 のデバイスの組み合わせを確認。

7/31 : ちょっとだけ(・∀・)になった?点。
1)XC95144_TQ100 での動作を確認。
2)XC18V01_SO20 + XC2S30_TQ144 のデバイスの組み合わせを Device メニューに追加(ただし未テスト)
3)ViewForm にて、同じピン名称に "input" 属性がないときは、"output3" 属性の bit 情報も読み込むようにした(BSDL リーダ関連)。ご都合主義ですが、ConfigRom なんかだと、input ピンが少なくて ViewForm の表示がさみしかったので(笑)

7/22 : ちょっとだけ(・∀・)になった?点。
1)ByteBlasterII (互換ケーブル)対応、始めました(・ω・)。動作確認ケーブルは、アルファプロジェクトさんのHJ-LINKです。

参考(ByteBlasterII 回路図等)にさせてもらったページ - http://www.axas.org/ - FPGA総合情報サイト FPGA Navigator

2)XCF01S_VO20 -> XC2S30(TQFP144) のデバイスチェーン(デバイスチェインを試したのは初めて(^^;)でモニタできているような気がします。使い勝手は(・ω・)ですが。

7/17 : ちょっとだけ(・∀・)になった?点。
1)shobon-JTAG に新しいデバイスを追加して使ってみる例で説明した CSP-004D で使用されているデバイス EPF10K10LC84 を追加。
2)shobon-JTAG に新しいネットリストリーダ?を追加する例で説明した「いかさま」な .ucf リーダを追加。

7/15 : ちょっとだけ(・∀・)になった?点。
1)XCF01S_VO20 + XC2S30 をメニューに追加(未テスト)
2)XC95144_TQ100 をメニューに追加(未テスト)
3)BSDL ファイルのピン番号の1文字目が 'P' のとき(XC2SXXシリーズなど)に、ネットリスト(Mentor)のピン番が 'P' なしでもむりやりピン番一致とみなすようにした。Spartan2 使った結果不便だったので....

7/5 : ちょっとだけ(・∀・)になった点。
1)View 画面をデバイスごとにしました(デバイス選択ののち、View が開けます)
2)ListView の描画をサボることで、連続 SAMPLE 時の更新のちらつきをすこし低減しました。

参考にさせてもらったページ:CodeProject :Flicker-free ListView - http://www.codeproject.com/cs/miscctrl/listviewff.asp

3)あからさまにやる気のないネットリスト Reader を 内蔵 。
D2CAD で生成した Mentor 形式のネットリスト」 ファイルから、ピンと回路図上のネットの対応を読めるようになりました。
.net ファイルを指定すると、回路図上のJTAG対象デバイス(当該 ListView の)部品番号を聞いてきますので入力してください(例:IC5 など)。
運がよければネット名称が読み込めます。但し、すでに対象ピンの情報が View にある必要があります。先に手で入力するか、BSDL を読ませておいてください。
なお、ネット名称に空白文字を含む場合、その信号名称は正常に読み込めません。このような信号名称は、読み込み後「Edit....」メニューで編集してください。
(要はいきなりスペースで string.split() して、ネット名の前後のシングルクオートの認識をサボるような実装をしているからです(w)

★1)デバイスを選択、2)BSDL読み込み、3)ネットリスト読み込みのあと、右クリックメニューの4)Info ファイルとしてセーブで、 (ビット番号)-(ピン番号)-(ネット名称) のリストを保存できます。次回以降はそれをロードするだけで利用できます。

4)EXTEST ボタンがつきました。テストモード(=デバイス内部を切り離した状態でのピンの状態)を観察するのに使用できます。
SAMPLE(PRELOAD ALL 0) を行うまでこのボタンは無効です。
現在 ALL 0 以外の値の LOAD はできません(controlr ビット、internal ビット等も 0 になります)ので、そのような設定でテストモード動作させてはいけない回路、デバイスについては、このボタンを押すのはお勧めできません。
EXTEST は連続取り込みには未対応です。SAMPLE(PRELOAD ALL 0)ボタンで動作状態に復帰します。

6/30 : ちょっとだけ(・∀・)になった点。
あからさまにやる気のない shobon-parser を 内蔵 (View 画面、リストビューの右クリックメニューにあります)。
「ごく一部の」 BSDL ファイルから読めるようになりました。「運がよければ」バウンダリスキャンのビットと実際のピン番の対応を BSDL ファイルからもってこれます。

ただしデバイス選択にはまだ使えません。標準で "Device" メニューにないデバイスは、クラス作成の上、リコンパイルしてください。

具体的には、すでに存在するデバイスのクラスは現在 "デバイス名.cs" のような名前になっていますので、これらのソースファイルのどれかをコピーして、追加したいデバイス名のクラスに変更し、中のプロパティの応答のうち数箇所(IR ビット長、バウンダリスキャンレジスタ長、etc...)をいじると、デバイスのクラスが追加できます。

Device メニューへ新規デバイスの追加は、他の Device メニューのハンドラルーチンを参考にしてください。メインフォームへの数行の追加です。

★shobon-JTAG へのデバイス追加の方法のガイド?が新エントリにできました。
shobon-JTAG に新しいデバイスを追加して使ってみる例

6/29 : いくつか問題点(w追加
1)FTDI の USB-Serial チップ、232BM の BitBang モードで(読みながらなのでかなり遅い 約7msec/bit)動くようにいろいろやったが、失敗。IR はよめるが、DR が全部 0 になる。SAMPLE コマンドが正しくセットできていない?のか。原因いまのとこ不明。そのせいでプロジェクトが膨れた。
追記(7/24):これが原因?-「FT232BM で shobon-JTAG できなかったワケ?」
上記でうまくいく?ようなら、速度は 1/1000 ながら、現在 shobon-JTAG においては LPT に頼らない唯一のサポートアダプタ(笑)なので、僕なりに価値はあります。はい。別項にも書いたのですが、JTAG を API でサポートする FT2232 で試してみたいなあ。 だれか恵んでください(笑)。

参考にさせてもらったページ:Bit-Bangモードの使い方

2)まだ SAMPLE のみですが、検査に使えるよう、注目ビットのリストを登録しておき、別画面で監視できるようにした。このビットのリストはセーブ、ロードも可能(ただし対応はバウンダリスキャンのビット番号)。View メニューの ListView の上で右メニューでいろいろいじれる、はず。

View 画面の↓(・ω・)なスクリーンショット(ちと古いです)。

6/23 : ちょっとだけ(・∀・)になった点。
1)XC2S100_TQ144(Spartan2)を追加。
2)デバイスチェーンができるような仮想デバイスクラスを作った。ただしBYPASSとかはまだ考えてない。
3)IR Capture のパターンに 'X' があるときに Invalid になっていたのを修正(したつもり)。
4)変化表示のビット番号が逆になっていたのをとりあえず修正。

6/13 : ちょっとだけ(・∀・)になった点。
1)Xilinx Parallel (ヒューマンデータさんの)互換ケーブルでも動いてるように見えます。
2)Cyclone 以外に XC95144-PQ160 でも試しました。(単に試した、というだけです.....)
3)LPT のベースアドレス、ケーブル種類、デバイス別の SAMPLE コマンドやIRレジスタ長等の選択がハードコードからメニュー選択になりました(デバイスを追加するときにはやっぱりハードコードなわけだが)。

6/12 : shobon-JTAG 初版

posted at: 07:00 | permanent link

Sun, 24 Jul 2005

FT232BM で shobon-JTAG できなかったワケ?

shobon-JTAGのプロジェクトには、Serial というフォルダが含まれています。

これは、FTDI社のFT232BM という USB-TTL Serial 変換 LSI を使う際に、メーカから提供されているドライバのうち、仮想シリアルポート方式(COMn でのアクセス。WindowsのシリアルAPI がそのまま使える利点があるが、市販の USB-Serial 製品にくらべると不安定な印象があります)ではなくて、FDTI 製の API を使用するためのダイレクトドライバ、というものを使って、シリアルターミナルを作ってみよう、という目的で過去に作ったものを、shobon-JTAG のプローブに使えないか?ということで引っ張り出してきて、一部ネイティブの API を呼ぶところだけを流用しているものです。

せっかく含まれているのですが、shobon-JTAGの Cable メニューでは 7/22 現在選択不可になっています(過去のバージョンでも "broken" とかかれている。の下のほう、変更履歴 6/29 を参照ください)。

なぜか。速度はともかく、期待したとおりに安定して動かなかったからです。

ちなみに FTDI 社からは、新しいバージョンの LSI(FT2232C) がでており、それはまさに「JTAG のための API」をネイティブでサポートしているものなので、すでに某雑誌の記事にもなっており、いまさら FT232BM でもないだろう、とか調べてる時間がなかった、とか、いろいろあるのですが、とりあえずプロジェクトに入れたものの、つかえないままほってありました。

ようやく気が向いたので、原因を調査してみたところ、これが原因では?と思われるコトがわかったので書いてみます。電子回路のエライ人にはあたりまえなんでしょうが、気づきませんでした。

まず、shobon-JTAG が作り出す3つの波形をご覧ください。

1)FTDI の石でインフラテスト(IR-Capture)に失敗した際の波形

2)FTDI の石でインフラテスト(IR-Capture)に成功した際の波形

3)LPT ポートドライバ(ByteBlaster)のドライブ波形(参考)

オシロスコープのキャプチャ画面ですが、一番上から TCK(青),TDI(緑),TMS(ピンク),TDO (水色)です。TCK,TDI,TMS は FTDI 側(3)はPCのLPTポート)が作っている信号です。ほぼ同じに見えるはずです。TDO は FPGA の応答です。これは別項で取り上げた CSP-004D に搭載されている Altera の FLEX10K10 (EPF10K10LC84-4) が返してきている波形です。

さて、1)と2)の TDO の違いを生んでいる原因はなんなんでしょう。? ランダムに TDO が 1)だったり(失敗)、2)だったり(成功)するのです。 私には上の3つの波形入力は同じ(まったくではないが)に見えるのに........

おまけに、3)は常に(私の環境では)正常に動作する ByteBlaster を shobon-JTAG で直接 LPT 駆動したときの波形ですが、タイムスケールがほぼ 1000 倍(笑)なのをのぞけば、1)、2)とさほどデジタル的に違うようには思えません。

世の中にはわからないほうがいいこともある。と自分にいいきかせてあきらめかけたのですが、ふと思い立って TCK の立ち上がり波形を比べてみることにしました。

A)ByteBlaster の TCK の立ち上がり波形

B)FTDI の石で作成した TCK の立ち上がり波形

これはあきらかに違っています。
上の全周期を収めたタイムスケールの画面では一見違いがわからなかったのですが......
私にはもうこれくらいしか違いが思い当たりません。

ということで、B)にバッファ(HC244)を通してみたのが下の波形です。

C)FTDI の石で作成した TCK の立ち上がり波形(HC244経由)

キレイに立ち上がるようになりました。立下りは示していませんが、ほぼ同様になまっていたものが、キレイになりました(アタリマエ)。

で、結論ですが、TCK にバッファを入れたとたん、IR-Capture に 100% 成功するようになりました。やっぱりクロックはキレがないといけないんでしょうか?
そういえば ByteBlaster には バッファが入っていますが、レベル変換以外にも、こういう理由のほうが大きいんでしょうか(笑)

それにしても、FTDI の石ですが、無負荷の波形を見ても立ち上がりが同様になまっていました。こんなもんなんでしょうか? リード線は多少(10cm程度)つないで実験してはいますが、あんなになまるものなんですかねぇ。

posted at: 06:12 | permanent link

Sun, 17 Jul 2005

shobon-JTAG に新しいネットリストリーダ?を追加する例

shobon-JTAG は、動作状態、あるいは内部回路と切り離した状態で、FPGA,CPLD 等の JTAG バウンダリスキャン(IEEE 1149.1)対応デバイスのピンの信号レベルをモニタするためのソフトです。

ダウンロード、ChangeLog 等はこちらのエントリからどうぞ。

さて、実際に新しいデバイスを追加しても、信号名称欄がデバイスのIO_xx なんとかではなんの信号をみているのやらわかりません。

現在(2005.7.16)、回路図ファイルからの信号名称の読み取りは、D2CADが出力する Mentor 形式のネットリスト出力をサポートしています(単に情報を取り出しやすいから)が、D2CAD を使用して回路を書いている方ばかりではないでしょうし、FPGA のブレッドボードで遊んでいる僕らがブレッドボードのCADデータやネットリストを持っているわけもありません。

そこで、ここでは Xilinx の無料開発環境 WebPack6 で使用されている UserConstraintファイル?(.ucf)のリーダを shobon-JTAG に追加することで、FPGA の開発環境で使用した信号名称を shobon-JTAG で利用できるように改造してみた例を挙げ、自分の普段使っている開発環境が生成するピン・信号名称ファイル(Constraint ファイル)の読み取り機能を shobon-JTAG に追加するにはどのようにすればいいかをご説明します。

1)shobon-JTAG のプロジェクトの塊をここから落として、VisualStudio.NET で開きます。

2)shobon-JTAG でピン名称(ネット名称)を読み取りたい情報ファイル、今回はsample.ucfを参考にしました。WebPack6 で使用しているものです。まずざっと眺めてみます。


#PACE: Start of PACE I/O Pin Assignments
...
NET "CPLD_XXXX"  LOC = "P13"  ;
...
#

3)なんとなく次のことが推測できました。

A) 行が NET で始まっている。
B) 信号名称が 2 番目のトークン。ダブルクオートで囲まれている。
C) ピン名称が LOC = に続く 5 番目のトークン。ダブルクオートで囲まれている。また頭に P がついている(面倒ですね)。
D) コメント行は # で始まっている。

4)Mentor ネットリストに似ているので、すでに shobon-JTAG に含まれている TinyNetMentor.cs クラスを改造して追加してみます。

5)TinyNetMentor.cs を VS.NET の統合環境のソリューションエクスプローラでコピーして、名称を TinyUcf.cs に変更します。

6)クラス名、コンストラクタを TinyUcf に変更します。

7)実際の1行解釈は


private void create_PIN_MAP(StreamReader sr,string chipname)

です。この中だけ変更すればいいでしょう。 改造点は


A)chipname は今回は必要ないので関連コード全削除(回路図ネットリストでないので)。
B)セパレータをスペースと仮定する。信号名称、ピン名称にスペースがあると誤動作しますが、今回は例なのでほっときましょう。
C)信号名称の行中の位置、パラメータ中の取り出し箇所を以下のように仮定(むりやり)。

// 名前は2番目。1キャラクタ目と最終キャラクタはダブルクオートなので無視
name = param[1].Substring(1,param[1].Length - 2) ;
// ピンは5番目。1キャラクタ目と最終キャラクタはダブルクオートなので無視、
// ピン名称2キャラクタ目の 'P' もジャマそうなので今回無視。
// BGA とかで問題がでそうだ(w
pin  = param[4].Substring(2,param[4].Length - 3) ;
//Console.WriteLine("pin["+pin+"]="+name) ;
pinmap.Add(pin,name) ;			

8)さて、shobon-JTAG にふさわしい(・ω・)なリーダができました。

9)ListView のメニューに組み込んでみます。ViewForm.cs[デザイン] を開き、contextMenu1 のショートカットメニュー編集に "Read Pin-Name Info from Xilinx UCF (shobon-parser)" を追加。

10)ダブルクリックでハンドラを作り、中身を Mentor のとこからコピーしてきて、以下のように編集します。chipname 入力ダイアログ関連はいらないので、削ります。
それにしても、リーダで P を無視して、こっちでは P をくっつけるなんて、ほんとうに(・ω・)ですね。


private void menuItem12_Click(object sender, System.EventArgs e) 
{
  // NETLIST ファイルのオープン
  openFileDialog3.Title = "Open Xilinx UCF File" ;
  openFileDialog3.Filter = "Xilinx UCF File (*.ucf)|*.ucf|All File|*.*" ;
  openFileDialog3.DefaultExt = "*.ucf" ;

  // NETLIST ファイルのオープン
  if (openFileDialog3.ShowDialog() == DialogResult.OK) {
    // NETLIST リーダを起動
    TinyUcf tn= new TinyUcf() ;
    if (tn.readFile(openFileDialog3.FileName) < 0) {
      MessageBox.Show("UCF Parser Abnormally Terminated.","Error") ;
      return ;
    }

    // ピンと NET 名称の対応表を得る
    StringDictionary sd = tn.getPinmap() ;

    // これがあると追加に時間がかかる
    listView1.ListViewItemSorter = null ;

    // ピン番で辞書を引き、対応する NET 名称があるか調べる
    for (int i=0;i<listView1.Items.Count;i++) { // コピペのときは < を < に置き換えてね - wikideitish で<がうまく扱えないため(^^;
      ListViewItem lvi = listView1.Items[i] ;
      PinItem pi = lvi.Tag as PinItem ;
      if (pi != null) {
	string netname = sd[pi.pinno] ;
	
	// 引けないときは先頭の'P'を無視して検索(イカサマ)
	if ((netname == null) && (pi.pinno[0] == 'P')){
	  netname = sd[pi.pinno.Substring(1)] ;
	}

	if (netname != null) {
	  // NET 名称を上書き
	  pi.usertag = netname ;
	  listView1.Items[i] = pi.getListViewItem() ;
	}
      }
    }
  }				
}
11)では、実際に読めるかどうか試してみましょう。
Device を選択、まず ListView に BSDL のピン情報を読みます。今回は XC95144_PQ160 のコンストレイントファイルを使うので、XC95144 の BSDL か、.vfd ファイルです。

12)次に今 10) で作成したメニューで今回参考にしたファイル sample.ucf で試してみます。なんか読めてるようです(・∀・)!!。

13)今回の sample.ucf は読めましたが、適当な作りからわかるように当然ながらいつもうまくいくとは限りません。
WebPack のバージョンが違っていたり、ピン番に "P" がなかったり、また .ucf にピン以外の制約条件があると、誤動作するでしょう。
でも、こんな感じでお気楽に対処できると思われます(・ω・)。

今回の例で追加した xilinx .ucf リーダ が含まれたプロジェクト一式は、 こちらのエントリから落とせます。

posted at: 14:09 | permanent link

shobon-JTAG に新しいデバイスを追加して使ってみる例

shobon-JTAG は、動作状態、あるいは内部回路と切り離した状態で、FPGA,CPLD 等の JTAG バウンダリスキャン(IEEE 1149.1)対応デバイスのピンの信号レベルをモニタするためのソフトです。

ダウンロード、ChangeLog 等はこちらのエントリからどうぞ。

さて、実際に新しいデバイスを追加する具体例として、 偶然手元にあった、Altera の FLEX10K10LC84 が乗っているブレッドボード、HuMANDATA さんの CSP-004 を使うと仮定して、私が実際にコードの追加、変更を進めながら(笑)説明してみます。
実はこのボードは JTAG のサンプルには向いてないことに後で気づくのですが、そこんとこの(・ω・)ぶりは後半で。

1)shobon-JTAG のプロジェクトの塊をここから落として、VisualStudio.NET で開きます。

2)shobon-JTAG でピンの状態をみてみたいデバイス、今回の場合だと FLEX10K10LC84のBSDL ファイル が shobon-JTAG のいいかげんな BSDL パーザで読めるかどうか、あらかじめ試しておきましょう。

といいますのは、もし読めないと、バウンダリスキャンビットとピンの対応を手入力する必要があるので、大変だからです。

具体的に見たい信号が決まっていて、数が少ないから、手入力するから BSDL のピン情報は自動で読めなくてもいいよ、という方はまず 4)以降のステップを先に行ってLSI の応答を確認します。 動作後、空の ListView の右クリックメニューから、Add Item を選択して、ダイアログボックスでバウンダリスキャンビット番号、ピン番号、信号名称を追加してください。ビット情報の保存は 3)項のBSDL からロードした後の .vfd のセーブの説明と同じ操作です。

さて、いまのところ(2005.7.16 時点)BSDLファイルの読み込み機能はデバイス情報と結びついていない(ピン情報のみ)ので、デバイスが違っても BSDL が読めるかどうかは試せます。まず VisualStudio の統合環境上で実行して、Device メニューから適当なデバイスを選び(とりあえず XC95144_PQ160 とかでOK)、View->ShowViewer メニューで空のリストビューを表示させます。アダプタはまだ関係ないので、気にしなくていいです。

3)ListView 上での右クリックメニューから、"Read Info From BSDL File"を選び、上記 URL から落としたファイルを読み込ませて見ます。リストビューに表示が現れると思います。それっぽい表示がでると思います。偶然(笑)読めたようです。
信号名称(ListView の NAME欄)には BSDL ファイルのものが入っていますが、項目を選択してダブルクリックか、右クリックメニューで編集して、DIPSWとか、LED とか実際のネット名称に変更できます。
せっかく読めたのでセーブしておきましょう。右クリックメニューから、"Save ItemInfo" を選び、適当な名前(ここでは CSP004)をつけてセーブします。拡張子は自動的に .vfd になります。XML なので、テキストエディタでも編集可能です。

4)BSDL が読めたので、いよいよデバイスのクラスを作りましょう。
VisualStudio 上で、一旦プログラムを終了した状態にしてください。(本来これから作成するデバイスのクラスがもつ情報は BSDL から自動的に読み取ってそのようなクラスを生成すべきなのですが、自分がつかえればいいジャンクウェアなんで、面倒なのでやってません。)まず適当なデバイス(XC95144_PQ160.cs)を VS.NET の「ソリューションエクスプローラ」でコピー、貼り付け操作をし、 EPF10K10L84.cs という名前に変更します。

5)変更したファイルを開き、まず xc95144_pq160 という文字列(クラス名、コンストラクタ名など)をEPF10K10L84 に置換してしまいます。

6)さきほど2)で Altera サイトからダウンロードした、EPF10K10L84 の BSDL ファイルをテキストエディタなどで開いて眺めながら、このデバイスのパラメータを埋めていきましょう。static StringDictionary CreateInstruction() ですが、これは単にインストラクションの羅列の StringDictionary を作っているだけです。このデバイスのBSDL にはコマンドが 5 つしかありませんので、まねをして書き換えます。


//      "BYPASS  (1111111111), "&
sd.Add( "BYPASS","1111111111") ;
//	"EXTEST  (0000000000), "&
sd.Add( "EXTEST","0000000000") ;
//	"SAMPLE  (0001010101), "&
sd.Add( "SAMPLE","0001010101") ;
//	"IDCODE    (0000000110), "&
sd.Add( "IDCODE",  "0000000110") ;
//	"USERCODE  (0000000111)";
sd.Add( "USERCODE","0000000111") ;

7)ここまでくれば、あとは定数をいくつか書き換えるだけです。
LSINAME: 選択時に表示されます。EPF10K10 等、自分の好きな文字列に。
TAP_SCAN_CLOCK:BSDL ファイルからコピーします。10.00e6。
INSTRUCTION_LENGTH:BSDL ファイルからコピーします。10 ですね。
INSTRUCTION_CAPTURE:BSDL ファイルからコピーします。"0101010101"。
BOUNDARY_LENGTH:BSDL ファイルからコピーします。480 だそう。

8)おつかれさまでした。全体をリビルドして、エラーがないかどうか確かめてください。あとはメインフォームの Device メニューから今作ったデバイスのクラスが選択できるようにするだけです。Form1.cs を開き、Device メニュー(メニューエディタで)に EPF10K10LC84 を追加してください。

9)自動生成されるメニューのハンドラに、以下のコードを追加でおしまいです。


private void menuItem15_Click(object sender, System.EventArgs e) {
	SetDevice(new EPF10K10LC84()) ;				
}
なお、CONFIG ROM などとJTAG のチェインをする場合のために DeviceChain クラスが用意されています。すでにメニューにあるチェインの定義を参考に書いてください。

7/22 追記:デバイスチェイン、動くようです。Viewメニューではその数だけリストビューが開きます。


デバイス 2 つチェインの記述例:Device1->2
	SetDevice(new DeviceChain(new Device1(),new Device2())) ;			

デバイス 3 つのチェインの記述例:Device1->2->3
	SetDevice(new DeviceChain(new Device1() , new DeviceChain(new Device2(),new Device3())) ;			

10)実際に CSP-004 を接続して、試してみましょう。リビルドして実行、Device メニューから、9)で追加したばかりの EPF10K10LC84 を選択して、Cable は ByteBlasterMV だからデフォルト、LPT アドレスは Windows デバイスマネージャで表示される占有ポートの先頭アドレスを選択します。0x3BC がデフォルトですが、これは単に私が便利なようにそうなっているだけです。面倒な方は、自分が使うマシンに応じてソースを変更してください。

11)で、Back To Run-Test/Idle をクリック後、Capture-IR。あれ、1111111111 ? ん? よめないじゃん(・ω・)

12)よくよく取り説を読むと、CSP-004 は、JTAG コンフィグではないのですね。付属のケーブルを使った標準の接続では FPGA の JTAG ピンには繋がってないのですね、はは。大間抜け。

13)かなり(・ω・)な気分ですが、FPGA の JTAG 用信号ピン自体は CSP004 のコネクタ(CN3,CN4)に出ていますので、無理やりつないで実験してみました。
※オプションの EPC2 を実装している方はこの方法は使えません(多分)

むりやり接続法

A)HC244 の近くにあるジャンパ(JP6)をすべて 2-3 側につなぎ変えます。

B)回路図をみるとわかりますが、もともと Option の EPC2 にコンフィグするために JTAG の接続が JP6 にきています。JP6 の基板の1-2-3の刻印がある側から、TCK,TDO,TMS、ひとつおいて TDI になります。

C)手元にあったブレッドボード(CSP004 のことじゃなく、穴一杯のやつです)用のジャンパ線で、TCK<=>(CN4-5)、TDO<=>(CN4-9)、TMS<=>(CN4-26)、TDI<=>(CN3-21)と接続、電源を入れます。

D)こんどはちゃんと IR-Capture 成功しました(あたりまえですね)。

E)さきほど3)で作った CSP004.vfd を View->ShowViewer メニューで表示される ListView 上の右クリックメニュー LoadItemInfo から読み込んでやります。SAMPLE ボタンを押すと、信号レベルが表示されました(・∀・)

F)Continuous にチェックを入れてから SAMPLE すると、PUSHSW を押すと信号レベル表示が変わるのが確認できました。(連続 SAMPLE 解除はチェックをはずす)

追記:実際に CSP-004 を JTAG で運用(コンフィグも)するには、JP6をすべて 2-3 側に接続した上で、EPC2 コネクタと FPAG の JTAG 信号該当箇所にピンヘッダや丸ピンコネクタを設置してクリップやブレッドボード用ジャンパで接続するか、基板裏でワイヤでジャンパするなどして、安定して接続できるようにすると便利です。
(参考図):CSP-004 JTAG 化用、EPC2 コネクタ部参考資料 PDF

14)かなり間抜けな結果でしたが、自分で使うデバイスやブレッドボードを追加する方法はなんとなく分かるかと思います。shobon-JTAG ともども、なにかの参考になれば幸いです。

今回追加した EPF10K10LC84 が含まれたプロジェクト一式は、 こちらのエントリから落とせます。

posted at: 03:04 | permanent link