基于TMS320C6678开发板的ZYNQ PS + PL异构多核案例开发手册(1)

2022-07-25 10:59:21 浏览数 (1)

本文主要介绍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

  1. 片上内部温度:40454*503.975/65536–273.15=37.943211℃
  2. PL端内部核心电压:33347/65536*3=1.526505V

备注:由于寄存器读取的数据按16位进行换算,因此电压换算公式中分母的数值应该按65536(2的16次方),而非4096(2的12次方)。

Vivado工程说明

进入BLOCK DESIGN开发界面,双击IP核框图,可查看IP核的具体配置信息。

图 47

图 48

参数说明

  1. TEMPERATURE:片上内部温度。
  2. VCCINT:PL端内部核心电压。
  3. VCCAUX:PL端辅助电压。
  4. VCCBRAM:PL端BRAM电压。
  5. VCCPINT:PS端内部核心电压。
  6. VCCPAUX:PS端辅助电压。
  7. VCCDDRO:DDR工作电压。
  8. 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

0 人点赞