和任天堂的上一代掌机一样,NDS的系统围绕一个名为CPU NTR的大芯片展开。 其中"NTR"是"Nitro"的缩写,是最初的NDS的代号。 该SoC也是一个成功的任天堂-ARM合作伙伴关系的延续,该合作始于Game Boy Advance。
现在,在我们查看新CPU之前,让我们看看ARM在90年代后期的发展,因为这影响了最终在任天堂DS中找到的技术。
ARM的新领域
在90年代中期,ARM公司从移动市场中获得了大量业务(在手机变得"智能"之前)。 然而,它在满足某个特定行业方面遇到了困难:高性能计算。 ARM7被许多移动设备广泛采用,但它未能完全满足苹果公司(其"Newton"PDA系列)和Acorn公司(其RiscPC系列)的需求,这些公司都发布了可以从更快的CPU中受益的软件。 除了缺乏64位解决方案(MIPS已经在商业化外),ARM还无法生产出速度超过40 MHz的CPU。 总体来说,瓶颈开始累积。

DEC 的 'Digital Personal Workstation' 型号 433au(1997 年),配备 Alpha 21164A CPU。
然而,在ARM7线的商业化过程中,ARM已经开始开发一个称为ARM8的继任者,这是进入高性能市场的第一次尝试。 巧合的是,Digital Equipment Corporation (DEC),这家以其 PDP 和 VAX 系列机器(所谓的'小型计算机')及复杂的 VMS 操作系统而闻名的美国公司,正面临一个相反的问题:他们难以基于其高性能解决方案交付低功耗 CPU。
好吧,事情是这样的,ARM 的授权模式 为 DEC 提供了一个机会,它选择通过借用 ARM 的材料(其指令集和微架构)开发新的 CPU。
最终,DEC借助ARM的帮助,采用其基于RISC的Alpha处理器的数据路径设计,并与ARM的微架构相结合 。 这种合作产生了StrongARM CPU,于1996年发布,针对高性能市场。

这是用于Acorn RiscPC CPU升级卡的233 MHz StrongARM CPU。
StrongARM是一种基于ARM的新型CPU,其特点包括:
- ARMv4指令集。 如果你想了解更多,我之前在Game Boy Advance的文章中分析过。
- 高达233 MHz的时钟速度,比最强的ARM7芯片快约583%。
- 5级流水线,与原来的3级设计相比又做了提升。
- 一个新的缓存系统,实现了Harvard架构,其中16 KB用于指令,另16 KB用于数据。
- 这种设计有助于缓解内存瓶颈(这是冯·诺依曼/普林斯顿模型所遭受的问题)。
值得一提的是,这个芯片仍然能够以3.3 V的电源工作,就像以前的ARM芯片一样。 事实上,StrongARM需要2伏电压,仅消耗1瓦功率 。 相比之下,英特尔的200 MHz奔腾芯片运行在3.5 V,功耗高达15.5 W 。
正如预期的那样,Acorn和Apple都被这个新芯片所迷住,它们分别立即使用DEC的发明来出货CPU升级和新的Newton模型。
同年,ARM还发布了他们承诺的基于ARM8的CPU,ARM810。 它相对较慢,并且在实际应用中没有提供任何优势。 因此,投入不足和时间过晚导致了没有商业兴趣。 因此,ARM继续改进ARM7系列以适应移动市场。 然而,DEC 的 CPU 潜力是如此具有破坏性,以至于 ARM Holdings 吸收了 StrongARM 的设计 ,以生产其下一代 CPU,即 ARM9(这也是任天堂 DS 所采用的)。
转折点
借助StrongARM,ARM还巩固了其在掌上市场的地位,完全取代了作为可行替代品的MIPS和SuperH。 从那时起,ARM走上了成为最广泛采用的移动设备架构的道路。
不幸的是,对于DEC来说,这个CPU将是他们在1998年被Compaq收购之前的最后一个重大成就。 然后,StrongARM 的命运将掌握在英特尔手中,他们在新的 'Intel XScale' 系列下继续开发... 直到他们清算该部门以专注于 '低功耗' 的 x86 CPU(即英特尔 Atom)。 15年后,不仅英特尔错失了移动市场的机会,现在他们还发现自己在桌面领域与ARM展开激烈竞争。
任天堂首次亮相的SoC
除了上述改进外,CPU NTR还捆绑了一个有趣的多处理器架构,使用了两种不同的ARM CPU,ARM7TDMI和ARM946E-S。 这种设计是在ARM Holdings正式发布多处理器解决方案之前完成的。 因此,考虑到当前的技术实现,可能有人认为NDS的多处理器架构不是很正统。
虽然这不是本系列第一次分析游戏机的并行系统,但是NDS的设计确与其他游戏机有很大不同。 例如,NDS的设计有别于世嘉土星"实验性质"的主从配置,也不同于PS1或者N64的"协处理器"方案。 NDS包括两台非常独立的计算机,可以分别独立执行操作。每台计算机都有一条专用的总线。 这种设计方法被称为非对称多处理(Asymmetric multiprocessing)。CPU因此而相互依赖,并将左右这款游戏机的整体性能。
现在让我们看看这两颗CPU。
ARM7TDMI
首先说说我们较为熟悉的CPU。 ARM7TDMI 与 GBA 的 CPU相同,但现在运行速度提高到约34 MHz(原速度的两倍)。 它仍然包含所有原有功能(特别是Thumb)。
然后讲讲新变化:由于任天堂的工程师将ARM7放置在大多数I/O端口旁边,这个CPU将负责调节和协助I/O操作。 事实上,另一个处理器不能直接连接I/O。 如你所见,ARM7不是负责整个系统的"主"处理器。它负责在多个组件之间传递数据,是用来分担一部分主CPU负载的"子处理器"。
ARM946E-S
这是任天堂DS的"主"CPU,ARM946E-S。 它的运行速度为约67 MHz,所以并不是"StrongARM速度"。 然而,作为ARM9系列的一部分,该核心不仅继承了ARM7TDMI和StrongARM的所有特性,还包括一些额外的部分,你可能会感兴趣:
- ARMv5TE ISA,是之前的ARMv4 ISA和Thumb的延伸,包含更多指令和更快的乘法器。
- 如果仔细观察核心的名称,字母"E"表示增强型(Enhanced)DSP。这意味着这些新指令大多与信号处理有关。
- 扩展手指有时被称为手指v2。 它增加了
BLX和BKPT,分别协助在ARM和Thumb模式之间的切换;并促进调试。
- 5级流水线,类似于StrongARM和ARM8系列。
- 12 KB L1缓存:核心现在具有缓存(原本在ARM7TDMI中缺少),与基于哈佛结构的StrongARM类似,8 KB用于指令,4 KB用于数据。
- 缓存采用写缓冲机制,其中RAM异步更新,因此CPU可以处理其他任务。
- 48 KB的紧耦合内存或"TCM":类似于Scratchpad内存。 不过,这个系统区分了指令(32 KB)和数据(16 KB)。
- 一个集成的CP15协处理器。 它充当内存保护单元 (MPU),规定了哪些内存范围可以被访问、缓存和/或写入。
任天堂在ARM9周围还添加了以下组件:
- 一个除法器和平方根单元,以加速这些类型的操作,因为ARM9本身不能执行这种类型的算术。
- 一个直接内存访问控制器(Direct Memory Access Controller, DMAC):独立于CPU加速内存传输。 结合使用高速缓存,CPU和DMA有并发运行的潜力。
- 缓存和DMA可以提供很多性能,但也会造成新的问题,如数据完整性和一致性。 因此,开发者需要通过刷新写缓冲区来手动维护内存一致性,然后再触发DMA操作。
就NDS这硬件,也许不难发现孩子们喜欢这款游戏机的真正原因?
互连
到目前为止,我已经介绍了这两个CPU如何单独工作。 但是,作为一个整体运行,它们需要不断地合作。 为了实现这一点,两个CPU直接使用专用的FIFO单元进行"对话",该数据块包含两个64字节队列(最多16个元素),用于双向通信。
具体工作方式如下:发送方 CPU(发送消息的 CPU)将一个 32 位数据块放入队列中,接收方 CPU 可以从队列中拉取该块并对其执行所需的操作。
每当队列上写入一个值,它可以被任一CPU主动获取(轮询),但这需要不间断地检查新消息(开销会很大)。 或者,也可以激活一个中断单元,以便在队列中有新消息时通知接收方。
主存储器
就像GBA一样,NDS的RAM也被分散在许多不同的位置,以便根据访问速率来安排数据远近。 总之,可用通用内存如下:
- 32位总线的32 KB WRAM(Work RAM):用于存储在ARM7和ARM9之间共享的快速数据。
- 请记住,同一地址一次只能由一个CPU访问。
- 32位总线的64 KB WRAM:同样用于快速数据,但只能从ARM7访问,就像GBA一样。
- 16位总线的4 MB PSRAM:速度较慢,可以由任一CPU访问,由内存接口单元控制。
- 伪静态随机存取存储器(Pseudo SRAM, PSRAM)是DRAM的一种变种,与DRAM相比,PSRAM芯片自己就能执行刷新操作。 因此,它的行为类似于SRAM(DRAM的一种替代品,更快但更昂贵)。 这种设计让我想起了1T-SRAM。
向后兼容性
尽管架构与前代有很大不同,但NDS仍成功地保留了关键部分,从而原生支持GameBoy Advance (GBA)游戏。
但是,为了将NDS转为"内部"GBA,前者包括一组软件例程(software routines),可以将游戏机设置为AGB兼容模式(AGB Compatibility Mode)。 此过程中,实际上会终止ARM9,禁用大部分"特殊"硬件,重定向总线,将ARM7置于控制位置,并将其频率降至16.78 MHz。 最后,ARM7开始引导初始的AGB BIOS,该BIOS引导GamePak卡带(就像本来的GBA一样)。 这种模式仍然展示出一些GBA所没有的特征,例如游戏显示时有黑边框(在下一节中我们将看到新屏幕分辨率恰好更大)。 此外,由于NDS有两个屏幕,所以用户可以设置用哪个屏幕显示GBA游戏。
一旦进入GBA模式,就没有退路了,必须重置游戏机才能重新激活其余硬件。
性能阉割
单个廉价芯片中安装了这么多复杂组件,强制他们协作导致出了一些问题,这并不是什么神秘的事情。
让我们从 ARM9 开始。该 CPU 的运行速度是 ARM7 的两倍,但大部分(甚至是全部)的 I/O 都依赖于 ARM7。 因此,ARM9容易出现过多的停滞,直到ARM7回复。 不仅如此,ARM9的外部总线速度只有一半,因此存在一些瓶颈问题。
此外,主存储器总线只有16位。 无论哪个CPU需要从存储器中提取一个字(32位宽),接口都会阻塞CPU,然后占用高达3个"等待"周期,直到拼成一个完整的字。 内存访问不连续时影响最严重,每次内存访问都会阻塞。 这个问题在指令获取时也会出现。不幸的是,当时的ARM不支持顺序操作码获取(sequential opcode fetching),这也影响到了Thumb指令(因为每次获取16位数据都要以32位的块为单位进行)。 另一方面,这个一些资料所谓的"penalty",可以充分利用缓存和TCM来缓解。
总的来说,这意味着在最坏的情况下,这款ARM9"猛烈"的66 MHz的处理能力实际上会被降低到只有约8 MHz, 如果程序的缓存和TCM的利用率极低的话。
如果需要详细报告,我建议查看Martin Korth的文档,尤其是"DS Memory Timings"一节。




