トップ 一覧 Farm 検索 ヘルプ RSS ログイン

Diary/2022-11-3の変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!tclでVivado HW Manager

試した環境は,ちょっと古くて,Vivado 2020.1.
ターゲット→デバイスっていう関係に注意してアクセスするといい.
USBで接続されているターゲットの情報は
 get_hw_targets # 接続されてるFPGAユニットのリストがとれる
 get_hw_targets {*/500202A503FAA} # で名前でフィルタリングできる
で取れる.open_hw_targetで
 open_hw_target [get_hw_targets {*/500202A503FAA}]
などとしてターゲットを開いたら,
 get_hw_devices
でFPGAにアクセスできるようになる.
get_hw_devicesは,同じ種類のFPGAがたくさんUSB接続下にいる場合,
連番のサフィックスがつくので注意.
一つしかなければ,get_hw_devicesの返り値が一つだから問題ないけど複数だとちょっと厄介.
複数でも名前でわかりやすく区別できればサフィックス以外でフィルタリングして
 get_hw_devices {*xcu50*}
とかして選別できる.
そうじゃない場合,順番気にしないといけなそうで,ちょっと面倒そう.


::例0: 接続されているアダプタの識別子リストを得る
 open_hw_manager
 connect_hw_server -allow_non_jtag
 puts [get_hw_targets]
 disconnect_hw_server
 close_hw_manager
 quit


::例1: 狙ったプログラミングアダプタに接続されたFPGA(Alveo U50)をROMから起動する
プログラミングアダプタの識別子が環境変数 ADAPTER で定義されていて,
その先にはAlveo U50が接続されていることを想定.
 open_hw_manager
 connect_hw_server -allow_non_jtag
 set adapter ""
 append adapter "*/" $::env(ADAPTER)
 set target [get_hw_targets -quiet $adapter]; # 以降 $target で参照できる
 if {[string equal $target ""]} {
   disconnect_hw_server
   close_hw_manager
   quit
 }
 open_hw_target $target; # これでターゲットに接続
 set dev [current_hw_device [get_hw_devices -quiet {*50*}]]; # 念の為にAlveo U50を選別できるように
                                                           ; # 以降 $dev で参照できる
 if {[string equal $dev ""]} {
   close_hw_target $target
   disconnect_hw_server
   close_hw_manager
   quit
 }
 boot_hw_device [lindex $dev 0]; # ROMから起動
 # 後片付け
 close_hw_target $target
 disconnect_hw_server
 close_hw_manager
 quit


::例2: 狙ったプログラミングアダプタに接続されたFPGA(Alveo U50)のROMにMCSを書き込む
プログラミングアダプタの識別子が環境変数 ADAPTER で定義されていて
その先にはAlveo U50が接続されていること,および,
書き込むMCSファイルは環境変数 MCSFILE で定義されていること,を想定.
Alveo U50想定ということで,ROMは mt25qu01g-spi-x1_x2_x4 のはず,という想定.
 open_hw_manager
 connect_hw_server -allow_non_jtag
 set adapter ""
 append adapter "*/" $::env(ADAPTER)
 set target [get_hw_targets -quiet $adapter]; # 以降 $target で参照できる
 if {[string equal $target ""]} {
   disconnect_hw_server
   close_hw_manager
   quit
 }
 open_hw_target $target; # これでターゲットに接続
 set dev [current_hw_device [get_hw_devices -quiet {*50*}]]; # 念の為にAlveo U50を選別できるように
                                                           ; # 以降 $dev で参照できる
 if {[string equal $dev ""]} {
   close_hw_target $target
   disconnect_hw_server
   close_hw_manager
   quit
 }
 # ここからROMの設定
 create_hw_cfgmem -hw_device $dev [lindex [get_cfgmem_parts {mt25qu01g-spi-x1_x2_x4}] 0]
 set_property PROGRAM.ADDRESS_RANGE  {use_file} [ get_property PROGRAM.HW_CFGMEM $dev]
 set_property PROGRAM.FILES $::env(MCSFILE) [ get_property PROGRAM.HW_CFGMEM $dev]
 set_property PROGRAM.PRM_FILE {} [ get_property PROGRAM.HW_CFGMEM $dev]
 set_property PROGRAM.UNUSED_PIN_TERMINATION {pull-none} [ get_property PROGRAM.HW_CFGMEM $dev]
 set_property PROGRAM.BLANK_CHECK 0 [ get_property PROGRAM.HW_CFGMEM $dev]
 set_property PROGRAM.ERASE       1 [ get_property PROGRAM.HW_CFGMEM $dev]
 set_property PROGRAM.CFG_PROGRAM 1 [ get_property PROGRAM.HW_CFGMEM $dev]
 set_property PROGRAM.VERIFY      1 [ get_property PROGRAM.HW_CFGMEM $dev]
 set_property PROGRAM.CHECKSUM    0 [ get_property PROGRAM.HW_CFGMEM $dev]
 # ROM書き込み用bitファイルの書き込み
 create_hw_bitstream -hw_device $dev [get_property PROGRAM.HW_CFGMEM_BITFILE $dev]
 program_hw_devices $dev
 # ROM書き込み
 program_hw_cfgmem -hw_cfgmem [ get_property PROGRAM.HW_CFGMEM $dev]
 # 後片付け
 close_hw_target $target
 disconnect_hw_server
 close_hw_manager
 quit