Zynq-7000 PS重配置PL

  1. 环境搭建
    Zynq-7000的结构分为PS(ARM)和PL(FPGA),当然也可以理解为PL作为一种外设挂载在PS端。在正常的系统加载顺序(FALSH \ SD -> FSBL -> PL ->BITSTRAM ->PS ELF)完成后重新配置PL程序,可以利用XLINX官方BSP逻辑xdecfg_polled_example的Demo例程实现PS配置PL比特流,将指定DDR空间的数据配置到FPGA。具体的平台启动方式如图1-1。

    1.1 Vivado工程创建
    选择create project 创建工程名称,选择存储位置
    Zynq-7000 PS重配置PL_第1张图片
    Zynq-7000 PS重配置PL_第2张图片

选择RTL project,勾选下方选项会省略添加源文件和约束文件步骤,之后直接进行芯片的选型,对照芯片丝印或者电路图选择合适的芯片型号即可。(在选型时可先选封装类型)工程创建完成。
Zynq-7000 PS重配置PL_第3张图片
Zynq-7000 PS重配置PL_第4张图片
点击Create Block Design 并设置Design name。在Digram点击“+”,输入Zynq添加Zynq7。
Zynq-7000 PS重配置PL_第5张图片
Zynq-7000 PS重配置PL_第6张图片
之后可以双击Zynq7 根据项目进行相应的配置,注意DDR的型号以及时钟频率的对应即可。配置完成后按F6 Validata Design。有错误需要仔细检查配置问题。

生成顶层HDL模块。
之后在hierarchy界面右击sysstem.bd,然后生成“Create HDL Wrapper”,并确认勾选
“ Let Vivado manage wrapper and auto-update”,完成后会有品字型标志。
Zynq-7000 PS重配置PL_第7张图片

Zynq-7000 PS重配置PL_第8张图片
下面的步骤以PL的重配置为例。
本平台的核心选择为XC7Z045,配置挂载在PS上位UART1以及挂载在PL的UATR0。在配置完成后点击Flow Navigator列表将解析的网表进行分析和约束。在I\O ports界面根据电路原理图配置相应的管脚。完成配置后点击Generate Bitstream。
为验证可重配置结果的正确性,除了利用挂载在PL的串口完成打印作为一种PL的配置方式之外还要选择另一种配置方式作为重配置。这里选择挂载在PL端口的LED灯。

生成LED工程步骤如下:
Ÿ 按照上述工程创建步骤至完成工程的创建、
Ÿ 直接点击Source栏的“+”,如下图:

Zynq-7000 PS重配置PL_第9张图片
Ÿ 弹出的界面为添加或者创建文件,由于并没有提前编写的代码,我们选择create file创建一个新的设计文件。
Ÿ 成功创建文件后会弹出定义模块界面,用于设置源文件的模块名称和端口列表,如果是手动输入代码。这里并不需要设置,直接OK即可。之后弹出界面直接YES即可。
Ÿ 双击Design Sources栏内刚创建的 .v 文件,根据需要编写代码。
Ÿ Vivado会对代码进行语法检查,且大多数情况下IDE会自动识别设计的定成模块。也可通过Source 栏的右击菜单选择Set as Top手动定义顶级模块。
Ÿ 分析与综合 完成代码编写后,点击 Flow Navigator窗口的 Open Elaborated Design进行检查,根据error和warning对代码进行相应的更改。这部分完成后窗口会新增Schematic(原理图)、Netlist(网表)等窗口。
Ÿ 之后可以进行I\O引脚的分配,但是一般选择先对设计进行综合,综合之后再统一输入时序约束和IO引脚的物理约束。
关闭分析后的界面,点击Flow Navigator窗口中的Run Synthesis对代码进行综合,在弹出的窗口中直接点击OK
Zynq-7000 PS重配置PL_第10张图片
约束输入,创建约束文件,点击Source栏中的“+”,如下图
Zynq-7000 PS重配置PL_第11张图片

成功创建 .xdc 文件后按照设计要求和电路图进行管脚和时钟约束。例:
Zynq-7000 PS重配置PL_第12张图片
注:
时钟周期约束 create_clock –name clk –period 20 [get_ports sys_clk]
创建一个名为clk 时钟周期为20ms,时钟源是sys_clk的端口,一般只对输入的
时钟作周期的约束。周期值设置不应太小。相对简单的设计可以不对工程做时序
约束,并不影响功能,但是复杂设计和输入时钟频率较高时不进行约束可能会产
生未知情况。
Ÿ 约束输入完毕后进行实现设计,点击Flow Navigator 窗口的Run Implementation根据提示完成设计,实现完成后直接Cancel提示窗口。
Ÿ 生成BitStrream
Zynq-7000 PS重配置PL_第13张图片
Ÿ 生成Bitstream后点击file -> Export -> Export Handware注意在Export Handware 界面勾选 Include Bitstream。
启动SDK,进入软件设计。点击file –> launch SDK。
1.2 SDK环境使用
本节将同样以PL重配置的设计进行解析。
SDK打开后会自动显示system.hdf的内容,此标签页会显示整个PS系统的地址映射信息。在启动SDK之前,我们将硬件以一个ZIP压缩文件的形式导出到软件工作空间,在打开SDK时会自动解压,得到system_wrapper_hw_platform_0文件夹,这个文件夹在每次硬件更新后会在软件环境更新,我们需要尽量保证只有一个,可以在软件环境中删除或直接在资源管理器中删除多余的。此文件夹前4个文件包含Zynq SoC处理系统的初始化代码,以及DDR、时钟、PLL、MIO的初始化设置信息。在初始化过程中,SDK使用这些信息去配置相应的模块,使得应用程序能够在PS上运行。
Zynq-7000 PS重配置PL_第14张图片
创建SDK工程
Ÿ 菜单栏 File -> New -> Application Project,创建一个SDK应用工程。
Ÿ 按照提示设置工程名,注意不要直接finish,点击Next
Ÿ 在弹出界面选择 空工程, Empty Application
Ÿ 创建后SDK会创建一个name应用工程以及name_bsp的板级支持包(BSP)工程,且会自动编译生成name.elf文件
Ÿ 最后在name工程下的src文件夹添加相应的源文件和头文件进行下载验证即可。

  1. PS重配置PL的实现
    所谓重配置,即在当前硬件比特运行期间,有一份新的比特通过网络、串口等等其他方式传输到平台,平台将其存储在Falsh、DDR等外部存储介质中,随后将硬件在不断电的情况下配置成新的比特流。
    对bitstream可以大致分为以下几种情况:
    Ÿ 调试阶段,来自环境 (JTAG)
    Vivado下载:Program and debug –> Open Hardware Manager -> open target -> auto connect -> program device 在弹出界面选择bit文件下载即可
    SDK环境可在run configuration界面选择需要的配置
    Ÿ 固定启动,来自外部存储设备,将比特流固化到存储介质,并选择相应的启动方式。
    Ÿ 动态配置,即上述所说的不断电更新。数据来源一般是下图中的DRAM。

Zynq-7000 PS重配置PL_第15张图片
上图的Secure安全启动是指比特流会经过AES等安全模块的校验,再配置到硬件。
在搭建好硬件及软件环境后,要实现PS重配置PL我们需要2个条件,其一是两份不同表现的PL实现的Bin文件,其二是软件部分DEVC 的正确配置使用。
2.1 Bin文件的制作
要想顺利进行PL的程序替换,我们首先需要准备一份用来替换的bin文件,因为加载所需的文件不能使 .bit 文件。在目前的系统中对于Bin文件的制作需要注意下列几个问题。
首先,Bin文件的制作方式问题。目前为止已知的Bin文件制作方式主要有以下3种方式。
SDK环境下的Create boot Image。打开SDK环境后按照正常流程新建工程,选择下图的工程类型
Zynq-7000 PS重配置PL_第16张图片
Zynq-7000 PS重配置PL_第17张图片
创建完成后等待自动编译完成,之后打开Xilinx Tools中的Create Boot Image开始创建Boot.bin。打开原工程文件partitions 会自动列出name.elf和name.bit,需要把fsbl.elf添加进第一项,顺序不能错。点击create image即可
Zynq-7000 PS重配置PL_第18张图片
Ÿ Vivado生成设置,右击Program And Debug -> bitstream setting -> 勾选-bin_file。即可
Ÿ TCL脚本语句生成,生成语句及参数
write_cfgmem -format bin -loadbit “up 0x0 Led1_Blink.bit” -file LED.bin -size 128 -force -interface SMAPx32 -disablebitswap
Zynq-7000 PS重配置PL_第19张图片
对于本系统来说这种生成方式是唯一可以顺利配置的方式,即只能使用TCL语句生成的Bin文件。
还需注意一点的是bit文件的大小,在此版本中默认bit文件不压缩,不压缩的bit文件无法使用。需要在tools-> settings的界面进行压缩设置。

Zynq-7000 PS重配置PL_第20张图片
Zynq-7000 PS重配置PL_第21张图片
注:不能直接进入setting界面,需要先对项目进行编译之后点击Open Elaborated Design之后进入,同时网络上描述的添加压缩约束语句对本系统无效。
由此我们可以顺利制作两份Bin文件,一份UART串口打印功能,一份点亮LED功能(更好是闪烁,但是本平台并没有焊接晶振,为保证结果准确性并没有采用从PS拉时钟的方法)。
2.2 DEVC配置使用
首先是对两个工程进行功能性验证,勾选run configuration栏中的reset entire system和 Program FPGA下载LED的Bitstream,平台LED灯顺利点亮。
进行UART验证时,需要的表现是在SDK的串口窗口进行双串口信息的打印,但是根据Xil_printf() 函数的实现底层
在这里插入图片描述
输出地址为UART0的默认地址,所以无法进行双串口的信息打印,这里采用取巧的是实现方式,实现自己的打印函数如以实现双串口。
Zynq-7000 PS重配置PL_第22张图片
由此,两个验证性功能测试完毕。可以进行DEVC的配置和使用。
比特流从存储加载到PS中,之后进入PCAP是由处理器系统PS中的PCAP bridge负责。“桥”在PS的DevCfg中。此外设的使用和其他类似,根据官方Demo就可以进行配置。
Zynq-7000 PS重配置PL_第23张图片

PCAP(processor Configuration Access Port)处理器配置接口,“桥”的两端连接PS AXI和PL PCAP,沟通软件和硬件。比特流的搬运由专用DMA完成,提高速率,可以更快的部署。
Xilinx平台有两种比特动态重配置,即部分重配置和完整重配置。部分重配置速度快,毫秒级,实现复杂。更多实现的是完整重配置。软件动态重配置在Linux下可以通过DevCfg驱动进行,裸板的实现可以参考官方Demo例程。
首先进行代码的编写,根据官方例程可以写出如下的程序:
初始化函数

Zynq-7000 PS重配置PL_第24张图片
在原始Demo里有两个关键的宏定义BIT_STREAM_LOCATION 和BITSTREAM_SIZE_WORDS。需要注意的是BIT_STREAM_LOCATION要修改为适合系统的地址,默认地址不可用。BITSTREAM_SIZE_WORDS是以32bit表示大小,所以要对bin文件长度进行计算(length/4)。在写入bin文件时以16进制表示长度。PL的可配置函数实现如下:
Zynq-7000 PS重配置PL_第25张图片
只执行此函数并不能完成对PL的重配置,解决方法参考ug585如下:
Zynq-7000 PS重配置PL_第26张图片
不能完成重配置原因自于没有对PL进行复位,上述5步操作描述PS对PL执行清除比特流并复位。实现代码如下:
Zynq-7000 PS重配置PL_第27张图片
完成代码编写后进行板级验证:
首先将bin文件放置到板子的DDR,菜单栏Xilinx -> Dump/Restore Memory
Zynq-7000 PS重配置PL_第28张图片
将LED.bin文件写入DDR后运行程序,注意不勾选reset entire system和 Program FPGA,顺利点亮LED,然后更换UART.bin文件。
Zynq-7000 PS重配置PL_第29张图片
Zynq-7000 PS重配置PL_第30张图片
顺利重新配置PL

你可能感兴趣的:(FPGA-ZYNQ,嵌入式)