« GBA架构 (index)

GBA架构

Chapter 3: 中央处理器 (CPU)


目录

  1. 剑桥奇迹
    1. Acorn电脑的崛起
    2. 新的CPU风险投资
  2. 任天堂的合作伙伴关系
  3. ARM7TDMI
    1. 指挥 CPU
    2. 封装
      1. 核心
      2. 流水线
      3. 挤压性能
      4. 扩展
  4. 内存位置
  5. 成为Game Boy Color

大多数组件被组合成一个名为CPU AGB的单一封装。 该封装包含两个完全不同的CPU:

不过,这两块CPU永远不会同时运行,它们也不是什么协处理器。 搭载这颗极其老旧的夏普芯片的唯一理由只是为了向后兼容

话虽如此,在介绍ARM芯片之前,我还是想先介绍一下该品牌CPU的历史。

剑桥奇迹

有关ARM CPU的起源及其后来声名鹊起的故事引人入胜。 在这里,我们看到了公共投资、指数式增长、错误决策和远距离合作的结合。

Acorn电脑的崛起

Image
BBC Micro的照片,上面有一盒5.25英寸磁盘,第一张磁盘是Elite(1984年发行的游戏)。

70年代末对英国民众来说是一个动荡的年代。 曾经在战后理想下建立起来的干预主义经济已经走到了尽头,钟摆很快摆向了自由市场改革。 在这场风暴中,以剑桥为基地的企业,如Acorn Computers,与Sinclair等公司一起,向实验室和业余爱好者销售计算机套件。 与美国和日本企业类似,Acorn计算机也依赖于6502 CPU和专有的BASIC语言。

进入上世纪80年代,英国新政府的大臣们开始在学校开展计算机扫盲项目。 由于Acorn即将推出"质子"(Proton)家用电脑,该公司获得了制造经济型电脑的合同,以实现政府的愿景。 结果,BBC Micro(昵称 "Beeb")在学校、教师和学生中获得了巨大成功。 在Micro中,Acorn采用了前卫的"Tube"接口,可以通过第二个处理器扩展计算机。 这为Acorn的下一项重大投资铺平了道路。

在开发下一款以企业为重点的产品时,Acorn没有找到合适的CPU来接替6502。 面对日本和美国的竞争,Acorn面临着创新的压力,再加上计划不周,Acorn 的财务状况陷入了困境。 因此,Acorn成立了一个新的部门,负责生产引人注目的CPU。 为了绕过Acorn最近的限制,CPU团队根据一篇名为《精简指令集计算机案例》的研究论文及其原型RISC CPU,建立了自己的架构。 最后,在1985年,Acorn将ARM1 CPU作为BBC Micro的Tube模块交付使用,但仅用于研发目的的市场推广。 直到1987年,随着第一台Acorn Archimedes计算机的推出,ARM芯片(当时为ARM2 CPU)才开始占据核心地位。

新的CPU风险投资

Image
苹果Apple Newton的晚期型号......在我玩过之后。

在Acorn Archimedes的商业化过程中,苹果公司被Acorn的高能效CPU所吸引,但这家美国公司仍然不相信Acorn最新的ARM3会适合苹果公司的新项目Newton。 不过,双方并没有放弃(毕竟Acorn是竞争对手),而是讨论了改进ARM3以满足苹果要求的可能性,即可变时钟频率集成MMU完整的32位寻址

这种合作很快变成了一种伙伴关系,Acorn、苹果和VLSI(ARM芯片制造商)成立了一家新公司,专门致力于开发ARM CPU。 苹果公司提供投资(获得43%的股份),Acorn公司分担员工,VLSI公司负责生产。 1990 年,Advanced RISC Machines(ARM)公司成立,Robin Saxby担任执行董事长。

数年后,苹果终于推出了采用ARM610Newton MessagePad。ARM610是新一代ARM芯片之一,集成了苹果的投入。 与此同时,Acorn也发布了使用新CPU的RiscPC

现在,当Acorn和苹果在电脑/手持设备市场上徘徊不前时,ARM却设计出了一种激进的商业模式。 Saxby的愿景是远离制造业,以CPU设计指令集的形式授权ARM的知识产权。 这使ARM获得了计算机领域以外的客户,如德州仪器,后者后来将公司与新兴的移动市场(最终推出了诺基亚6110)和机顶盒联系起来。 在接下来的几年中,ARM的技术将被捆绑到数十亿台移动设备中。

任天堂的合作伙伴关系

回到日本,通过对Game Boy的分析,我们了解到任天堂的便携式系统硬件战略倾向于采用片上系统(System On a Chip,SoC)模式。 这使该公司能够将负担得起的现成技术模糊化,并与内部开发相结合。 这样,新游戏机就可以独树一帜,具有竞争力。

Image
CPU AGB,内含ARM7TDMI CPU(以及许多其他组件)。

幸运的是,ARM的许可模式正好满足了这些需求。 两家公司从1994年(Virtual Boy推出的前一年)起就开始了谈判,但直到多年后才有了结果。 原因很简单:日本人认为ARM的代码密度和对32条数据线的需求不可行(Virtual Boy的CPU已经成功摆脱了这一点)。 尽管如此,ARM的新CPU设计师Dave Jaggar很快就推出了ARM7TDMI,这款新CPU的重点是在功耗和存储限制条件下最大限度地提高性能。 这对ARM来说是一个转折点,因为这款新产品不仅让任天堂感到高兴,还引起了德州仪器诺基亚和手机领域其他竞争对手的注意。

不出所料,当任天堂开始开发Game Boy Color的后续产品时,他们选择的CPU变成了ARM7TDMI。

ARM7TDMI

现在让我们深入了解一下这款芯片的功能。

指挥 CPU

首先,ARM7TDMI实现了ARMv4指令集,即ARMv3的后续版本。 这意味着:

封装

既然我们已经知道了开发人员如何与芯片对话,那就来看看芯片内部有什么吧。

核心

就电路而言,ARM7TDMI是ARM710的缩小版,但增加了一些有趣的功能。 该核心包括 :

最后,所有这些都可以在3V电源下运行。 这显然是向移动计算迈出的一步,因为早期的内核需要5V电源。

流水线

从第一次迭代开始,ARM就采用了三级流水线来运行代码。 换句话说,指令的执行分为三个步骤或阶段。 CPU能够同时对三条指令进行取指、译码与执行操作。 这样一来,CPU能够最大化地利用自身资源 (缩短闲置时间)、提升吞吐率。

与同时代的两个非常相似处理器一样,ARM CPU也容易受到数据冒险的影响。 不过,程序员和编译器都不会注意到,因为在这种情况下,CPU会在需要时自动停止流水线。

控制冒险也同样存在,但ARM采用了一种名为条件废止(conditional annulment)的有效方法来解决它们: 每当分支指令处于第二阶段(解码)时,CPU 就会计算分支的条件。 根据计算结果,如果必须执行分支指令,CPU将自动取消后续指令(将其变为填充指令)。 现在,与MIPS的方法相比(因为MIPS编译器可以插入有用的指令,而不仅仅是填充指令),这种方法可能显得效率不高。 因此,除了分支外,ARM还提供了条件执行。 后者将这种流水线设计变成了一种优势,因为ARM可以在同一流水线阶段对指令进行解码并计算其嵌入条件。 因此,在这种情况下,无需添加填充指令。 这就是为什么在为ARM CPU编程时,条件执行比分支更受欢迎的原因。

挤压性能

存-取架构的缺点之一是ARM的代码非常稀疏。 x86等竞争对手可以使用更少的代码执行相同的任务,所需的存储空间也更小。 因此,当任天堂看到ARM的最新设计ARM7时,他们并不满意。 ARM指令的大小意味着,假设的由16位总线和有限内存及存储空间组成的小工具——所有这些都是为了节约成本和能源——将使CPU效率低下并陷入瓶颈。 幸运的是,Dave Jaggar刚刚完成了ARM7的设计,他还没有放弃。 在与任天堂会面后的通勤途中,他想到了一个解决方案:Thumb指令集

Thumb是ARM指令集的一个子集,其指令被编码为16位字(而不是32位)。 由于是16位,Thumb指令只需要一半的总线宽度,占用一半的内存。 为实现这一目标,Thumb指令集在以下方面进行了妥协:

总之,由于Thumb指令只提供ARM的一个功能子集,开发人员可能需要编写更多的指令才能达到同样的效果。

实际上,Thumb使用的空间是ARM代码的70%。 对于16位宽内存,Thumb运行速度比ARM快。 如果需要,ARM和Thumb指令可以在同一程序中混合使用(称为互通),这样开发人员就可以选择何时何地使用每种模式。

扩展

ARM7TDMI本质上是一个符合ARMv3标准的附加内核。 后者在其名称(TDMI)中有所提及,意为:

总之,这使ARM7TDMI成为移动和嵌入式设备的一个极具吸引力的解决方案。

内存位置

Thumb的加入尤其对这款游戏机的最终设计产生了很大影响。 任天堂在不同模块之间混合使用16位和32位总线,以降低成本,同时为程序员提供优化代码所需的资源。

Image
该系统的内存架构

Game Boy Advance的可用内存分布在以下位置(从快到慢排列):

虽然这款游戏机被作为32位系统销售,但其大部分内存只能通过16位总线访问,这意味着游戏大多会使用Thumb指令集,以避免每次指令取用花费两个周期。 只有在非常特殊的情况下(即需要使用Thumb中没有的指令,同时将其存储在 IWRAM中),程序员才会ARM指令集中获益。

成为Game Boy Color

除了包含GBC硬件(夏普SM83、原始BIOS、音频和视频模式、兼容卡带插槽等)外,还需要两个额外功能才能实现向后兼容。

在硬件方面,游戏机依靠开关来检测插入的是Game Boy还是Game Boy Color卡带。 卡带插槽中的形状检测器可有效识别卡匣类型,并允许CPU读取其状态。 假设CPU AGB的某个组件读取了该值,并自动关闭GBC模式下不需要的硬件。

从软件方面来看,有一个名为REG_DISPCNT的16位特殊寄存器可以改变显示屏的许多属性,但其中一位会将游戏机设置为"GBC模式"。 起初,我很难理解GBA究竟何时会尝试更新这个寄存器。 幸运的是,一些开发人员帮我澄清了这个问题:

我认为在GBC启动过程中发生的事情是:检查开关(可在REG_WAITCNT 0x4000204读取),进行淡入(淡入速度非常快,很难察觉),然后最终切换到GBC模式(BIOS写入REG_DISPCNT 0x4000000),停止ARM7。

谜题中唯一缺少的部分是,如果移除GBC卡带外壳的一部分,使开关不再按下,然后通过软件模式切换到GBC模式,会发生什么情况。 多重启动模式在这方面会有所帮助。 我不确定GBC卡带总线是否需要按下开关才能正常工作,或者它只是工作而已。 我猜开关是总线工作的必要条件,但这只是猜测。

- Dan Weiss (又名 Dwedit, PocketNES与Goomba Color的维护人员)


Previous: 2. 快速入门

Next: 4. 图形


Rodrigo Copetti © 2026 RSS Feed

切换至现代版

主页 · 文章 · 支持 · 关于作者 · 关于此网站