基于模块化设计方法实现FPGA动态部分重构

动态部分重构可以通过两种方法实现:基于模块化设计方法(module-based partial reconfiguration)和基于差别的设计方法(difference-based partial reconfiguration),本文以基于模块化设计为例说明实现部分重构的方法。
1 fpga配置原理简介
本文针对xilinx公司的fpga进行研究,支持模块化动态部分重构的器件族有virtex/-ii/-e和virtex-ii pro。
xilinx公司fpga是基于sram工艺的,包括配置逻辑块(clbs),输入输出块(iobs),块rams,时钟资源和编程布线等资源[2]。clbs是构造用户所需逻辑的功能单元,iobs提供封装引腿与内部信号引线的接口。可编程互连资源提供布线通道连接可配置元件的输入和输出到相应的网络。
存储在内部配置存储器单元中的数值决定了fpga实现的逻辑功能和互接方式。virtex fpga的配置存储器是由配置列(configuration columns)组成的,这些配置列以垂直阵列的方式排列,如图1给出了virtex-e xcv600e器件的配置列构成图。配置存储器可分为五种配置列:center 列包含四个全局时钟的配置信息;两个iob 列存储位于器件左边和右边所有iobs的配置信息;clb列存储fpga基本逻辑功能的配置信息;block selectram content列存储内部块ram的配置信息;block selectram interconnect列存储内部块ram间互联的配置信息[3]。
图1 virtex-e xcv600e的配置列构成及地址
配置列根据分配给它的配置地址(configuration address)来寻址。每一个配置列在fpga内都有唯一的主地址(major address)空间。
fpga的逻辑功能通过配置比特流(configuration bitstream)来实现。对于动态部分重构功能来说,需重构的配置逻辑是通过下载不同的部分配置比特流来实现的。
2基于模块化动态部分重构fpga的设计方法
所谓的fpga模块化设计就是将系统按照一定规则划分成若干模块,然后对每个模块分别进行设计、综合,并将实现结果约束在预先设置好的区域内,最后将所有模块的实现结果有机的组织起来完成整个系统的设计[4]。其划分模块的基本原则为:子模块功能相对独立,模块内部联系尽量紧密,模块间的连接尽量简单。对于那些难以满足模块划分准则的具有强内部关联的设计,不适合采用此设计方法。
fpga模块化设计的优点在于:团队式并行工作从而加速整个项目的开发进度;每个子模块都能够灵活使用综合和实现工具独立进行优化,从而达到更好的优化结果;调试、更改某个子模块时,不会影响其他模块的实现结果,保证了整个设计的稳定性与可靠性。
模块化设计方法使用xilinx公司的ise软件设计工具,常用hdl语言作为设计输入,顶层模块描述设计的全局逻辑,包括设计的输入/输出、所有子模块的黑盒子(black box)声明以及子模块之间的连接关系。所谓黑盒子声明是指在顶层模块中仅仅对子模块进行端口描述与信号属性声明,并不包含任何实际逻辑和时序关系的描述。子模块通常也使用hdl语言描述,分别设计出各子模块的逻辑实体并综合所设计的子模块。由于子模块的输入/输出并不是整个设计的外部接口,所以在综合过程中应禁止子模块插入i/o端口,而仅在综合顶层模块时才插入i/o端口。最后将所有子模块的实现结果和顶层的实现结果有机地组织起立,完成整个设计的实现。图2是基于模块化设计方法的流程。
图2 模块化设计流程
采用模块化设计方法实现fpga的动态部分重构,首先进行模块划分,将设计的固定逻辑即运行过程中不需要更改的逻辑划分到固定模块,将需要更改的部分划分到可重构模块中。其次模块的放置位置和大小也有限制,必须遵循一定的规则[5]:可重构模块的高度和器件的高度一致,从图1中可以直观地认为模块必须包含整个配置列;可重构模块的宽度最小是4个slice(一个clb包含两个完全相同的slice),并且必须为4个slice的倍数;如果可重构模块位于器件的最左边或是最右边的slice列,则所有位于器件边缘的iobs将作为可重构模块的资源;为了减少设计的复杂度,可重构模块的数量应该尽量少等。
fpga动态部分重构的实现
在本设计实例中,fpga实现的功能是对外围接口电路进行逻辑控制以及根据外围不同设备输入的数据选择适当的数据处理算法。据此将设计划分为固定模块和可重构模块,其中固定模块内实现对外接口的控制逻辑,可重构模块内实现数据处理算法。本例中只将fpga的逻辑功能更换一次,即可重构模块只部分重构一次,将其在重构前后的不同逻辑功能分别计作reconfig_a和reconfig_b。系统会根据需要动态部分重构fpga,为不同的数据源选择适合的处理方法。本设计由virtex-e xcv600e器件来实现。
根据模块所需资源的大小和模块划分原则,在用户约束文件(ucf)中将每个模块的位置进行约束,如下所示:
inst fix area_group = ag_fix ;(1)
area_group ag_fix range = clb_r1c1:clb_r48c36 ;(2)
inst reconfig area_group = ag_reconfig ; (3)
area_group ag_reconfig range = clb_r1c37:clb_r48c72 ;(4)
其中(2)、(4)指定了两个模块的具体位置。
按照模块化设计流程,分别对固定模块fix和可重构模块reconfig_a和reconfig_b进行设计综合,再将两个可重构模块分别和固定模块进行组合,完成整体设计。此过程中可重构模块和fpga的整个设计分别生成配置比特流。
图3和图4是fpga部分重构前后的整个设计的物理实现,图中左半部分为固定模块区域,右半部分为可重构模块区域。从两图中可知在部分重构前后可重构模块区域内布线发生变化,而固定模块区域内布线没有发生变化。
图3 fix和reconfig_a整体设计的物理实现结果
图4 fix和reconfig_b整体设计的物理实现结果
fpga动态部分重构时首先须将整个配置文件下载到器件中,重构时系统根据运行的需要选择适合的部分重构配置比特流。virtex-e xcv600e配置比特流的大小为495204个字节,而可重构模块reconfig_a和reconfig_b配置比特流的大小分别为93324个字节和111868个字节,因此采用部分重构不仅能够在运行不间断的情况下更新可重构模块区域内的逻辑功能,而且也能使重构配置时间大大减少。
3 结论
本文以xilinx fpga为研究对象,介绍了采用模块化设计实现fpga动态部分重构功能的方法。fpga的动态部分重构功能使硬件设计更加灵活,可以将不同设计定位到芯片内同一逻辑资源部分,重构此部分逻辑资源,同时保持其他部分电路功能正常,从而灵活快速的改变系统设计,能够减少器件的花费,降低功耗、更有效的利用电路板空间,可以应用于系统实时容错、自适应硬件算法等。

重庆电信发布“智能随选”产品,以四大优势为企业解困
回顾人工智能开发者大会上声智科技远场语音交互技术实力获认可
AVL公司展示高性能氢燃料发动机
华为p40pro怎么升级鸿蒙系统 教程如下
以太网数据包协议头结构详解
基于模块化设计方法实现FPGA动态部分重构
东芝拆分半导体业务招标启动 出售股份不足两成
蓝牙网关EW-DTU01如何接入阿里云MQTT?
可编程控制器的基本应用详细讲解
一加6最新消息预测:一加6五大新特性提前看,全面升级你还买苹果三星吗?
三星Galaxy Z系列产品国行版发布
信号发生器基础知识科普
人工智能存在诸多隐患
仅剩2天,错过后悔! 618活动钜惠荣耀FlyPods 3到手价599元
未来UPS技术趋势:无变压器技术解析
基于MOSFET控制的PWM型直流可调电源的设计与实现
CPU整体框架是由哪几部分组成的
三星欲推出新款 Galaxy Buds+ 无线耳机 基本外形设计与初代 Galaxy Buds 保持一致
无人机倾斜摄影技术的原理及优势
AMD预告官宣世界最强X86处理器