本文主要介绍ZYNQ PS PL异构多核案例的使用说明,适用开发环境:Windows 7/10 64bit、Xilinx Vivado 2017.4、Xilinx SDK 2017.4。其中测试板卡为TMS320C6678开发板,文章内容包含多个特色案例,如axi_gpio_led_demo案例、axi_timer_pwm_demo案例、axi_uart_demo案例、emio_gpio_led_demo案例、mig_dma案例等,由于篇幅过长,文章分为上下6个小节展示,欢迎大家按照顺序进行文章内容查看。
本次测试板卡为TMS320C6678开发板,它是一款基于TI KeyStone架构C6000系列TMS320C6678八核C66x定点/浮点DSP,以及Xilinx Zynq-7000系列XC7Z045/XC7Z100 SoC处理器设计的高端异构多核评估板,TMS320C6678开发板每核心主频可高达1.25GHz,XC7Z045/XC7Z100集成PS端双核ARM Cortex-A9 PL端Kintex-7架构28nm可编程逻辑资源,引出双路CameraLink、双路SFP 光口、四路千兆网口、双路SATA、双路PCIe、四路USB、双路CAN、双路CAMERA、HDMI IN/OUT、LVDS、LCD、RS485、RS232、Micro SD、HPC FMC等接口。
前 言
本文案例位于产品资料“4-软件资料DemoZYNQ_DemoAll-Programmable-SoC-demos”目录下。案例包含PL端Vivado工程,主要使用Xilinx提供的标准IP核配置PL端资源实现接口扩展,同时包含PS端裸机/Linux程序、PL端MicroBlaze应用程序。案例目录详细说明见下表:
表 1
目录 | 目录 | 文件/目录 | 说明 |
---|---|---|---|
hw | bin | xxx_xc7z045.bin/xxx_xc7z045.bit | xc7z045 PL端可执行文件 |
xxx_xc7z100.bin/xxx_xc7z100.bit | xc7z100 PL端可执行文件 | ||
project | xxx_xc7z045 | xc7z045 PL端Vivado工程 | |
xxx_xc7z100 | xc7z100 PL端Vivado工程 | ||
sw | baremetal_demo/FreeRTOS | bin | PS端裸机/PS端FreeRTOS/PL端MicroBlaze可执行文件 |
project | PS端裸机/PS端FreeRTOS/PL端MicroBlaze工程 | ||
linux_system | image | Linux脚本程序、动态设备树镜像文件 | |
src | 动态设备树源文件 |
在进行本文操作前,请先参考“ZYNQ PS端裸机与FreeRTOS案例开发手册”、“ZYNQ PL端案例开发手册”、“ZYNQ PL端功能动态设备树使用方法”,熟悉工程编译、程序加载与固化、动态设备树加载等方法。
案例使用Block Design Verilog语言方式进行开发,可在Vivado界面点击"IP INTEGRATOR -> Open Block Design"打开BLOCK DESIGN开发界面。
图 1
可点击"Sources -> Constraints",双击打开.xdc约束文件。
图 2
处理器硬件资源详细开发说明可查阅产品资料“6-开发参考资料数据手册核心板元器件ZYNQ”目录下的《ug585-Zynq-7000-TRM.pdf》文档。
视频相关案例说明,请查阅视频案例开发手册。
axi_gpio_led_demo案例
案例功能
案例功能:PS端通过AXI4-Lite总线发送命令至PL端AXI GPIO IP核,IP核再根据命令控制评估底板PL端LED5的状态。
图 3
操作说明
基于裸机测试
加载PS端裸机程序、PL端程序后,即可看到评估底板的LED5每隔0.5s亮灭一次。
基于Linux测试
将本案例的动态设备树镜像文件pl.dtbo和PL端.bin格式可执行文件复制到"/lib/firmware/"目录下,并将PL端可执行文件重命名为system_wrapper.bin,然后执行如下命令加载设备树文件和PL端可执行文件。
Target# mount -t configfs configfs /configfs
Target# mkdir /configfs/device-tree/overlays/full
Target# echo pl.dtbo > /configfs/device-tree/overlays/full/path
图 4
由上图可知PL端实现的GPIO控制器为905。
请执行如下命令,配置GPIO为输出模式。
Target# ls /sys/class/gpio/
Target# echo 905 > /sys/class/gpio/export
Target# echo out > /sys/class/gpio/gpio905/direction
图 5
执行如下命令,即可控制评估底板LED5的亮灭。
Target# echo 1 > /sys/class/gpio/gpio905/value
Target# echo 0 > /sys/class/gpio/gpio905/value
图 6
Vivado工程说明
进入BLOCK DESIGN开发界面,双击IP核框图,可查看IP核的具体配置信息。
图 7
点击BLOCK DESIGN开发界面下的"Address Editor"选项,可查看IP核分配的地址为0x41200000,PS端可通过该地址对IP核进行控制。
图 8
IP核配置
AXI GPIO IP核开发文档为产品资料“6-开发参考资料Xilinx官方参考文档”目录下的《pg144-axi-gpio.pdf》。根据文档,通过寄存器GPIO_TRI可将GPIO配置为输入/输出模式;通过寄存器GPIO_DATA可将GPIO配置为高/低电平,以及可读取GPIO的电平状态。
图 9
图 10
图 11
axi_timer_pwm_demo案例
案例功能
案例功能:PS端通过AXI4-Lite总线发送命令至PL端AXI Timer IP核,IP核再根据命令通过PWM方式控制评估底板PL端LED5的状态。
图 12
操作说明
基于裸机测试
加载PS端裸机程序、PL端程序后,即可看到评估底板的LED5约每隔0.5s亮灭一次。
基于Linux测试
将本案例的PL端.bin格式可执行文件复制到"/lib/firmware/"目录下,并将PL端可执行文件重命名为system_wrapper.bin,然后执行如下命令加载PL端可执行文件。
Target# echo system_wrapper.bin > /sys/class/fpga_manager/fpga0/firmware
图 13
执行如下命令,通过IP核寄存器配置PWM周期和PWM占空比。
Target# devmem 0x42800004 w 100000000 //配置TLR0寄存器的值为100000000,则PWM周期=(100000000 2)x(1/100MHz),约为1s
Target# devmem 0x42800014 w 50000000 //配置TLR1寄存器的值为50000000,则则PWM占高值=(50000000 2)x(1/100MHz),约为0.5s,PWM占空比=(1-0.5s/1s)x100%,约为50%
图 14
执行如下命令设置Timer 0与Timer 1为PWM向下计数模式。
Target# devmem 0x42800000 w 0x696
Target# devmem 0x42800010 w 0x696
图 15
命令执行后,即可看到评估底板的LED5每隔0.5s亮灭一次。
Vivado工程说明
点击BLOCK DESIGN开发界面下的"Address Editor"选项,可查看IP核分配的地址为0x42800000,PS端可通过该地址对IP核进行控制。
图 16
IP核配置
AXI Timer IP核开发文档为产品资料“6-开发参考资料Xilinx官方参考文档”目录下的pg079-axi-timer.pdf。根据文档,通过寄存器TLR0(Timer 0)可配置PWM周期;通过寄存器TLR1(Timer 1)可配置PWM占空比。
图 17
图 18
如采用PWM向下计数模式(count down),PWM周期与占空比的计算公式如下,公式中的100MHz为IP核所接的s_axi_aclk时钟。
- PWM周期=(TLR0 2)x(1/100MHz)
- PWM占高值=(TLR1 2)x(1/100MHz)
- PWM占空比=(1-PWM占高值/PWM周期)x100%
图 19
图 20
axi_uart_demo案例
案例功能
案例功能:PS端通过AXI4-Lite总线发送命令至PL端AXI Uartlite IP核,IP核再根据命令控制评估底板PL端串口进行数据收发。
CON19(RS232)通过SP3232EEY串口电平转换芯片引出PL端串口,TX和RX引脚分别为K10、L10,电平为3.3V。
图 21
操作说明
基于裸机测试
请使用Micro USB线连接PC机和评估板PS端串口CON9(USB TO UART),使用USB转RS232公头串口线和RS232交叉串口母线连接评估板的PL端调试串口CON19和PC机。
图 22
打开设备管理器,确认评估板PS端和PL端调试串口对应的COM端口号。打开串口调试终端SecureCRT,选择对应的COM端口号,设置波特率为115200,8N1,无校验位,并建立串口连接。
加载PS端裸机程序、PL端程序后,即可看到PS端串口调试终端打印如下信息。
图 23
在PL端串口调试终端点击"View -> Command (Chat) Window",选中并打开"Command (Chat) Window"窗口。在窗口中输入十个字符,再按回车键进行发送。PS端接收到PL端串口的字符后,会将字符通过PL端串口调试终端进行回显。
图 24
图 25
此时,PS端串口调试终端将会打印通过PL端串口接收到的字符。
图 26
基于Linux测试
将本案例的动态设备树镜像文件pl.dtbo和PL端.bin格式可执行文件复制到"/lib/firmware/"目录下,并将PL端可执行文件重命名为system_wrapper.bin,然后执行如下命令加载设备树文件和PL端可执行文件。
Target# mount -t configfs configfs /configfs
Target# mkdir /configfs/device-tree/overlays/full
Target# echo pl.dtbo > /configfs/device-tree/overlays/full/path
图 27
此时可在"/dev/"目录下看到串口设备节点ttyUL0。
Target# ls /dev/ttyUL0
图 28
在PS端串口调试终端执行如下命令,向PL端串口发送字符。
Target# echo "tronlong" > /dev/ttyUL0
图 29
此时,PL端串口调试终端显示PS端向PL端串口发送的字符。
图 30
在PS端串口调试终端执行如下命令,监听从PL端串口接收到的字符。
Target# cat /dev/ttyUL0
图 31 PS端串口
在PL端串口调试终端点击"View -> Command (Chat) Window",选中并打开"Command (Chat) Window"窗口。在窗口中输入字符,再按回车键进行发送。PS端接收到PL端串口的字符后,会将字符通过PL端串口调试终端进行回显。
图 32
图 33
此时,PS端串口调试终端将会打印通过PL端串口接收到的字符。
图 34
Vivado工程说明
AXI Uartlite IP核(axi_uartlite_0)设置的串口波特率为115200,数据位为8bit。
进入BLOCK DESIGN开发界面,双击IP核框图,可查看IP核的具体配置信息。
图 35
点击BLOCK DESIGN开发界面下的"Address Editor"选项,可查看IP核分配的地址为0x42C00000,PS端可通过该地址对IP核进行控制。
图 36
IP核配置
AXI Uartlite IP核开发文档为产品资料“6-开发参考资料Xilinx官方参考文档”目录下的《pg142-axi-uartlite.pdf》。根据文档,通过读寄存器Rx FIFO可获取PL端串口接收到的数据;通过写寄存器Tx FIFO向PL端串口发送数据。
图 37
图 38
图 39
axi_xadc_demo案例
案例功能
案例功能:PS端通过AXI4-Lite总线发送命令至PL端XADC Wizard IP核,IP核再根据命令通过内部XADC采集片上电压、温度等参数。
操作说明
基于裸机测试
加载PS端裸机程序、PL端程序后,即可看到PS端串口调试终端打印相关参数测量值。
图 40
评估底板电路已设计接入0.46875V的测试电压,与测试结果基本一致。
图 41
基于Linux测试
将本案例的PL端.bin格式可执行文件复制到"/lib/firmware/"目录下,并将PL端可执行文件重命名为system_wrapper.bin,然后执行如下命令加载PL端可执行文件。
Target# echo system_wrapper.bin > /sys/class/fpga_manager/fpga0/firmware
图 42
将案例目录下的"swlinux_systemimagexadc_app.sh"脚本文件复制到评估板文件系统,并执行如下命令显示参数测量值。
Target# ./xadc_app.sh
图 43
评估底板电路已设计接入0.46875V的测试电压,与测试结果基本一致。
图 44
温度、电压换算公式请查阅产品资料“6-开发参考资料Xilinx官方参考文档”目录下的《ug480_7Series_XADC.pdf》。
图 45
图 46
- 片上内部温度:40454*503.975/65536–273.15=37.943211℃
- PL端内部核心电压:33347/65536*3=1.526505V
备注:由于寄存器读取的数据按16位进行换算,因此电压换算公式中分母的数值应该按65536(2的16次方),而非4096(2的12次方)。
Vivado工程说明
进入BLOCK DESIGN开发界面,双击IP核框图,可查看IP核的具体配置信息。
图 47
图 48
参数说明
- TEMPERATURE:片上内部温度。
- VCCINT:PL端内部核心电压。
- VCCAUX:PL端辅助电压。
- VCCBRAM:PL端BRAM电压。
- VCCPINT:PS端内部核心电压。
- VCCPAUX:PS端辅助电压。
- VCCDDRO:DDR工作电压。
- VP/VN:模拟输入引脚。
点击BLOCK DESIGN开发界面下的"Address Editor"选项,可查看IP核分配的地址为0x43C00000,PS端可通过该地址对IP核进行控制。
图 49
IP核配置
XADC Wizard IP核开发文档为产品资料“6-开发参考资料Xilinx官方参考文档”目录下的《pg091-xadc-wiz.pdf》。根据文档,通过读寄存器可获取对应参数测量值。
图 50
emio_gpio_led_demo案例
案例功能
案例功能:PS端通过EMIO方式控制评估底板LED5的状态。
图 51
Zynq-7000的GPIO分为MIO(multiplexed I/O)和EMIO(extended multiplexed I/O)两种。
MIO:PS端多功能IO接口,IO与PS端连接,每个IO可根据需求配置为GPIO、SPI、UART、TIMER、Ethernet、USB等多种不同功能。由于MIO对PL端不可见,因此PL端无法使用MIO引脚。
EMIO:MIO扩展接口,IO与PL端连接。由于EMIO对PS端、PL端均可见,因此两者均可使用EMIO引脚。一般情况下,如PS端MIO资源无法满足需求时,PS端可通过EMIO方式进行接口拓展。EMIO的使用与MIO相似,区别在于EMIO需使用Vivado约束文件对管脚进行分配。
MIO分配在Bank0和Bank1,EMIO分配在Bank2和Bank3。Bank1是22bit,其他Bank都是32bit,因此MIO有54个管脚,EMIO有64个管脚。MIO管脚号为0~53,EMIO的管脚号为54~117。
图 52
操作说明
基于裸机测试
加载PS端裸机程序、PL端程序后,即可看到评估底板的LED5每隔0.5s亮灭一次。
图 53
基于Linux测试
将本案例的PL端.bin格式可执行文件复制到"/lib/firmware/"目录下,并将PL端可执行文件重命名为system_wrapper.bin,然后执行如下命令加载PL端可执行文件。
Target# echo system_wrapper.bin > /sys/class/fpga_manager/fpga0/firmware
图 54
请执行如下命令,设置GPIO为输出模式。
Target# echo 960 > /sys/class/gpio/export
Target# echo out > /sys/class/gpio/gpio960/direction
图 55
执行如下命令,即可控制评估底板LED5的亮灭。
Target# echo 1 > /sys/class/gpio/gpio960/value
Target# echo 0 > /sys/class/gpio/gpio960/value
图 56
Vivado工程说明
进入BLOCK DESIGN开发界面,双击ZYNQ7 Processing System IP核框图,再点击"MIO Configuration -> GPIO",由于本案例使用一个EMIO引脚,因此可看到EMIO GPIO(Width)选项值为1,最大值可为64。
图 57
MIO0对应管脚编号为906,EMIO0对应管脚编号为960(906 54)。
图 58