《UltraFast 嵌入式设计方法指南》(1)——系统级

作者:高视

刚接触Zynq不久,就发现Xilinx在它上面下了不少功夫,其中有很多很好的设计方法学,这些方法学对我们学习和掌握整个系统有很多帮助,更对自己以后工作有极大的帮助,特别是Xilinx为此发布的中文版数据手册《UltraFast 嵌入式设计方法指南》。这本书不仅对FPGA开发者是一本很好的指导书,而且对嵌入式开发者也是一部很好的指导书。只要反复阅读和实践,必定能让你自己不局限一亩三分地,技能更上一个层次,下面根据自己的实践和理解作简单地介绍阅读该书后的感受,欢迎大家指正交流。

本书共有8章+附录,第一眼看此书,发现章节划分的非常合理,可以很好地把自己学习的东西串起来,还是以后学习实践中很好的指导书,看一看这些章节你就知道为什么这么说,下面也按系统级、硬件级、软件级、调试和SDSoC介绍个人的理解和感受,今天先学习一下系统级,也就是书中的前2章和附录A:

1. 引言和附录A
引言中主要介绍各章节内容、嵌入式设计指导和设计方法检查表,对我们嵌入式设计时有很大参考意义;同时,有如何使用Documentation Navigator的教程,Documentation Navigator是文章管理软件,强烈推荐大家使用,它能加快我们的设计。因为,在适当的时间获得正确的信息,对于及时完成设计并确保整体设计成功而言十分重要,参考手册、用户指南、教程和视频都能够帮助我们尽快掌握赛灵思工具,而Documentation Navigator则是很好的资料来源。

而附录A中有各个资源对应的阅读手册,很值得查阅和参考,如下图:

2. 系统级考虑事项
系统级需要考虑:性能、功耗、时钟复位、中断、安全和剖析划分。彼此相辅相成也有交叉,但最终目的都是让我们的系统设计更优。

性能:
首当,其冲的是性能,在这里性能主要指在设计团队中跨硬件、软件和系统三个工程学科进行划分。可能因为自己经验不够,境界不够高,很多地方目前无法理解,但是能够初步理解,并且改变了自己的思维方式,受益颇深:

硬件工程学科方面主要是考虑PL中的AXI互联和PL与PS之间数据交互。PL中的AXI互联就是指我们常用的FPGA逻辑,和我们常用不同的是各个逻辑模块通过标准的AXI4总线协议互联,这样做可以让各个模块分给多个人员开发后整合并更灵活的升级,但对FPGA开发人员提出了更高的要求(需要熟悉使用总线);PL与PS之间的数据交互影响系统的性能,需要充分考虑吞吐量和延时,合理使用各种数据共享方式来进行数据交互,《UltraFAST 设计方法指南 (适用于 Vivado Design Suite) (UG949)》用户手册中有更详细的介绍,可以详细阅读。

软件工程学方面主要是PS 内运行的系统软件及其与储存器、I/O 和 PL 的交互。因为PS端主要是ARM处理器,主要考虑通过优化ARM来提高系统的性能,通过合理访问外部DDR、合理分配中断,最重要的是应该是用好PS DMA来搬运数据与PL交互,能很好的发挥ARM的DDR带宽和性能。

系统工程学方面主要是考虑硬件和软件的划分,合理划分硬件和软件会很大的影响系统的性能,因为硬件PL的思维是并行思维,软件PS的思维是串行思维,这2种思维方式有很大区别,对数据的搬移处理有很大区别。同样,硬件与软件之间数据的交互搬移会大大影响性能,因为系统主要是对数据的输入、处理和输出,如果数据搬移效率太低,性能自然查,资源自然高,所以在设计时,要时刻考虑数据的交互搬移,尽量用更好的方式去操作。

功耗:
其次,是功耗,在这里有很全面的功耗需要考虑的地方,对功耗比较敏感的设计,可以认真反复阅读和设计,包括功耗设计规范指导和功耗估计辅助软件XPE使用等。

贯穿整个设计周期管理的功耗如下图:

Zynq下功耗的分布情况:

PL功耗相关引脚:

PL端电源介绍:

功耗估计软件XPE:

文章中比较系统的介绍了功耗管理和需要考虑的因素及优化/估计方法,详细请阅读原文。我在这里主要谈一些个人对PL中逻辑资源对功耗影响及设计方法上的一些感受。

a. 同一个功能,100个人有100个设计,虽然功能实现的都差不多,但是资源消耗、时序和功耗却差别很大。很显然,资源越少,时序就会很好,功耗也会越少。所以,在设计前,需要多想想,根据PL的内部资源合理设计结构,好的结构就是成功的第一步;

b. PL内部的PLL的确是个好东西,但是PL中的功耗主要来自动态功耗,所以要合理安排时钟频率和时钟域,尽量用少的PLL和较高的频率;

c. 同样的道理,寄存器的翻转也是功耗的主要来源,所以要多用寄存器的CE信号来降低功耗,当然门控时钟更好,但易带来时序问题,需要谨慎使用;

d. 块状RAM也是功耗的来源,当不用时,可以使能驱动为低电平,同样不用的IO的设为高阻,适当使用IO电平;

e. 另外,规划好数据流和控制流,避免不合理的数据流和控制增大功耗。

时钟复位:
时钟和复位对整个系统来说很重要,Zynq中的外部时钟源可以是PS端,也可以是PL端。PS端必须要有外部时钟源(范围30~60MHz),内部的所有时钟都来自3个PLL:ARM、DRM和IO PLL。其中ARM PLL用于CPU的时钟,DRM用于DDR的时钟(挂在PS端的DDR),IO PLL用于外设的时钟(UART、SPI、SD和USB等)。

PS与PL之间可以的 AXI通道(AXI HP、AXI ACP、AXI GP)有PS到PL的异步接口,异步接口当然需要同步化,同步化都在PS内做了,所以PL可以之间将时钟连接到PS而不用考虑同步化。

另外,PS端向PL端提供FCLK时钟,所以PL的时钟源可以是FCLK或者外部晶振时钟源,要求不高的时钟可以直接用FCLK作为时钟源,要求高或者特殊要求的时钟就需要外部晶振源提供时钟源。PL内部的时钟使用和我们常用的FPGA逻辑设计一样通过PLL来衍生,并规划好时钟域和使用好内部的时钟资源。

Zynq的复位很多,主要包括:PS端上电复位、PS端系统复位、系统软件复位、看门狗定时复位、CPU复位、调试复位、外设复位和PL复位。每种复位都有它特定的功能,例如调试复位用于调试,复位处理时需要考虑好时钟域,特别是PL中的不同时钟域复位。

中断:
Zynq中的中断处理时对PS端CPU(CPU)而言,所以,如果PL端也要触发中断也通过PL-PS接口连接到PS端的中断向量给ARM CPU处理,如下图:

中断主要包括这些内容:中断源、中断ID、中断优先级和中断处理。这是CPU处理中常用的一些概念。中断源就是触发中断的来源、中断ID就是对应中断向量中的中断Table值,触发中断后通过查找表来获取中断情况,中断优先级,就是中断后先后处理任务情况,中断处理就是根据中断情况来执行中断任务。下图是手册中指出系统设计时需要考虑的中断情况,可能知识有限,目前很多还无法理解,努力学习中,也贴出来给大家看看。

安全:
Zynq中的安全主要有:安全启动、ARM TrustZone 技术和Linux部署。因为启动是否安全有关于数据流是否被破解,ARM TrustZone 技术是一种有效的安全技术,Linux操作系统本来就有权限设计和一些安全设计,所以提高系统的安全性。这方面内容接触不多,但在实际应用中却很有用,具体应用时可以仔细查阅和学习这部分。

剖析划分:
这部分内容东西很上档次,是系统设计时需要充分考虑的地方,也就是如何划分各种处理,主要包括:PS端处理器的处理划分、PL端的模块划分和PS与PL协调处理如何划分。要在这方面上很擅长,要很多知识点和经验,如果真很擅长,你就不再只是一个任务开发者,而是一个系统设计开发者,目前本人虽然没有达到这一层,但在不断努力,向这一层次上进。

PS端处理器的处理划分,主要均衡Linux操作系统和多核CPU之间的协调处理让处理器性能最优(速度、延时和负荷等);PL端的模块划分主要是协调FPGA资源、速度很功耗之间的平衡让处理最优;PS与PL协调处理如何划分主要是合理分解处理到PS和PL,同时优化PS和PL之间的数据交流让整个系统最优。手册中有很多介绍,非常建议多看看,虽然可能看不懂,但是会让让你的思维由以前系统的某一个点慢慢过渡到系统整个面。

3. 个人总结
说实话,《UltraFast 嵌入式设计方法指南》中系统级上面的内容真的很有层次,发现自己很多东西看不懂,很多东西以前没有从系统级角度思考过,也想起了2年前一位大牛对我说过这样一句话:“找一个技术开发者满地都是,但是找一个技术上有思考的设计开发者却很难,社会就缺这种人,所学不难,难在用好用巧”。趁现在有这个觉悟,一点点打开自己的思维,慢慢过渡自己的技术之路:由简单的开发者到有思想方法的设计者,用好所学点滴。

文章转载自:FPGA2嵌入式