FPGA開発日記

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

yuki-sato.comの「LinuxからFPGAを使ってみる」をやってみる (ZedBoard版 #4)

前回の続き。前回はハードウェアデザインまで作成したのだが、直後に自作したIPが壊れてしまい、環境を構築しなおしたのだった。

さらに、ZedBoardのADV7511の環境を引っ張ってきた場合、ブロックデザインのsystem.vまではLEDの出力ポートが生成されるのだが、そこから先のi_system_wrapperであるとか、さらに上位のsystem_topには反映されないということが分かり、デザインの修正を行う必要が出てきた。

f:id:msyksphinz:20170525001728p:plain

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

関連記事

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com