ZYNQ学习笔记(3)-局部重构Partial Reconfiguration
动态局部重构Dynamic Partial Reconfiguration(DPR),顾名思义,局部重构是当下载了全部的bit 配置以后,可以通过下载局部分区bit 文件来动态修改对应分区的逻辑功能,同时其余分区的逻辑功能持续运行而不中断。
典型应用
局部重构优化了传统的FPGA 应用,通过这项技术减少了尺寸,重量,功耗和成本。
一个典型的例子是网络交换机。每个网络交换机都具有多个端口,每个端口能够支持多种接口,比如10GigE ,OC48和光纤等等。然而在FPGA配置之前,无法预测用户将会使用哪一种网络接口,于是只能将每个端口的所有的接口控制逻辑都在FPGA 中实现。如下图所示:
显然这种方式浪费了FPGA内部的资源,增加了FPGA 的面积和功耗。局部重构能够实现更有效的设计方法,如下图所示:
在设个设计中,我们将各种类型的网络接口的控制逻辑预先设计并编译成为bitstream 文件,存储在处理机的存储空间或者SD card 上,当用户配置某一类型的网络接口时,将相应的bitstream 下载到相关的局部重构块中。
局部重构技术在工业控制器设计中同样是需要的。例如在模块化PLC 中,有多种IO模块存在,使用背板FPGA 实现高速IO 逻辑,例如高速PWM信号,脉冲计数,解码器接口,和模拟量采集,每个IO模块的插槽有十几根IO控制线。但是每个插槽对应的FPGA 的控制逻辑与插入的IO模块相对应,在PLC 出厂时是无法确定的。因此,可以使用FPGA的 动态局部逻辑配置的功能。当处理器通过IO模块内部的EEPROM 的数据确定IO模块的类型。然后将对应逻辑的bit 下载到局部分区中。
动态局部配置与matlab /simulink算法
matlab是著名的科学计算软件。而simulink是在matlab基础上构建的建模。仿真和分析的软件。不仅如此,matlab/simulink 能够生成产品级 C、C++、CUDA、PLC、Verilog 和 VHDL 代码,并直接部署到您的嵌入式系统。现在,matlab、simulink 的应用已经非常广泛,包括了无线通信,电力电子,控制系统,机器人,高级驾驶辅助系统,数字孪生,人工智能等领域。 matlab/simulink 采用了基于模型的设计方法,直接生成各种产品级代码,实现了从“模型到代码”的设计自动化。这是最受欢迎的功能之一。省去了大量编码和FPGA 设计繁琐工作,大大提高了原型设计的效率。
基于模型设计的思想受到各类行业工程师的欢迎,不过,实现这一理想是复杂的过程,目前matlab 支持的Xilinx 和Intel的FPGA 系列。实现matlab to fpga 的过程大至如下
- 1 使用matlab/simulink 建模与仿真
- 2 导出算法的verilog 语言。
- 3 使用FPGA 设计软件将verilog 算法添加到vivado 的工程中。产生一个IP 核。
- 4 Simulink 通过以太网与ZYNQ 处理器通信,ZYNQ 处理器通过AXI接口访问IP核。
- 5 处理器通过FPGA 的PCAP(Processor Configuration Access Port )和ICAP(Internal Configuration Access Port)实现FPGA 的配置。
- 6 结合FPGA的动态局部重构技术实现Matlab to FPGA 的功能。
根据IP 核的具体要求,可以选择不同的AXI接口,例如使用AXI_DMA 实现IP核与处理器之间的高速数据传输,通过AXI_Lite 实现寄存器访问和配置。
上图是一个高级架构图,显示了 Zynq 平台上处理器和 FPGA 架构之间的流式数据传输。通常,AXI4-Stream 接口与 DMA 控制器一起使用,将大量数据从处理器传输到 FPGA。数据通常在软件端表示为矢量数据。DMA 控制器从内存中读取矢量数据,并通过 AXI4-Stream 接口将其“流式传输”到 FPGA IP。“流”过程每个样本发送一个数据元素,这意味着 FPGA IP 中流算法的数据路径使用标量数据类型。
动态局部配置与IEC61499 功能块
IEC61499 是面向分布式工业控制,测量和监督系统的功能块的标准。大多数IEC61499 功能块是软件实现的。为了提高IEC61499 功能块执行的实时性,一部分IEC61499 功能块,复合功能块以及子应用能够使用FPGA 来实现。例如PWM 发生器,模拟数据采集,PID 闭环控制算法,模拟信号的数字信号处理(DSP),滤波,FFT等算法都可以使用FPGA来实现。近几年流行的AI算法也能够通过HDL 来实现。并且下载到FPGA 的动态局部分区中运行。
ZYNQ 动态局部配置的机制
动态局部重构机制将IP 核的bitstream 存储在处理器(PS)端的存储器中,通过软件和接口将bit文件下载到局部重构块中。在ZYNQ 中,有两种用于PR 的方案,它们分别是:
PCAP(Processor Configuration Access Port)
ICAP( Internal Configuration Access Port)
PCAP
ZYNQ 的启动过程大致如下:
参考《Zynq UltraScale\+ Device Technical Reference Manual》,FSBL 在写入BitStream 之前,初始化PCAP接口。通过PCAP写入Bitstream。
ICAP接口
ICAP 是Xilinx公司提供的一个AXI4 IP核。它用来访问FPGA 内部的配置存储器。它基于AXI Lite 接口。
PCAP与ICAP 的差别
通过XDcfgtransferBitFile 函数将RP的Bitstream 从DRAM 传送到PCAP,这种方案的主要优点是不需要使用任何PL 资源。传输的吞吐量为128MB。它的主要缺点是在重构时挂起了处理器。
Xilinx 同样提供了一个IP核(AXI_HWICAP)和程序库XHwIcapdeviceWrite。允许使用ICAP来实现PR。AXI_Lite接口通过GP 端口将它连接到PS。由于这种方式不使用DMA 所以转送速率为19MB。也可以使用DMA 方式。
vivado 设计流程
网络上有一些vivado 软件开发PR 的文章,但是比较凌乱。 下面我们按照
xilinx fpga 部分动态重配置(Partial Reconfiguration)设计实现 一文的提示的方法的过程。
同时参考XILINX公司的ug909-vivado-partial-reconfiguration.pdf
在这个实例中,我们设计两个RP模块,一个固定模块
其中:
PM_LED 是局部重构模块,可以配置为1秒或者4 秒闪烁。LED2 是固定模块2秒闪烁。
它们对应的verilog 文件:
led.v 1秒
led_4s 4 秒
led2_2s 2 秒
设计过程
1 建立一个项目,将top.v ,led.v和led.v 导入源文件。
注意:在构建项目时,只要导入一个RM模块的源代码(led.v)就可以了。
2一旦项目建成后,将项目转变为局部重构项目,选择Tools > Enable Partial Reconfiguration.
这个操作是不可逆的。所以,如果需要,要做好预先保存。
3 一旦项目转变为PR 项目,要定义重构分区(Reconfigurable Partitions)。在led模块的名称击右键。选择Create Partition Definition
在对话框中输入相应的pd和pm名字,这里分别输入led和led_1s。
4 配置该项目的所有细节,包括为每个重构分区(Reconfigurable Partitions)添加额外的可重构模块(Reconfigurable Modules)。所有这些工作都通过(Dynamic Function eXchange wziard)完成。
在这里,我们设置partion Definition name 为led,Reconfiguration module Name为led_4s
并且添加led_4s.v 文件。,如果由更多的RM 模块,想必也是通过这个方式添加。
5 开始FPGA 的综合(Run Synithesis),这是一个漫长的过程。
6 当综合完成之后,要在FPGA 中划出一个区域作为PM 的物理位置。
7. 实现及生成bit
结束语
到此为止,事情还没有完成。许多的疑问:
- 如何加入PCAP或ICAP 接口模块
- 上层软件如何编写
- 从上面的设计过程看,在设计PR项目时,每个RM 的源代码已经完成,如果像Matlab/Simulink
- 产生的verilog 代码,在项目的设计时没有确定代码,如何定义可重构分区呢?能够预留么?
慢慢来吧!
转自:https://blog.csdn.net/yaojiawan/article/details/122892902