前回の続き。前回はハードウェアデザインまで作成したのだが、直後に自作したIPが壊れてしまい、環境を構築しなおしたのだった。
さらに、ZedBoardのADV7511の環境を引っ張ってきた場合、ブロックデザインのsystem.vまではLEDの出力ポートが生成されるのだが、そこから先のi_system_wrapperであるとか、さらに上位のsystem_topには反映されないということが分かり、デザインの修正を行う必要が出てきた。
ZedBoardのLEDはどのポートに割り付けられているのか?
zed_system_constr.xdcを見てみると、以下のポートがZedBoardのLEDに割り付けられていることが分かった。
set_property -dict {PACKAGE_PIN T22 IOSTANDARD LVCMOS33} [get_ports gpio_bd[19]] ; ## LD0 set_property -dict {PACKAGE_PIN T21 IOSTANDARD LVCMOS33} [get_ports gpio_bd[20]] ; ## LD1 set_property -dict {PACKAGE_PIN U22 IOSTANDARD LVCMOS33} [get_ports gpio_bd[21]] ; ## LD2 set_property -dict {PACKAGE_PIN U21 IOSTANDARD LVCMOS33} [get_ports gpio_bd[22]] ; ## LD3 set_property -dict {PACKAGE_PIN V22 IOSTANDARD LVCMOS33} [get_ports gpio_bd[23]] ; ## LD4 set_property -dict {PACKAGE_PIN W22 IOSTANDARD LVCMOS33} [get_ports gpio_bd[24]] ; ## LD5 set_property -dict {PACKAGE_PIN U19 IOSTANDARD LVCMOS33} [get_ports gpio_bd[25]] ; ## LD6 set_property -dict {PACKAGE_PIN U14 IOSTANDARD LVCMOS33} [get_ports gpio_bd[26]] ; ## LD7
このうち下位の4bit、gpio_bd[22:19]
までを自作IPの出力ポートとして利用したい。したがって、これらをコメントアウトし、新しいポートを接続することになる。
#set_property -dict {PACKAGE_PIN T22 IOSTANDARD LVCMOS33} [get_ports gpio_bd[19]] ; ## LD0 #set_property -dict {PACKAGE_PIN T21 IOSTANDARD LVCMOS33} [get_ports gpio_bd[20]] ; ## LD1 #set_property -dict {PACKAGE_PIN U22 IOSTANDARD LVCMOS33} [get_ports gpio_bd[21]] ; ## LD2 #set_property -dict {PACKAGE_PIN U21 IOSTANDARD LVCMOS33} [get_ports gpio_bd[22]] ; ## LD3 set_property -dict {PACKAGE_PIN V22 IOSTANDARD LVCMOS33} [get_ports gpio_bd[19]] ; ## LD4 set_property -dict {PACKAGE_PIN W22 IOSTANDARD LVCMOS33} [get_ports gpio_bd[20]] ; ## LD5 set_property -dict {PACKAGE_PIN U19 IOSTANDARD LVCMOS33} [get_ports gpio_bd[21]] ; ## LD6 set_property -dict {PACKAGE_PIN U14 IOSTANDARD LVCMOS33} [get_ports gpio_bd[22]] ; ## LD7 set_property -dict {PACKAGE_PIN T22 IOSTANDARD LVCMOS33} [get_ports led[0]] ; ## LD0 set_property -dict {PACKAGE_PIN T21 IOSTANDARD LVCMOS33} [get_ports led[1]] ; ## LD1 set_property -dict {PACKAGE_PIN U22 IOSTANDARD LVCMOS33} [get_ports led[2]] ; ## LD2 set_property -dict {PACKAGE_PIN U21 IOSTANDARD LVCMOS33} [get_ports led[3]] ; ## LD3
その際、gpio_bd
のポート位置もずらしていった。gpio_bdのポート数は32本から28本になるので、デザインも少し書き換える。
具体的には、system_top.vのgpioの双方向ポートの制御を以下のように変更し、28本に対応させた。
- 変更前
ad_iobuf #( .DATA_WIDTH(28) ) i_iobuf ( .dio_t(gpio_t), .dio_i(gpio_o), .dio_o(gpio_i), .dio_p(pio_bd));
- 変更後
ad_iobuf #( .DATA_WIDTH(28) ) i_iobuf ( .dio_t({gpio_t[31:23], gpio_t[18:0]}), .dio_i({gpio_o[31:23], gpio_o[18:0]}), .dio_o({gpio_i[31:23], gpio_i[18:0]}), .dio_p(gpio_bd[23:0]));
上記の変更を行い、ハードウェアの再合成、bitstreamの生成を行ったうえで、ソフトウェアデザインへのエクスポートを行い、SDKを立ち上げた(この辺の作業は省略)。
ZedBoard用U-Bootのビルド
U-Bootのビルド方法は以下に従う。
source /opt/Xilinx/SDK/2017.1/settings64.sh git clone https://github.com/DigilentInc/u-boot-Digilent-Dev.git cd u-boot-Digilent-Dev/ git checkout master-next source /opt/Xilinx/SDK/2017.1/settings64.sh sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- zynq_zed_config make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi-
ZedBoard向けLinuxのビルド
同様に、ZedBoard向けのLinuxのビルドは以下の手順に従った。
sudo apt install u-boot-tools git clone https://github.com/DigilentInc/Linux-Digilent-Dev.git cd Linux-Digilent-Dev git checkout master-next make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- xilinx_zynq_defconfig make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- UIMAGE_LOADADDR=0x8000 uImage
以下のメッセージが出て、Linuxが生成された。
CHK include/config/kernel.release CHK include/generated/uapi/linux/version.h CHK include/generated/utsrelease.h make[1]: 'include/generated/mach-types.h' は更新済みです. CALL scripts/checksyscalls.sh CHK include/generated/compile.h CHK kernel/config_data.h Kernel: arch/arm/boot/Image is ready Kernel: arch/arm/boot/zImage is ready UIMAGE arch/arm/boot/uImage Image Name: Linux-3.18.0-xilinx-46110-gd627f Created: Thu May 25 00:23:21 2017 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 3447872 Bytes = 3367.06 kB = 3.29 MB Load Address: 00008000 Entry Point: 00008000 Image arch/arm/boot/uImage is ready