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