微控制器(MCU)领域如今仍由 8 位和 16 位器件控制,但随着更高性能的 32 位处理器开始在 MCU 市场创造巨大收益,在系统设计方面,芯片架构师面临着 PC 设计人员早在十年前便遇到的挑战。尽管新内核在速度和性能方面都在不断提高,一些关键支持技术却没有跟上发展的步伐,从而导致了严重的性能瓶颈。
很多 MCU 完全依赖于两种类型的内部存储器件。适量的 SRAM 可提供数据存储所需的空间,而 NOR 闪存可提供指令及固定数据的空间。
在新 32 位内核的尺寸和运行速度方面,嵌入式 SRAM 技术正在保持同步。成熟的 SRAM 技术在 100MHz 的运行范围更易于实现。对 MCU 所需的典型 RAM 容量来说,这个速度级别也更具成本效益。
但是标准的 NOR 闪存却落在了基本 32 位内核时钟速度之后,几乎相差一个数量级。当前的嵌入式 NOR 闪存技术的存取时间基本为 50ns (20 MHz)。这在闪存器件和内核间转移数据的能力方面造成了真正的瓶颈,因为很多时钟周期可能浪费在等待闪存找回特定指令上。
标准MCU 执行模型——XIP (eXecute In Place)更加剧了处理器内核速度和闪存存取时间之间的性能差距。
大容量存储中的应用容错及 SRAM较高的成本是选择直接从闪存执行的两个主要原因。存储在闪存内的程序基本不会被系统内的随机错误破坏,如电源轨故障。利用闪存直接执行还无需为MCU器件提供足够的 SRAM,来将应用从一个 ROM 或闪存器件复制至目标 RAM 执行空间。
消除差距
理想的情况是,改进闪存技术,以匹配32位内核的性能。虽然当前的技术有一定的局限,仍有一些有效的方法,可帮助架构师解决性能瓶颈问题。
简单的指令预取缓冲器和指令高速缓存系统在32位MCU设计中的采用,将大大提高MCU的性能。下面将介绍系统架构师如何利用这些技术将16位的MCU架构升级至32位内核CPU。
在 MCU 设计中引入 32位内核
图 1 介绍了将现有16位设计升级至基本32位内核的情况,显示了新32 位内核及其基本外设集合之间的基本联系。由于我们在讨论将新的32位处理器内核集成至新的 MCU 设计,我们假设可采用新32位内核采用以下规范。
图1 为现有设计引入32位内核
32 位内核——改良的哈佛架构
与很多 MCU 一样,新的 32位 内核也采用改良的哈佛架构。因此,程序存储和数据存储空间是在两个独立的总线构架上执行。一个纯哈佛设计可防止数据在程序存储空间被读取,该内核改良的哈佛架构设计仍可实现这样的操作,同时,该32位内核设计还可实现程序指令在数据存储空间的执行。
在标准总线周期内,程序和数据存储器接口允许插入等待状态,有助于响应速度缓慢的存储或存储映射器件。
32位内核——工作频率
新内核的最高工作时钟频率为120MHz,是被替代的16位内核速度的六倍。
32位内核——指令存储器接口
指令存储系统接口有一个32位宽的数据总线,以及一个总共地址空间为1MB的20位宽的地址总线。尽管 32位内核具备更大的地址空间,而这足够满足这个MCU的目标应用空间。标准的控制信号同样具备为缓慢的存储器件插入等待状态的能力。
该设计的闪存器件与16位设计采用的技术一样,最高运行速度达20 MHz。
32 位内核——数据存储器接口
系统 SRAM 和存储器映射外设都通过系统控制器与处理器数据总线相连。系统控制器可提供额外的地址解码及其他控制功能,帮助处理器内核正确访问数据存储器或存储器映射外设,而无需处理特定的等待状态、不同的数据宽度或每个映射到数据存储空间的器件的其他特殊需求。 [page]
系统控制器和处理器内核之间的数据总线为 32 位宽,与系统控制器和SRAM 间的数据总线宽度相同。系统控制器和外设以及 GPIO 端口间的数据总线宽度可为 8 位、16 位或 32 位,视需求而定。
目标设计采用的 SRAM 与 16 位设计采用的类型相同,在 120 MHz时可实现 0 等待状态操作。
初步分析
目前系统的性能由几个因素控制。处理器内核与闪存器件速度的差异可极大地影响性能,因为至少有五个等待状态必须添加到每个指令提取中。根据粗粒经验法则,至少每十个指令有一个读取或存储。每条指令加权平均周期(CPI)的典型顺序为:
CPI = (9 inst * 6 闪存周期 + 1 inst *1 SRAM周期) / 10 指令
CPI = 5.5
内核的吞吐量由闪存接口的速度决定,因此以前所有的32位内核都是数据通道宽度的两倍。
在这种情况下,SRAM接口无关紧要。虽然某些问题很有可能源于存储接口方面,如中断延迟和原子位处理,SRAM存储器的零等待状态操作可以忽略。关注的重点是通过采用目前可用的、具有成本效益的技术,来提高指令存储接口的性能。
提高CPU内核性能——闪存接口
来自高性能计算环境的一个通用概念是高速缓存,在主要存储器件和处理器内核之间采用更小及更快的内存存储,可以实现突发数据或程序指令的更快访问。
设计和实现高速缓存可能非常复杂——需要考虑高速缓存标记、N-Way级联和普通高速缓存控制等问题——仅关注程序指令存储器可让这项工作变得非常简单。这是因为对此特定的 32 位内核来说,对程序存储器的访问是一个严格的只读操作。在这种情况下,我们只需考虑一个方向的数据流可以减少缓冲器和高速缓存系统的复杂性。
预取缓冲器
增加闪存接口总体带宽的一个简单方法是扩展处理器和闪存器件间的通道宽度。假定闪存的速度一定,增加带宽的另外一个方法是扩展接口宽度,以实现一次提取更多指令,创造一个更为快速的闪存接口外观。
这是预取缓冲器的一个基本前提。它利用了连接闪存的更宽接口的优势,可在同样的时钟周期数内读取更大的数据量,这通常只要花闪存读一个字的时间。
因此,预取缓冲器还定义了新数据通道的最小尺寸,原因显而易见。
图2.1显示了我们的120 MHz内核连接到20 MHz闪存阵列的情况。采用两个系统间的速度比作为起始值,我们可以确定预取缓冲器、闪存接口读取的宽度,假设我们需要在无需等待状态的情况下读取指令。
图2.1 指令预取
在这种情况下,预取/闪存数据通道将是:
(120/20)X32位=192位宽
预取缓冲器控制逻辑不断对存取缓冲器的读取数进行标记。最后一次存取后,它将使下一个周期从闪存重新加载整个缓冲器。
预取缓冲器控制逻辑还可识别缓冲器每次进入的有效地址。它还将提供适当的解码,根据正确的顺序指令显示处理器数据总线,当一个执行分支需要完整的新的顺序指令时,将重新加载缓冲器。
当然,在提取新的指令时,分支将造成一些额外的延迟。但是由于相比处理器内核,预取缓冲器实现六合一方法在数据通道宽度方面具有绝对的优势,为该分支问题的最终平衡的结果付出的代价是值得的。
更多经验法则分析都显示,一个典型的嵌入式应用有20%发生分支的机会,每五个周期相当于一个分支。采用之前的方法,CPI值现在为:
周期+1指令*6周期)/5指令
CPI = 2.0
我们已经看到利用基本实现方法,整个系统周期效率有了大幅提高。 [page]
图2.1还显示了一个更为现实解决方案方法,即将六个独立的闪存系统的32位总线加在一起,而不是重新设计一个新的、极宽的数据总线闪存系统。预取缓冲器控制逻辑将自动创建六个连续的程序地址,然后允许一个正常的读取周期同时访问所有六个组。在读取周期的末尾,预取缓冲器现在可保持六个新的指令,而非一个,模拟的零等待状态系统。
指令高速缓存
形式指令高速缓存赋予预取缓冲器更高水平的复杂性,因为高速缓存不需要包含整个高速缓存阵列的特定线性地址。形式高速缓存的尺寸也比简单预取缓冲器大,它可能在高速缓存内存储整个循环序列。
图 2.2 显示了一个简单的有 8 块、单路的高速缓存设计,1 块有 16 个字节。虽然这么小的高速缓存很难实现,但它对指令执行很有用。在这种情况下,地址标记将是整个地址的高 12 位,而索引将是寻址高速缓存块内的特定条目的余下的两位。
图2.2 指令侧高速缓存
与指令预取缓冲器相比,指令高速缓存系统具有更复杂的地址比较系统,因为该高速缓存阵列不仅包括每个高速缓存块的连续寻址指令,而且可以将指令地址空间的任何区域包含在高速缓存块内。
为了让高速缓存更有效地工作,在闪存器件和指令高速缓存之间应当实现尽量宽的数据通道,保证内核能够以最快的速度执行程序指令。指令高速缓存在与闪存器件的接口上实现了一个指令预取机制来解决这个问题。否则,闪存存取时间的问题就会影响内核执行速度。
在正常执行过程中,所需的指令地址高位和高速缓存阵列的指令标记间开始一连串的比较。如果找到匹配的地址,高速缓存命中即被寄存,指令地址的低位将被用于高速缓存块内的索引,以找回所需的指令。如果没有发现匹配的地址,就是我们所说的高速缓存不命中。高速缓存不命中将导致高速缓存控制器从存储区的特定区域读入包含所需指令的缓存块。被替代的高速缓存块通常是阵列中最旧的高速缓存块。
当使用高速缓存时,基本性能分析变得更加复杂,因为这时高速缓存不命中数在方程里引入了一个新的变量。分析典型应用代码可帮助芯片设计人员确定高速缓存大小和实际性能增益的最佳平衡。
对于我们的设计,假定 CPI 将在以下范围内是比较合理的:
<= CPI (cache) <= 2.0
在高速缓存大得足够存储大多数应用主程序的情况下,性能增益可能非常显著,因为系统正在接近 0 等待状态执行环境。
采用改良的哈佛架构(Modified Harvard Architecture)设计的指令高速缓存的一个重要优势是高速缓存无需执行回写操作。与数据高速缓存相比,这种实现要简单的多,数据缓存还要保证改动过的高速缓存数据正确地存储进主数据存储器。
改进的设计
我们现在可以把学到的知识应用于我们系统的第一个框图,并从预取/指令高速缓存缓冲器系统提供的增益中获益。详见以下的图 3。
图3 改进的32位内核设计
与之前的16位设计相比,新设计能够以三倍的速度(120 MHz / 2.0 CPI(预取)/ 20 MHz(16 位时钟)执行指令,通过适当选择最终指令高速缓存的大小,很容易就能实现非常接近单等待状态闪存系统运行的性能。
虽然指令预取缓冲器是一种简单的实现,但它通过屏蔽闪存和 32 位内核执行速度之间的存取时间差异,显著地改善了系统吞吐量。预取缓冲器是一个非常简单的设计,只需要很少的额外逻辑。大部分额外逻辑与扩展闪存系统和预取缓冲存储器之间的通道有关。设计的简单有利于它完全透明地展示给软件程序员,他们只需允许或禁用该功能就可以了。
形式指令高速缓存是一种更复杂的解决方案,需要至少与预取缓冲器相同数量的额外逻辑电路,以及管理指令高速缓存正常运行的额外逻辑电路。设计人员需要分析 MCU 运行的典型应用,以确定能够最好地平衡性能和成本的高速缓存大小。当然,指令高速缓存部署更为昂贵,但是在许多情况下,系统实现的性能可达到 0 等待状态系统,对性能产生显著的积极作用。软件程序员还必须了解与指令高速缓存有关的一些基本控制和维护问题,但是在大多数情况下,它们可以一劳永逸地运行,只是在系统初始化时才需要执行。
只用新的 32 位器件直接替代现有的 8 位或 16 位内核是不够的。芯片设计人员还必须调整和改进整个 MCU 设计,以适应高性能、高速度 32 位内核的新要求。我们需要这样的调整来确保新的 32 位内核能够释放最高性能。采用预取缓冲器和指令高速缓存是改进微控制器设计的两个直接途径,微控制器与 32 位内核和现有存储器技术直接相关。
上一篇:8位、32位MCU整体研发成本比较
下一篇:嵌入式多媒体应用的多处理器核软件设计框架
推荐阅读最新更新时间:2024-03-16 13:59