FC2カウンター FPGAの部屋 ChipScope ProのVIOをtclスクリプトで制御
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

ChipScope ProのVIOをtclスクリプトで制御

ChipScope ProのVIOを使う1”と”ChipScope ProのVIOを使う2”で、ChipScopeのVIOを使って、アドレスを入力してデータをChipScope Analyzer上に表示する方法を書いた。
今回は、ChipScopeのVIOをtclスクリプトから制御して、プログラムでアドレスを連続に入力しながら、出力されたデータをファイルに書き出す方法を書こうと思う。使用したISEのバージョンは12.1。

今回、参照したマニュアルや文献は、最初に、”ChipScope Pro 12.1 ソフトウェアおよびコア ユーザー ガイド (英語版)"の171ページ、”ChipScope Engine Tcl Interface”と”ChipScope Engine Tcl interface”。日本語の情報は検索で出てこなかった。このブログがChipScope ProのVIOをtclで使う方法の最初の日本語の情報かも?

さて、tclスクリプトでのVIOを使うサンプルが、ISE12.1のインストールフォルダのXilinx\12.1\ISE_DS\ISE\cse\tcl の下にある。csevio_example1.tcl がそれだ。これを、ユーザーガイドに書いてあるように、コマンド・プロンプトから下のコマンドを入力すると起動できる。(Platform Cable USBなどのUSB接続のダウンロード・ケーブルの場合)

<XILINX_ISE_INSTALL>\bin\nt\xtclsh csevio_example1.tcl -usb


起動すると、FPGAのVIOのいろいろな情報が表示される。
このサンプルを元に、”ChipScope ProのVIOを使う1”と”ChipScope ProのVIOを使う2”で、使用したサンプルで、VIOでアドレスを回路に出力して、データを連続的に取得して、ファイルに書き出す。作るデータ・ファイルは、a.txt, h.txt, v.txt, d.txt。csevio_example1.tcl を参考にして、csevio_example1.tcl を書き換えて作ってあるため、全部を載せることは出来ない。
下に、書き換えたあたりのソースを示す(あくまでイメージとしてみてください。全ソースではないです)。

proc scanDevice {handle deviceIndex} {
...
    global str_a
    global str_h
    global str_v
    global str_d
...
    if {$deviceIndex == 0 } {
        # scanDeviceの前にa, h, v, dのデータを格納するファイルをオープンする
        set file_a [open a.txt w]
        set file_h [open h.txt w]
        set file_v [open v.txt w]
        set file_d [open d.txt w]
        
        set VIOSyncInputLimit 0x7f
        
        for {set VIOSyncInputVal 0} {$VIOSyncInputVal <= $VIOSyncInputLimit} {incr VIOSyncInputVal} {
...
            }
            puts $file_a $str_a
            puts $file_h $str_h
            puts $file_v $str_v
            puts $file_d $str_d
        }
            
        #file closed
        puts "File Closed"
        close $file_a
        close $file_h
        close $file_v
        close $file_d
    } else {
...
proc scanVIOCore { handle coreRef } {
    csevio_define_bus $handle $coreRef "status" $CSEVIO_SYNC_INPUT [list 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75]
    
    if {[lindex $coreRef 2] == 0} { # coreIndex
        csevio_define_bus $handle $coreRef "address" $CSEVIO_SYNC_OUTPUT [list 0 1 2 3 4 5 6]
        set str [format "%.2x" $VIOSyncInputVal]
        set outputTclArray(address) $str
        puts "outputTclArray(address) = $str"
        csevio_write_values $handle $coreRef outputTclArray
        after 100
    }
    csevio_read_values $handle $coreRef inputTclArray
    set str $inputTclArray(status.value)
    puts "VIOSyncInputVal = $VIOSyncInputVal"
    if {[lindex $coreRef 2] == 0} { # coreIndex    
        set str_a $str
    } elseif {[lindex $coreRef 2] == 1} { # coreIndex
        set str_h $str
    } elseif {[lindex $coreRef 2] == 2} { # coreIndex
        set str_v $str
    } elseif {[lindex $coreRef 2] == 3} { # coreIndex
        set str_d $str
    }
...


下に、このtclスクリプトを起動した時の表示を示す。
VIO_tcl_1_100723.png

これで、a.txt, h.txt, v.txt, d.txtにデータが書き込まれた。ちなみにh.txtの最初の10行を下に示す。

021160A6D8191B84B5B
003B600E40022980A1F
0011C00348007780197
0008A001A4002B80092
0005A000F8001C8003E
00052000D800128002D
000420008C000D0002D
0001600034000400021
0000000008000080000
0000C00024000100005


ChipScopeのVIOをtclスクリプトから制御して、プログラムでアドレスを連続に入力しながら、出力されたデータをファイルに書き出すことができた。これで、いろいろとデータを便利に取得することができると思う。
#どうだろうか?情報が少なくて、1週間悩んだ、取って置きの情報を開示した(つもり)。もし使っていらっしゃる方がいらしたら、情報交換しましょう。と言うか、教えてください。
  1. 2010年07月23日 14:14 |
  2. Chipscope
  3. | トラックバック:0
  4. | コメント:2

コメント

こんにちは。

この機能は凄い便利そうですね。
最近Xilinxは使用していないので直ぐには試せませんが、ALTERAでも是非に欲しい機能です。
ALTERAにもInSystemSource&Probeという似た機能がありますが、
TCLからは制御はできません。(最新の10.1なら、もしかしたら・・・)
速度は遅いかもしれませんがデバッグ時には便利そうです。

貴重な情報で参考にさせていただきます。
  1. 2010/07/26(月) 10:17:53 |
  2. URL |
  3. まさ #mQop/nM.
  4. [ 編集 ]

まささん、こんにちは。
とても便利な機能です。これで、例えば、CMOSカメラで取得した1フレーム分の画像データをBMPフォーマットとかに変換することができると思います。つまり、画像データを付加ハードウェアなしにキャプチャすることができます。少し時間はかかりますが。。。
  1. 2010/07/26(月) 11:50:23 |
  2. URL |
  3. marsee #f1oWVgn2
  4. [ 編集 ]

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/1532-620402f5
この記事にトラックバックする(FC2ブログユーザー)