Sun, 17 Jul 2005
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 をくっつけるなんて、ほんとうに(・ω・)ですね。
11)では、実際に読めるかどうか試してみましょう。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() ; } } } } }
Device を選択、まず ListView に BSDL のピン情報を読みます。今回は XC95144_PQ160 のコンストレイントファイルを使うので、XC95144 の BSDL か、.vfd ファイルです。
12)次に今 10) で作成したメニューで今回参考にしたファイル sample.ucf で試してみます。なんか読めてるようです(・∀・)!!。
13)今回の sample.ucf は読めましたが、適当な作りからわかるように当然ながらいつもうまくいくとは限りません。
WebPack のバージョンが違っていたり、ピン番に "P" がなかったり、また .ucf にピン以外の制約条件があると、誤動作するでしょう。
でも、こんな感じでお気楽に対処できると思われます(・ω・)。
今回の例で追加した xilinx .ucf リーダ が含まれたプロジェクト一式は、
こちらのエントリから落とせます。