FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://sites.google.com/site/fpgadevelopindex/

VivadoでIPを生成する方法の調査(VivadoのIPインテグレーションの仕組み調査3. tclを用いた自動化の調査)

f:id:msyksphinz:20170723164014p:plain

Vivadoで生成したIPを接続してVivadoプロジェクトをビルドし、SDカードに書き込むことでブートできるようになった。

f:id:msyksphinz:20170726005913p:plain

物理デバイスにアクセスしてBlockRAMとして制御できているか確認する。 書き込んだ値が読めている。またアドレス毎に別々に値が読み書きできていることから、BlockRAMとしてきちんと動作できていることが分かる。

f:id:msyksphinz:20170726010447p:plain

  • devmem2 について

armadillo.atmark-techno.com

さて、ここまでは良いとして、いちいちGUIを立ち上げるのは面倒なので、どうにかしてtcl化したい。

いろいろ参考にしているが、主にQiitaの記事を参考にしている。

qiita.com

qiita.com

Vivadoプロジェクトのビルド後に、ハードウェアをエクスポートするのもスクリプト化しておく。まさしく上記の記事がドンピシャだ。

以下のようなプロジェクトを作成した。

github.com

  • create_hdf.tcl
set project_directory   [file dirname [info script]]
set hw_name             "system_top_hw_platform_0"
set project_name adv7511_zed

open_project [file join $project_directory $project_name]

set project_directory [file dirname [info script]]
set sdk_workspace  [file join $project_directory $project_name.sdk]

if { [file exists [file join $sdk_workspace $hw_name]] == 0 } {
    file mkdir [file join $sdk_workspace $hw_name]
}
set design_top_name [get_property "top" [current_fileset]]
file copy -force [file join $project_directory $project_name.runs "impl_1" $design_top_name.sysdef] [file join $sdk_workspace $hw_name $design_top_name.hdf]

close_project

次に、SDKを走らせてfsbl.elfを作成する。こちらもスクリプト化してある。

  • ceate_fsbl.tcl
#!/usr/bin/tclsh

set app_name            "fsbl"
set app_type            {Zynq FSBL}
set bsp_name            "fsbl_bsp"
set hw_name             "system_top_hw_platform_0"
set hwspec_file         "system_top.hdf"
set proc_name           "ps7_cortexa9_0"
set project_directory   [file dirname [info script]]
set sdk_workspace       [file join $project_directory "adv7511_zed.sdk"]

if {[info commands sdk::setws] ne ""} {
    sdk setws         $sdk_workspace
} else {
    sdk set_workspace $sdk_workspace
}

if {[info commands sdk::createhw] ne ""} {
    sdk createhw          -name $hw_name -hwspec [file join $sdk_workspace $hwspec_file]
} else {
    sdk create_hw_project -name $hw_name -hwspec [file join $sdk_workspace $hwspec_file]
}

hsi::open_hw_design  [file join $sdk_workspace $hw_name $hwspec_file]
hsi::create_sw_design $bsp_name -proc $proc_name -os standalone
hsi::add_library xilffs
hsi::generate_bsp -sw $bsp_name -dir [file join $sdk_workspace $bsp_name] -compile
hsi::close_sw_design  $bsp_name

if {[info commands sdk::createapp] ne ""} {
    sdk createapp          -name $app_name -hwproject $hw_name -proc $proc_name -os standalone -lang C -app $app_type -bsp $bsp_name
} else {
    sdk create_app_project -name $app_name -hwproject $hw_name -proc $proc_name -os standalone -lang C -app $app_type -bsp $bsp_name
}

if {[info commands sdk::projects] ne ""} {
    sdk projects -build
} else {
    sdk build_project $app_name
}

exit

boot.binの作成も上記のQiitaの要領だ。とても役に立つ!

bootgen:
        bootgen -image ./boot.bif -o i boot.bin

boot.bifは以下のように記述した。

image : {
        [bootloader]./adv7511_zed.sdk/fsbl/Debug/fsbl.elf
        ./adv7511_zed.sdk/system_top_hw_platform_0/system_top.bit
        ../../../../u-boot-xlnx/u-boot.elf
}