使用在Xilinx Vivado中创建的定制PL设计控制KR260上的用户定义LED,并通过APU的PYNQ进行控制
扫描二维码
随时随地手机看文章
本项目演示了如何在Vivado中创建一个简单的PL设计来控制KR260载波板上的用户定义LED (DS7和DS8)。该设计使用了一个通过AXI SmartConnect连接到Zynq UltraScale+处理系统(PS)的AXI GPIO IP核,实现了在APU上运行的Linux对led的软件控制。
这是针对Xilinx KR260的自定义Yocto Linux和网络启动的后续项目,该文章提供了具有PYNQ、XRT和网络启动功能的基础Linux环境。
问题陈述
在KR260上开发FPGA应用时,通常需要:
•创建与PS交互的定制PL设计
•快速原型和测试硬件设计,没有冗长的编译周期
•在与更复杂的应用程序集成之前验证硬件功能
•准备与RPU固件或自定义Linux驱动程序集成的硬件设计
传统FPGA开发工作流程要求:
•编写HDL代码或使用IP积分器
•综合和实现设计
•生成比特流
•闪烁SD卡或手动加载比特流
•编写C/ c++应用程序与硬件交互
这个项目通过以下方式简化了这个工作流程:
•使用Vivado的IP Integrator进行视觉设计
•利用PYNQ进行基于python的硬件交互
•通过网络引导和动态比特流加载实现快速迭代
系统架构
硬件体系结构
PL设计包括:
软件架构
设计组件
Zynq UltraScale+ PS: ARM Cortex-A53内核的处理系统
•M_AXI_HPM0_LPD: PL访问的低功率域主端口
•PL_CLK0: 100mhz时钟输出到PL
•PL_RESETN0:复位信号到PL
AXI SmartConnect:用于AXI总线路由的互连IP
•连接PS主站到PL从站
•处理协议转换和地址映射
axis GPIO:通用I/O IP核
•2位输出通道(GPIO[1:0])
•AXI4-Lite从接口
•基址:由Vivado分配(通常在LPD地址空间0x80000000-0x9FFFFFFF中)
Processor System Reset:复位控制器
•同步复位信号
•提供重置到PL逻辑
先决条件
以前的项目设置
本项目假设您已经完成了Custom Yocto Linux & Network Boot项目,该项目提供:
•可网络引导的Yocto Linux镜像
•PYNQ 3.1.2 runtime
•XRT和ZOCL支持
•在端口9090上的Jupyter Notebook服务器
•挂载在/nfsroot的NFS根文件系统
循序渐进的指导
步骤1:创建Vivado项目
•启动Vivado并选择Create Project
•项目设置:项目名称:gpio_led
•项目位置:选择您的工作空间目录项目类型:RTL项目(默认)
•添加源:单击Next(我们将使用IP Integrator创建设计)
•添加约束:单击Next(稍后我们将添加约束)
•默认部件:选择“KR260”的“Boards”选项卡,选择“KR260 Robotics Starter kit”,单击“Next”,完成
步骤2:创建块设计
•在流程导航器中,单击创建块设计名称:gpio_led
•单击OK
•添加Zynq UltraScale+ PS:单击图中的“+”按钮搜索Zynq UltraScale+ ps双击添加“zynq_ultra_pse_0”
•配置PS:双击PS块在PS配置窗口,导航到PS- pl配置→GeneralEnable M_AXI_HPM0_LPD(低功耗域主端口)单击运行块自动化这将启用M_AXI_HPM0_LPD, PL_CLK0和pl_resetn0单击确定
步骤3:添加AXI GPIO IP
•添加AXI GPIO:点击+按钮搜索AXI GPIO双击添加ax_gpio_0
•配置AXI GPIO:双击GPIO blockGPIO:Check All OutputsGPIO Width: 2单击OK
•运行连接自动化:
•单击“运行连接自动化”
•选择全部自动化
•这将:连接PS M_AXI_HPM0_LPD到AXI smartconnect连接AXI SmartConnect到AXI GPIOConnect时钟和复位信号
•单击OK
步骤4:使GPIO外部
•创建外部端口:右键单击ax_gpio_0 GPIO端口选择Make ExternalRename the Port to led_output
•验证设计:单击验证设计(F6)确保没有错误或严重警告
•创建HDL包装器:右键单击源代码中的gpio_led块设计,选择创建HDL包装器,选择让Vivado管理包装器并自动更新,单击OK
步骤5:添加引脚约束
•创建约束文件:在“源”中,右键单击“约束”→“约束”,选择“添加源”→“添加或创建约束”,单击“创建文件”,文件名:gpio_led.xdc
•单击OK并完成
添加引脚约束:打开gpio_led。XDC并添加:
•保存约束文件
步骤6:综合设计
•运行合成:在Flow Navigator中单击Run Synthesis等待合成完成(5-10分钟取决于PC)
•评审综合结果:检查是否有错误或严重警告,验证资源利用是否合理
步骤7:执行设计
•运行实现:点击运行实现等待实现完成(10-20分钟,取决于PC)
•检查实现结果:检查定时关闭验证无严重警告
步骤8:生成比特流
•生成比特流:单击“生成比特流”,等待比特流生成(PC机不同,需要5-10分钟)。
•校验输出文件:生成比特流后,校验这些文件是否存在:gpio_led.runs/impl_1/gpio_led_wrapper.bit - bitstream filegpio_led.gen/sources_1/bd/gpio_led/ hw_handdoff /gpio_led. gen/hwh -硬件描述
步骤9:导出硬件
•导出硬件:在Flow Navigator中,进入File→Export→Export HardwareSelect Include bitstreamClick NextExport位置:Default(项目目录)文件名:gpio_led.xsa
•单击“完成”。xsa文件将在下一个项目中用于RPU与Vitis的集成。
步骤10:将文件复制到NFS共享
•定位生成文件:Bitstream: gpio_led_runs /impl_1/gpio_led_wrapper.bit
•硬件描述:gpio_led.gen/sources_1/bd/gpio_led/hw_handoff/gpio_led.hwh
•拷贝到NFS根目录:在你的NFS服务器上(/nfsroot挂载的地方):
步骤11:创建PYNQ笔记本
•创建笔记本文件:创建led_blink_pynq。“/nfsroot/home/xilinx/Notebook/”目录下的ipynb
•或者将其创建为Python脚本并进行转换,或者使用Jupyter的web界面。
步骤12:在KR260上验证
•运行Notebook:执行第一个cell以重置pl_execute第二个cell以加载比特流并运行KR260板上的LED patternObserve LEDs DS7和DS8
预期的行为:
•预期行为:LED0 (DS8)和LED1 (DS7)将以行走模式闪烁:模式1:LED0 ON, LED1 OFF (0x1)模式2:LED0 OFF, LED1 ON (0x2)模式3:Both LEDs ON (0x3)模式4:LED0 OFF, LED1 ON (0x2)重复5次,循环之间暂停0.5s
了解守则
PYNQ叠加加载
PYNQ的Overlay类:
•将比特流加载到FPGA中
•解析。了解HWH文件的硬件结构
•为每个IP核创建Python对象(例如,overlay.axi_gpio_0)
AXI GPIO访问
•axi_gpio_0是来自于Vivado块设计的实例名
•channel1是GPIO通道(channel1是第一个通道)
•GPIO对象提供read()和write()方法
LED控制
•pattern:要写的值(0x0到0x3为2位)
•mask:表示要影响哪位的位掩码(0x3 =两个位)
设计注意事项
PS-PL接口选择
•使用M_AXI_HPM0_LPD(低功率域)代替FPD(全功率域)
•原理:GPIO控制需要低带宽,使LPD理想的功率效率
•LPD为GPIO操作提供了足够的性能,同时功耗更低
•FPD端口更适合高带宽应用(视频处理、DMA等)。
时钟域
•PL时钟:100 MHz(来自PS PL_CLK0)
•AXI总线时钟:100mhz(与PL时钟同步)
•GPIO更新速率:受Python循环速度限制(本例中为~ 4hz)
GPIO配置
•所有输出:GPIO配置为仅输出(无输入能力)
•宽度:2位(匹配两个led)
•I/O标准:LVCMOS18(兼容KR260 HP bank)
地址空间
•AXI GPIO基址:0x80000000 (LPD地址空间)
•地址范围:64 KB(标准的AXI4-Lite slave)
•可以通过PYNQ从Linux用户空间访问
注:LPD (Low Power Domain)使用0x80000000地址范围,适用于GPIO和其他低带宽外设
下一个步骤
该项目为更高级的PL开发提供了基础:
•增加更多的GPIO:扩展到控制额外的led或读开关
•自定义IP集成:在设计中添加自定义AXI IP内核
•中断支持:为事件驱动控制配置GPIO中断
•RPU集成:将LED控制逻辑移动到RPU(见下一个项目)
•下一步:RPU与FreeRTOS集成
本系列的下一个项目将演示:
•使用赛灵思Vitis Unified IDE为RPU构建FreeRTOS应用程序
•使用XRT从APU加载PL位流
•使用remoteproc框架加载RPU固件
•通过libmetal和OpenAMP实现APU-RPU通信
•APU、RPU和PL之间的共享内存
•实时LED控制从RPU,而APU处理高级任务
这将展示KR260的完整异构计算能力,结合:
•APU:用于高级控制和网络的Linux
•RPU:用于实时、确定性任务的FreeRTOS
•PL:定制硬件加速器和I/O
本文编译自hackster.io





