XilinxAllProgrammableZynq-7000SoC设计指南主讲:何宾Email:hebin@mail.buct.edu.cnLOGOXinlinx大学计划课程2012.122Zynq-7000应用处理单元--概述内容包括应用处理单元概述、Cortex-A9处理器、侦听控制单元、L2高速缓存、片上存储器、APU接口、APU内的TrustZone、应用处理单元复位、功耗考虑、系统地址分配、中断、定时器和DMA控制器等。3应用处理单元(ApplicationProcessingUnit,APU)存在于PS内,包含带有NEON协处理器的两个Cortex-A9处理器。在多处理器配置中,将两个处理器连接起来共享一个512KBL2高速缓存。每个处理器是一个高性能、低功耗的核,各自有两个独立的32KBL1数据高速缓存和指令高速缓存。Zynq-7000应用处理单元--概述Zynq-7000应用处理单元--概述45Zynq-7000应用处理单元--概述Cortex-A9处理器结构Cortex-A9处理器实现ARVV7-A结构支持完整的虚拟存储器能执行32位ARM指令、16位及32位Thumb指令和在Jazelle状态下的一个8位Java字节码。NEON协处理器媒体和信号处理结构增加了用于音频、视频、图像和语音处理和3D图像的指令。这些高级的单指令多数据流(SingleInstructionMultipleData,SIMD)指令可用于ARM和Thumb状态。6多核配置的两个Cortex-A9处理器带有一个侦测控制单元SCU,用于保证两个处理器之间,以及与来自PL的ACP接口一致性。为了提高性能,Cortex-A9多核提供了一个用于指令和数据的,共享统一的512KBL2高速缓存。与L2高速缓存并列,提供了一个256KB的片上存储器OCM,用于提供一个低延迟的存储器。Zynq-7000应用处理单元--基本功能7加速器一致性端口ACP,用于方便PL和APU之间的通信。这个64位的AXI接口允许PL作为AXI主设备。该设备能访问L2和OCM,同时保证存储器和CPUL1缓存的一致性。统一的512KBL2高速缓存是一个8路组关联结构,允许用户基于缓存行、路或者主设备锁定缓存行的内容。所有通过L2缓存控制器的访问能连接到DDR控制器,或送到PL,或PS内的其它相关地址的从设备。为了降低到DDR存储器的延迟,提供了一个从L2控制器到DDR控制器的专用端口。Zynq-7000应用处理单元--基本功能8两个处理器核内建了调试和跟踪能力,并且互连作为CoreSight调试和跟踪系统的一部分。用户能通过调试器访问端口(DebugAccessPort,DAP)控制和查询所有的处理器和存储器。通过片上嵌入跟踪缓冲区(EmbeddedTraceBuffer,ETB)或者跟踪端口接口单元(Trace-PortInterfaceUnits,TPIU),将来自两个处理器的32位AMBA跟踪总线(AMBATraceBus,ATB)主设备和其它ATB主设备(比如ITM和FTM)汇集在一起,产生统一的PS跟踪。Zynq-7000应用处理单元--基本功能9ARM结构支持多个操作模式,包括:超级、系统和用户模式。用于提供不同级别的保护和应用程序级别。这个接口支持TrustZone技术,用于帮助创建安全的环境,用于运行应用程序和保护这些应用程序的内容。内建在ARMCPU和其它外设的TrustZone使能一个安全的系统,用于管理密钥、私有数据和加密信息,不允许将这些秘密泄露给不信任的程序或者用户。Zynq-7000应用处理单元--基本功能10自带定时器PU包含一个32位的看门狗定时器和一个带有自动递减特性的64位全局定时器。它们能用做一个通用的定时器,也可以作为从休眠模式下唤醒处理器的一个机制。Zynq-7000应用处理单元--基本功能Zynq-7000应用处理单元--系统级视图1112APU是系统中最关键的部件,它构成了PS、PL内所实现的的IP和诸如外部存取器和外设这样的板级设备。APU的系统结构图,通过了L2控制器的两个接口和一个到OCM的接口(OCM和L2高速缓存并列),APU和系统剩余的部分进行通信。Zynq-7000应用处理单元---系统级视图13ACP端口连接到SCU来自通过SCU的双核Cortex-A9MP系统的访问,以及来自要求和Cortex-A9MP系统一致的其它主设备的所有访问。所有不通过SCU的访问和CPU是非一致性的,软件必须明确地管理同步和一致性。Zynq-7000应用处理单元--系统级视图14来自APU的访问,其目标可以是OCM、DDR、PL、IOP从设备或者PS子模块内的寄存器。为了将访问OCM的延迟降低到最小,来自SCU的一个专用主设备端口提供了处理器和ACP到OCM地直接访问,其访问延迟甚至小于L2高速缓存。Zynq-7000应用处理单元--系统级视图15所有到DDR的APU的访问,通过L2缓存控制器进行连接。为了改善DDR访问延迟,提供了一个来自L2缓存控制器到DDR存储器控制器的专用主端口,允许所有的APU-DDR的交易不经过和其它主设备共享的主互联。来自APU的其它访问,这些访问既不绑定OCM,也不绑定DDR,穿过L2控制器。并且,使用第二个端口连接到主互联。通过L2缓存控制器的访问是不必缓存的。Zynq-7000应用处理单元--系统级视图16APU和它的子模块工作在CPU_6x4x时钟域中。来自APU到OCM的接口和到主互联的接口都是同步的。主互联能运行在1/2或者1/3的CPU频率。DDR模块在DDR_3X时钟域,与APU是异步的。到APU模块的ACP端口包含一个同步器,PL主设备使用这个端口,使得时钟和APU是异步的。Zynq-7000应用处理单元--系统级视图17APU实现双核Cortex-A9MP配置每个处理器有它自己的SIMD媒体处理引擎NEON、存储器管理单元(MemoryManagementUnit,MMU)和独立的32KBL1指令和数据高速缓存。每个Cortex-A9处理器提供了两个64位的AXI主接口用于到SCU的独立指令和数据交易。取决于地址和属性,这些交易连接到OCM、L2高速缓存、DDR存储器或者通过PS互联到其他PS内的从设备,或者到PL。Zynq-7000应用处理单元--Cortex-A9处理器18每个带有SCU的处理器接口包含所要求的侦测信号,用于提供处理器内的L1数据缓存和用于共享存储器的共享L2缓存的一致性。Cortex-A9和它的子系统也提供了完整的Trustzone扩展,用于用户的安全性。Zynq-7000应用处理单元--Cortex-A9处理器19Cortex-A9处理器实现必要的硬件特性用于程序调试和跟踪调试生成支持。硬件计数器用于处理器和存储器系统操作时搜集统计数据。Cortex-A9内的主要子模块是中央处理单元CPU、L1指令高速缓存和数据高速缓存器、存储器管理单元、NEON协处理器和内核接口。Zynq-7000应用处理单元--Cortex-A9处理器20每个Cortex-A9的CPU能在一个周期给出两个指令,并且以无序的方式执行。CPU实现动态地分支预测和可变长度的流水线,性能达到2.5DMIPs/MHz。Cortex-A9处理器实现ARMv7-A的结构、支持充分的虚拟存储器能执行32位的ARM指令、16位及32位的Thumb指令和在Jazelle状态下的一个8位Java字节码。Zynq-7000应用处理单元--Cortex-A9处理器21Cortex-A9CPU内所实现的流水线,采用了高级取指和指令预测技术,它将潜在的存储器延迟引起的指令停止和分支解析分开。在Cortex-A9CPU中,预加载最多四个指令缓存行,用于降低存储器延迟对指令吞吐量的影响。CPU取指单元能在每个周期连续发送2~4条指令到指令译码缓冲区,以保证高效地使用超标量流水线。Zynq-7000应用处理单元--Cortex-A9处理器22CPU实现一个超标量解码器,能在一个周期内解码两个完整的指令。四个CPU流水线中的任何一个流水线都能从发送队列中选择指令。并行流水线支持每个周期贯穿下面单元的并行执行:全部两个算术单元、加载-保存单元和任何分支的解析单元。Zynq-7000应用处理单元---中央处理器23Cortex-A9CPU采用了预测地执行指令,这样使能动态地重命名物理寄存器到一个虚拟可用的寄存器池中。CPU使用这个虚拟寄存器重命名来消除寄存器之间的依赖性,但不会影响到程序正确地执行。这个特性通过一个基于循环展开的有效硬件,允许代码的加速。同时,通过在相邻指令间消除数据的依赖性提高流水线的利用率。Zynq-7000应用处理单元---中央处理器24Cortex-A9CPU中的存储器系统内,提交相互依赖的加载-存储指令用于解析。这样,大大降低了流水线的停止。通过自动或者用户驱动地预取操作,Cortex-A9CPU核支持最多四个数据缓存行填充要求。CPU的一个关键的特性就是指令的无序写回。这样,就可以释放流水线资源,而不依赖于系统提供的、所要求数据的顺序。Zynq-7000应用处理单元---中央处理器25在指令条件或者前面分支解析之前,或者需要写的数据可用之前,能预测地发出加载/保存指令。如果用于执行加载/保存的条件失败,可能产生的任何不利影响,比如:修改寄存器的行为,都将被刷新。Zynq-7000应用处理单元---中央处理器26分支预测为了减少在高度流水的CPU内分支所造成的不利影响,Cortex-A9内实现静态和动态地分支预测:由指令提供静态分支预测,在编译时候确定。动态地分支预测使用前面一个指定指令的执行结果,以确定是否采用分支。动态分支预测逻辑使用一个全局分支历史缓冲区(GlobalBranchHistoryBuffer,GHB)。GHB是一个4096入口的表,包含用于指定分支的2位预测信息。当每次执行分支时,更新预测信息。Zynq-7000应用处理单元---中央处理器27分支执行和整体的指令吞吐量也得益于分支目标地址缓存(BranchTargetAddressCache,BTAC)的实现。BTAC保存着最近分支的目标地址。这个512入口的地址缓存的结构是2路x256入口。基于计算的有效地址和转换的物理地址,在产生真正的目标地址前,提供用于指定分支的目标地址到预加载单元。此外,如果一个指令循环适配四个BTAC入口,关闭指令缓存访问,以降低功耗。Zynq-7000应用处理单元---中央处理器28Cortex-A9CPU能预测条件分支、无条件分支、间接分支、PC目的数据处理操作和在ARM和Thumb状态之间切换的分支。Zynq-7000应用处理单元---中央处理器29然而,不能预测下面的分支指令在状态之间切换的分支(除了ARM到Thumb转换和Thumb到ARM转换以外)。当它们用于从异常返回时,不能预测带有S后缀的指令。因为它们可能改变特权模式和安全性状态,对程序的执行有不利的影响。所有用于改变模式的指令。Zynq-7000应用处理单元---中央处理器30通过将CP15c1控制寄存器的Z比特设置为1,使能程序流预测。在打开程序流预测前,必须执行一个BTAC刷新操作。其额外的效果是将GHB设置为一个已知状态。Cortex-A9也用一个8入口的返回堆栈缓存,保存了32位子程序的返回地址。这个特性大大降低了执行子程序调用带来的不利影响,可以寻址最大8级深度的嵌套例程。Zynq-7000应用处理单元---中央处理器313、指令和数据对齐注意:应用处理单元APU和PS整体,只支持用于指令和数据的小端结构。ARM的结构指定了ARM指令为32位宽度,要求其为字对齐方式。Thumb指令是16位宽度,要求半字对齐。Thumb-2指令是16位或者32位宽度,也要求半字对齐。数据访问可以是非对齐的,CPU内的保存/加载单元将其分解为对齐地访问。当要求的时候