Vivadoで生成したIPを接続してVivadoプロジェクトをビルドし、SDカードに書き込むことでブートできるようになった。
物理デバイスにアクセスしてBlockRAMとして制御できているか確認する。 書き込んだ値が読めている。またアドレス毎に別々に値が読み書きできていることから、BlockRAMとしてきちんと動作できていることが分かる。
- devmem2 について
さて、ここまでは良いとして、いちいちGUIを立ち上げるのは面倒なので、どうにかしてtcl化したい。
いろいろ参考にしているが、主にQiitaの記事を参考にしている。
Vivadoプロジェクトのビルド後に、ハードウェアをエクスポートするのもスクリプト化しておく。まさしく上記の記事がドンピシャだ。
以下のようなプロジェクトを作成した。
- 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 }