PYNQ上手笔记(三)——PS端+PL端点灯

时间:2024-05-21 12:10:54

上一节中分别独立实验了Zynq的PS端和PL端,并初步实验了PS端先硬件再软件的开发流程和IP核设计的设计方法。第一节中提及到:Zynq是以PS端的ARM处理器系统为核心的,PS端和PL端是通过AXI总线,并且Xilinx已经提供了各种AXI通信的IP核,接下来的实验中将会更加明确的体验到利用IP核设计的设计方法。

1.实验目标

板载的LED和RGBLED都是接在PL端的,这个实验将利用PS端程序通过AXI总线控制连接在PL端的LED。
PYNQ上手笔记(三)——PS端+PL端点灯

2.实验步骤

整个实验流程参考《The Zynq Book Tutorials》的chpt1:First Designs on Zynq(这本实验指导手册是英文的,但我个人认为英文原版要比中文看着清楚很多)。
需要注意的一点是,这本实验指导手册是针对Zybo和Zedboard的,将其中关于板子的操作换为Pynq中的即可。关于软件驱动程序的部分,书中是采用空白工程+导入随书程序的方法,这里因为板子不同,不采用这种方法,直接利用SDK导入例程

2.1.工程目录

PYNQ上手笔记(三)——PS端+PL端点灯

其中:

  • 橙色部分是需要自己编写的应用程序代码
  • 带有bsp的绿色部分是SDK自动生成的板级驱动支持包
  • 黄色部分是关于ARM内核的一些硬件设计文件

2.1.1.硬件设计文件(hdf)

红色文件system.hdf就是在vivado中设计完硬件之后导出的硬件设计文件,其中包含了一些设计信息和寄存器地址映射:
PYNQ上手笔记(三)——PS端+PL端点灯

2.1.2.板级驱动支持包(BSP)

板级驱动包中只需要关注绿色的文件system.mss,这个文件说明了该工程中板级驱动支持包的所有信息,包括:

  • 目标硬件信息
    PYNQ上手笔记(三)——PS端+PL端点灯

  • 采用操作系统信息
    PYNQ上手笔记(三)——PS端+PL端点灯

  • 外设驱动信息
    PYNQ上手笔记(三)——PS端+PL端点灯

  • 库信息
    PYNQ上手笔记(三)——PS端+PL端点灯

2.1.3.应用程序代码(APP)

应用程序代码可以自己编写或者从例程导入,这里直接在system.mss文件中导入:
PYNQ上手笔记(三)——PS端+PL端点灯
一共包括4个例程,导入第一个基本例程:
PYNQ上手笔记(三)——PS端+PL端点灯
PYNQ上手笔记(三)——PS端+PL端点灯

2.2.xgpio_example

最好的参考资料是官方文档,包含XGpio操作所有的API说明
PYNQ上手笔记(三)——PS端+PL端点灯
PYNQ上手笔记(三)——PS端+PL端点灯

2.2.1.Xilinx GPIO 控制器介绍

Xilinx GPIO控制器是专为Xilinx FPGA设计的软IP核,有以下功能:

  • 每个通道可设置32个I/O
  • 每个I/O可设置为输入或输出
  • 可配置支持双通道和外部中断

XGpio的API声明在xgpio.h文件中,API实现在xgpio.c文件中

2.2.2. 初始化XGpio

API:int Xgpio_Initialize(InstancePtr,DeviceID)
功能:根据给定的DeviceID初始化调用者提供的XGpio实例

参数 类型 说明
InstancePtr sturct* XGpio GPIO实例指针(xgpio.h)
DeviceID u16 导出hdl时自动生成(xparameters.h)
return int 成功-XST_SUCCESS 失败-XST_DEVICE_NOT_FOUND

注:
xparameters.h是在导出硬件设计文件时由Vivado自动生成的,包含了所有系统硬件参数的宏定义。

2.2.3. 设置XGpio输入/输出方向

API:void XGpio_SetDataDirection(XGpio *InstancePtr, unsigned Channel, u32 DirectionMask)
功能:根据给定的DeviceID初始化调用者提供的XGpio实例

参数 类型 说明
InstancePtr sturct* XGpio GPIO实例指针(xgpio.h)
Channel unsigned 包含要操作的GPIO的通道
DirectionMask u32 指定32个I/O的方向,0-出,1-入

注意:如果此功能与除1之外的任何通道一起使用,则必须为双通道构建硬件。如果不是,则此功能将断言。

2.2.4. XGpio电平逻辑操作

API:XGpio_DiscreteWrite(XGpio * InstancePtr,unsigned Channel,u32 Data)
功能:写入指定GPIO通道的寄存器

参数 类型 说明
InstancePtr sturct* XGpio GPIO实例指针(xgpio.h)
Channel unsigned 包含要操作的GPIO的通道
Data u32 32个I/O的电平,0-低,1-高

2.2.4.1.置高某个I/O的电平

API:XGpio_DiscreteSet(XGpio * InstancePtr,unsigned Channel,u32 Mask)
功能:将输出设置为指定GPIO通道的逻辑1

参数 类型 说明
InstancePtr sturct* XGpio GPIO实例指针(xgpio.h)
Channel unsigned 包含要操作的GPIO的通道
DirectionMask u32 将被设置为1的位组,0-不选中,1-选中(其它位不受影响)

2.2.4.1.拉低某个I/O的电平

API:XGpio_DiscreteClear(XGpio * InstancePtr,unsigned Channel,u32 Mask)
功能:将输出设置为指定GPIO通道的逻辑0

参数 类型 说明
InstancePtr sturct* XGpio GPIO实例指针(xgpio.h)
Channel unsigned 包含要操作的GPIO的通道
DirectionMask u32 将被设置为0的位组,0-不选中,1-选中(其它位不受影响)

2.3.下载并运行程序

因为该设计中包含PL端设计比特流,所以在run程序前需要设置,右键->Run As -> Run Configurations:
PYNQ上手笔记(三)——PS端+PL端点灯

3.实验结果

PYNQ上手笔记(三)——PS端+PL端点灯

4.实验总结

完成了整个实验后再来看这张图,首先在PL端通过添加AXI GPIO IP核实现一个GPIO控制器,GPIO控制器由于在PL端,所以输出直接与4个板载LED相连,然后vivado自动布局布线,将GPIO控制器的受控端与PS端处理器核进行对应连接,然后生成导出硬件设计文件供SDK使用。
PYNQ上手笔记(三)——PS端+PL端点灯

SDK根据硬件设计文件生成C工程,通过运行于PS端ARM处理器的程序控制PL端实现的GPIO控制器,完成PS通过AXI总线控制PL端LED(GPIO)的实验。

5.实验扩展

  • 编程实现让4个LED以不同的方式闪烁
  • 编程实现RGB的驱动