动态局部重构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 代码,在项目的设计时没有确定代码,如何定义可重构分区呢?能够预留么?

慢慢来吧!

ZYNQ学习笔记(3)-局部重构Partial Reconfiguration相关推荐

  1. ZYNQ学习笔记_GPIO实例:通过EMIO实现按键控制LED

    ZYNQ学习笔记_GPIO实例:通过EMIO实现按键控制LED 总体思路 Block Design界面配置IP核并导出硬件配置 在SDK中编写C代码 下载PS和PL的联合工程到开发板 总体思路 首先需 ...

  2. ZYNQ学习笔记_GPIO之输入输出

    ZYNQ学习笔记_GPIO之输入输出 GPIO介绍 MIO介绍 EMIO介绍 控制GPIO接口的寄存器原理_输入输出部分 GPIO介绍 GPIO的英文全称为General-purpose input/ ...

  3. 【《重构 改善既有代码的设计》学习笔记2】重构原则

    [<重构 改善既有代码的设计>学习笔记2]重构原则 本篇文章的内容来自<重构 改善既有代码的设计>一书学习笔记整理并且加上自己的浅显的思考总结! 上一篇通过一个简单的例子体验了 ...

  4. Zynq 学习笔记(4)Linux FPGA Manager

    Xilinx Zynq 是Arm 处理器(PS)和FPGA (PL) 相结合的混合SOC.如何通过程序下载PL的bit 文件,特别是下载局部重构分区的bit 文件是我关心的话题.不过涉及这方面的文档实 ...

  5. ZYNQ学习笔记------day1

    ZYNQ第一天学习笔记 1.Zynq-7000 All Programmable SoC ZYNQ是赛灵思公司(Xilinx)推出的新一代全可编程片上系统,它将处理器的软件可编程性与FPGA的硬件可编 ...

  6. 【《重构 改善既有代码的设计》学习笔记1】重构:第一个案例

    [<重构 改善既有代码的设计>学习笔记]重构:第一个案例 本篇文章的内容来自<重构 改善既有代码的设计>一书学习笔记整理并且加上自己的浅显的思考总结! 一.简单的例子 一个影片 ...

  7. ZYNQ学习笔记PS部分【基本介绍】

    基于Zynq的嵌入式开发流程 Xilinx Zynq SoC 是集成了FPGA和硬核处理器的特殊SoC,它与一般FPGA的最大不同就是自带了一个ARM Cortex-A系列硬核,根据型号不同从A9到A ...

  8. ZYNQ学习笔记(一)---初识ZYNQ-7000系列

    前几日刚入手一款ZYNQ-7000系列的板卡,之前我也没用过FPGA,直接跨越到ZYNQ的原因主要是某宝上这款板卡相较于其他片上仅有一块FPGA的板卡性价比更高.作为入门,在学习过程中,笔者选择先单独 ...

  9. ZYNQ学习笔记——高速ADDA实验

    文章目录 高速AD/DA实验 AD/DA原理 分类 高速AD/DA简介 硬件设计 程序设计 顶层模块(hs_ad_da) AD 数据接收模块 DA数据发送模块 遇到的问题 高速AD/DA实验 AD/D ...

最新文章

  1. dataimagepng php_php用header('content-type: image/png')输出验证码,但响应回来的是text/html...
  2. 机器学习知识点(一)文本字符信息熵Java实现
  3. python真正实现多线程_python多线程实现
  4. include/caffe/common.cuh(9): error: function atomicAdd(double *, double) has already been defined
  5. ELK+Kafka 企业日志收集平台(二)
  6. 解决android中出现的无法加载library的问题
  7. openstack实例控制台显示响应时间过长_监控OpenStack的技巧
  8. spring 多租户_使用Spring Security的多租户应用程序的无状态会话
  9. java object转泛型_JAVA快速入门——基本结构、基本数据类型
  10. [编程手记小技巧]自定义调试信息宏及gcc技巧
  11. 46muduo库使用示例(五)
  12. 在CentOS中安装MySql数据库教程
  13. GlobalMapper--去除tif影像黑边
  14. OpenWrt路由器通过Aria2开启迅雷离线下载[图文教程]
  15. String.indexOf 用法
  16. 免费天气预报接口返回15天的天气JSON格式
  17. 计算机操作系统32位,电脑操作系统中32位和64位的区别
  18. Fast-paced Multiplayer
  19. 基于ZYNQ的数据存储和实时成像系统
  20. 安全运维到安全运营的转变

热门文章

  1. IDEA 中配置GIT环境
  2. gcc ld链接脚语法简明讲解
  3. STM32控制电机简易教程
  4. 算法面试题:扔玻璃杯的学问
  5. 解决Django与Vue的跨域问题
  6. USRP 型号对比与挑选
  7. python 官网下载地址
  8. 仿soul交友盲盒1.0全开源源码
  9. windows主机日志分析(持续更新)
  10. web(World Wide Web)