zynq-7000系列基于zynq-zed的vivado初步设计
作者:卢浩
时间:2017.2.13
转载请注明出处
嵌入式爱好者开发群:122879839
大家都知道,zynq的核心,是arm与fpga互相配合,才能发挥出zynq的长处,如果只是用zynq来做arm处理器的话,有点杀鸡用牛刀的感觉。
来,开始设计吧。
首先打开vivado,open Example project,选择Embedded Design.接下来Base Zynq Design,选择Zedboard,然后finish.
如图:
这是一个demo设计,我们可以看到PL段默认是扩展了AXI GPIO的,8位的LED。我们先来个简单的,在linux下控制PL端扩展的8位LED。
直接综合设计,Run Implementation.结束后打开设计,进行约束,如图:
我们可以看到8位LEDpin配置已经配置好了,这是demo板的,bank电压也是配置好的,3V3,大家可以根据自己的实际情况,进行配置。
接下来生成BIT文件,Generate Bitstreadm.生成BIT文件之后,FILE->Export->Export Hardware,如图:
接下来File->Launch SDK,从vivado打开SDK软件,
File->NEW->Application project,project name输入fsbl,我们要生成一个FSBL文件,这里大概说一下zynq的启动,BOOTROM->FSBL->BIT->UBOOT->DTS->KERNEL->FILESYSTEM.
选择NEXT->Zynq FSBL,然后Finish.如图:
右键FSBL,如图:
选择release。
编译生成fsbl.elf文件。
接下来右键fsbl,点击Create Boot Image.这一步是生成BOOT.BIN。如图:
这个uboot.elf文件就是之前编译uboot生成的。点击Create image生成BOOT.BIN。
可以看到生成的BOOT.bin文件。
接下来我们需要借助SDK生成DTS文件,熟悉DTS的工程师,可以直接去dts文件里面添加相关的GPIO信息,这一步也可以省去。
里面的内容可以去git上下载,链接:https://github.com/Xilinx/device-tree-xlnx/releases
注意看一下我的环境变量的设置,目录名称的设置。不要搞错。
接下来生成dtb文件,FILE->New->Board Support Package
如图,然后点击finish。
可以看到PL扩展的GPIO的dts描述信息,这里介绍下,pl.dtsi就是专门用来描述PL扩展的外设信息的,只需要包含到对应的dts文件里面就行了,比如这里就是把pl.dtsi包含进system.dts里面去的。简单描述一下他们的关系system.dts->pl.dtsi->zynq-7000.dtsi.
这里可以直接把生成的相关文件复制粘贴到zynq的dts文件里面去。
system.dts需要稍微修改一下,关于第一个网卡gem0的描述,
41 &gem0 {
42 status = "okay";
43 phy-mode = "rgmii-id";
44 phy-handle = <ðernet_phy>;
45 ethernet_phy: ethernet-phy@0 {
46 reg = <0>;
47 };
48 };
如图
接下来就按照linux kernel编译办法进行编译,生成uImage和system.dtb。如图SD卡启动的话,把system.dtb改名成devicetree.dtb。
对了,要说一下,内核需要做一些配置,增加如下
CONFIG_GPIO_SYSFS=y CONFIG_SYSFS=y CONFIG_GPIO_ZYNQ=y。这样生成的内核才能支持AXI_GPIO的驱动。
编译如下
make -j4
make UIMAGE_LOADADDR=0x8000 uImage
make system.dtb
mv arch/arm/boot/dts/system.dtb devicetree.dtb
cp arch/arm/boot/uImage ./
至此,BOOT.bin devicetree uImage都生成完毕,文件系统暂时还用官方的ramdisk,懒的重新编了。我们测试一下AXI GPIO
把这些文件全部copy到sd卡中。SD卡插入zynq-zed开发板。上电,我们在linux的启动过程中,可以看到这句信息:
XGpio: /amba_pl/gpio@41200000: registered, base is 898 这就是PL扩展的AXI GPIO在linux下的注册过程。
进入linux系统后,首先进入目录
# cd /sys/class/gpio
接下来测试第一个GPIO,输入一下命令
# echo 898 > export
此时会生成一个gpio898,接下来设置io为输出
进入目录gpio898
# cd gpio898
# echo out > direction
输入以下命令,设置gpio为高,我们可以看到板子上的灯亮了。
# echo 1 > value
如图:
至此,zynq-zed板,完成linux下通过axi总线控制pl扩展的gpio。