電源はJTAGケーブルから供給出来るわけないか。ByteBlasterとは別に、5V電源を接続してみる。Cableでもやってみる。instruction全然、無問題でした。デバイス情報の設定デバイスがUnknownになっているのは、デバイス情報が無いかららしいので、BSDLファイルって奴でデバイス情報を設定する。→参考XC9572のBSDLファイルは、XilinxのISEをインストールしてあれば、Windowsの場合は、C:\Xilinxフォルダにインストールされている。以下のように、BSDLをdumpして、UrJTAGのデータ形式にする。*dump結果を、/usr/local/share/urjteg/下のベンダ毎のフォルダに保存する。この場合xilinx/xc9572_pc44/フォルダを作成、xc9572_pc44というファイルに保存しておく。あとから気が付いたけど、dumpコマンドより、もっといい方法があった。これなら直接UrJTAG用のデータが作れる。xc9572_pc44元々のBSDLファイルに、以下のような記述がある。standardこれは、IDCODEの各bit毎に以下のように設定されていることを示すらしい。以下のように、部品番号、ディレクトリ名、デバイス名を記述する。stepping!になってしまう。これは嫌なので、0000から0001、0010と順に変えてdetectしたら、0010でちゃんと表示された。/usr/local/share/urjtag/xilinx/xc9572_pc44/xc9572_pc44これで、XC9500_PC44の登録は完了!1PRO版はスクリプトが使えるし、BASIC版はSVFプレイヤーで出来ると思う。[top]BSDLファイルBSDLファイルは、VHDLみたいなファイルで、JTAGデバイスのピン情報が記述してある。BSDLの読み方については、Interface2005年3月号のJTAG徹底活用研究が参考になる。基本的には、PIN_MAPでピンに対応する信号名を調べて、BOUNDARY_REGISTERで信号名に対応するレジスタ番号を調べれば良い。XilinxのXC9572-PC44のBSDLファイルを見てみる。PIN_MAP内部の信号名と、ピン番号の対応を定義している。PB00_01という信号は1ピンに、PB00_04という信号は2ピンに接続されていることを示している。"VSSIO_2:31";最後のTCK,TDI,TDO,TMSは、JTAG接続用の信号。VCCが付くのは電源、VSSが付くのはGNDを示す。BOUNDARY_LENGTHBOUNDARY_LENGTHで、パウンダリスキャンのレジスタ数が分かる。216;まぁ、これはBOUNDARY_REGISTERで使っている最大のレジスタ番号をみれば分かるんだけど。BOUNDARY_REGISTER各バウンダリスキャンレジスタの仕様が記述されている。&この3行が、PB00_01に関連する3つのスキャンレジスタの仕様になっている。レジスタ212は、BC_1構造、信号名PB00_01の入力レジスタ、Xは、たぶんバウンダリスキャン時以外は、設定値は何でも良いということ。レジスタ211は、BC_1構造、信号名PB00_01のトライステート出力レジスタ、この出力はレジスタ210で0を設定するとHi-Zになる。レジスタ210は、BC_1構造、信号名不明のコントロールレジスタ(レジスタ211の出力コントロールを行う)、バウンダリスキャン時以外は0に設定しなければならない。1ピンから入力したデータはレジスタ212に設定され、レジスタ211に設定したデータは、レジスタ210を1にするこどで、1ピンに出力される。バウンダリスキャンレジスタは、標準的には1ピンのI/Oで3個づつ使用するらしい。internalというのは、I/O以外の内部レジスタの設定・読込みが出来るらしいが、これは良く分からない。XC9572のピンとレジスタの関係JTAG関連と電源以外のピン接続バウンダリスキャン時に接続された配線を間違えないように表にしてみた。70[top]バウンダリスキャンしてみるバウンダリスキャンが動作するかどうか確認してみる。こちらを参考にというか、そのまんまでやってみました。IDCODE出力IDCODEというコマンドで、前述のIDコードを出力してみる。dr00101001010100000100000010010011バージョンが0010になってることが分かる。dr100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100216個のバウンダリスキャンレジスタの値が出力される。これは、MSBファーストなので、レジスタ215,214,213,...,2,1,0の順に出力されている。全端子に何も接続しない状態では、'100'が単に72回繰り返されているだけになっている。このことから、I/Oに接続されていないinternalのレジスタも、3個1組で1つの信号の制御を行っていると思われる。EXTESTEXTESTで、ピン状態を設定して出力する。SAMPLEコマンドで読込んだ216個のバウンダリスキャンレジスタの値を、I/Oピンの設定を書換えて書込んでみる。drちゃんとI/O出力が変化することを確認出来た。internalなレジスタには、'100'を出力するようにした。I/Oをイイカゲンに設定するとI/Oに接続された回路によっては、CPLDを破壊する可能性があるので、要注意!やってみると、バウンダリスキャンって簡単だ。[top]スクリプトで実行ここまで来れば、スクリプト実行も簡単だ!と思ったら、嵌まってしまった。スクリプト実行でエラーEXTESTの設定内容を、そのままファイル化して、Unixコマンドラインで実行してみた。mismatch1行が100文字を超えると、削られてしまうらしい。これって、OSの制限?でも、100文字って少な過ぎない?でも、jtag>プロンプトが出てる状態で、設定を貼り付ければ実行出来るんだから、プログラムの制限じゃないと思うんだけど。SVFとかで記述すれば、イケるのかなぁ。SVFも良くわかんないしなぁ。なんか、もう少しだと思うんだけどなぁ。プログラム変更Ubuntuなので、bashだと思うんだけど、文字制限100文字なんて聞いたことないなぁ。bash関連、UrJTAG関連、いろいろググったけど全然分からない。jtagのソースを確認してみたら、src/cmd/parse.cで制限掛かってるみたい。理由があって制限してるんだと思うんだけど。ここらへんは自己責任で、MAXINPUTLINEが100になってるのを、255に変更してmakeし直してみた。再インストールすると、PARTSファイルが壊れるので、XC9572PC44は登録し直し。/usr/local/share/urjtag/xilinx/xc9572_pc44/xc9572_pc44100101100100101101100101101100101100100111101100101100100101100100101101100101101100111100100101101100101100100100100100101100100101101100101100100101101100101100100101100100101100100101101100101100100101101100101100今度は通った!ちゃんと設定されてるみたい。なんか副作用があるかもしれないけど、、まぁいいや。試しスクリプトPIN7,PIN8,PIN9,PIN39端子に、順に1を出力するスクリプトを書いてみた。単純にEXTESTで、端子の設定をしてから、1秒待ってまた次の設定をするのを繰り返すだけ。1000000動かしてみると、最初ちょっと変なのが出るけど、ちゃんと順に1が出力された。[top]スクリプト元々の目的のメモリの書込みのスクリプトを全部手で書くのは無理なので、perlでスクリプトを書いてみる。最初は、ケーブル設定を行って、DETECTコマンドでデバイスを確認する。いっても、表示だけで実際確認してるわけじゃないけど。"\n";}スキャンレジスタの設定3ビット毎のデータを設定するサブルーチンを単純に72個並べてみた。イイカゲンな作りだけど、まぁ簡単に書き込むのが目的だから良いか。&xxx(-1);}メモリ書込みルーチンスキャンレジスタ設定してから、EXTESTでメモリの書込みを行う。単純に1ms待つだけにした。書込みチェックは後で読み込んで確認するということで。&extest($A,$D,0,1,1);}メモリ書込みメインルーチンこれがメモリ書込みのメインルーチン仮に、0〜3番地に、0〜3のデータを書いてみる。1;&header;&write_mem(0,0);&write_mem(1,1);&write_mem(2,2);&write_mem(3,3);end;1アドレス書くのに、約10msとして、2MB(262144byte)で、約2621秒。書込みのWait時間多すぎの気がするが、まぁ1時間掛からないから、良いか。