Note
上一章讲的是”几片 74 系列搭逻辑”,本章回答更进一步的问题:当电路需要成百上千个门时,系统该怎么实现?两条主线——可编程逻辑器件(PLD)与微机系统,外加存储器和 I/O 组织方式。学完本章,你就掌握了从”门级拼接”到”芯片级编程”的完整设计选项清单。
26.1 引言:集成度的演进
1965 年,Gordon Moore 观察到单芯片可容纳的晶体管数呈指数增长,并预测这一趋势会延续——这就是著名的摩尔定律(Moore’s law):可集成的晶体管数大约每两年翻一番。几十年来这一预测惊人地准确,Intel 各代处理器的晶体管数就是最好的注脚。

现代工艺可以在单芯片上集成数百万个门,但把门数无脑堆进封装并不划算——引脚数是硬约束:一个含 1000 个独立门的电路若把每个内部节点都引出,需要数千根引脚,板面与外部互连都吃不消。正确做法是把门和它们的互连一起做进芯片,只把电路的输入输出引到外面。这样大部分互连在芯片内部,寄生电容小、速度快;代价是器件变成了专用功能件。
复杂 IC 量产便宜、设计昂贵,所以专用设计只适合百万级产量。对中小产量,出路是做标准化、可定制(编程)的通用器件。本章介绍两大类:阵列逻辑(array logic)与微处理器,然后是面向工业的封装形式 PLC,最后讨论如何选择实现技术。
26.2 阵列逻辑与可编程逻辑器件
26.2.0 为什么需要 PLD:粘合逻辑
微处理器、存储器等复杂器件用量大、可标准化,但很多系统还需要一些专属逻辑把主要部件”粘”在一起——俗称粘合逻辑(glue logic)。同一款处理器可能用于上千种设计,而每个设计的粘合逻辑各不相同,故又称随机逻辑(random logic,指功能选择随机,不是说电路不讲因果)。一台桌面电脑的核心可能只要几片 VLSI,但若用简单门电路实现粘合逻辑,可能要多加 100 多片芯片。
**可编程逻辑器件(programmable logic device, PLD)**就是解药:单个封装内含大量门,但由用户决定它们如何互连。因为出厂时门未绑定任何功能,这种技术也叫未提交逻辑(uncommitted logic);由于门和互连排布在一个或多个”阵列”里,也叫阵列逻辑。常见名词:PLA、PAL、GAL、EPLD、PEEL、PROM、CPLD、FPGA——下面逐一拆解。
26.2.1 可编程逻辑阵列(PLA)
任何组合逻辑都可以写成最小项(minterm)之和。例如四输入 A、B、C、D,三输出 X、Y、Z 的系统:

PLA 的结构正是为这种表达式量身定做的:输入先被反相,得到互补信号对;这些信号经过**熔丝阵列(fusible links)**连到一组与门——熔丝出厂时全通,按需烧断,让每个与门检测一个最小项;再经第二个熔丝阵列把与门输出组合到或门上,产生各输出函数。

为画清楚庞大的阵列,采用紧凑符号:一条线代表门的全部输入,用”ד标记实际连接点;输出互补信号且延迟相等的缓冲器也有专门符号(普通反相器的延迟会造成互补信号错位)。编程由 PLD 编程器完成:读取用户提供的熔丝图(fuse map,通常由软件从功能描述自动生成)并选择性烧断熔丝。有个巧妙细节:若某个与门的熔丝全部保留,其输出恒为低(互补信号不可能同时为高),所以没用的与门直接不编程即可;若熔丝全烧断,输出恒为高。
PLA 的特点:两个阵列(与阵列、或阵列)都可编程,灵活性最大、乘积项利用率最高;但结构复杂、速度相对慢。
26.2.2 可编程阵列逻辑(PAL)

PAL 由 Monolithic Memories 公司推出,把 PLA 的或阵列换成固定连接,只保留与阵列可编程。用户靠”把哪些最小项喂给哪个或门”来构造函数;厂商则提供或门数量、或门输入数各异的多种型号来弥补。或阵列固定后,PAL 的画法通常省略或阵列、输入放左边输出放右边。
为了增加灵活性,很多 PAL 的引脚可以做输入/输出复用:或门输出经三态反相器接到引脚,输出使能信号由与阵列产生(熔丝全烧断则使能恒高,该脚为输出;全保留则恒低,该脚变输入;也可以配置成由输入信号控制使能)。有的 PAL 输出级还有异或门:一个输入经熔丝接地,熔丝保留=同相缓冲,烧断=反相——每个输出可独立配置极性。
典型器件:16L8——20 脚,10 个专用输入、2 个专用输出、6 个可输入/输出脚,最多 16 入 8 出(不能同时),每个输出对应一个 7 输入或门(7 个乘积项)。16R8 则把组合输出换成带反馈的寄存器输出:乘积项存入 D 触发器,时钟上升沿打拍输出,并反馈回输入阵列——有了”记忆”,就能实现计数器、移位寄存器、状态机等时序电路。22V10 用输出**宏单元(macrocell)**统一了组合/寄存器输出,还能选择性反相和输出使能,10 个或门各 8–16 输入。
PAL 命名规则:数字部分 = 阵列输入数,字母 = 输出类型(L 组合、R 寄存、V 多样),数字 = 输出数。PAL 的诱人之处是传播延迟可预测(现代高速件仅几 ns),时钟可超 100 MHz。
26.2.3 GAL 与 EPLD
PAL 是熔丝结构,只能编程一次(OTP,one-time programmable)。Lattice 公司的 **GAL(generic array logic)**引脚兼容 PAL,用 EEPROM 技术代替熔丝,可以反复擦写。EPLD(Altera 首创)用 EPROM 技术,紫外光擦除后可重编程,功能比 PAL 丰富但稍慢(10–20 ns)。PEEL 基于 CMOS EEPROM,是 PAL/GAL/EPLD 的低功耗直接替代品(如 18CV8 可模拟 16L8/16R8)。
26.2.5 PROM:从 PLA 的另一个简化方向
PAL 固定了或阵列;另一个思路是固定与阵列——为输入变量的每种组合准备一个乘积项(8 输入就要 2⁸=256 项),与阵列退化成全译码器,或阵列用来决定每种输入组合下哪些输出为高。这就是 PROM。作为逻辑实现它效率低(全译码浪费),但天生适合存数据:输入组合=地址,或阵列内容=存储的数据——它就是第 26.3.6 节要讲的 ROM 的前身。
26.2.6 复杂可编程逻辑器件(CPLD)
PLA/PAL/GAL/EPLD/PEEL 统称简单 PLD(SPLD)。直接扩大 SPLD 的阵列很快就不现实,更好的做法是把多个 SPLD 放进一个芯片,再用可编程互连网络连起来——这就是 CPLD。多由 EPROM/EEPROM 实现,可重复编程;数千门规模、延迟几 ns;与 SPLD 一样(不同于 FPGA),设计时就能预测传播延迟。一片 CPLD 可以集成过去要用几片 PAL 才能实现的寄存器、译码器、多路选择器和计数器的混合体,例如单器件实现完整 32 位计数器。
26.2.7 现场可编程门阵列(FPGA)
FPGA 是二维的逻辑单元阵列:单元之间纵横分布着可编程开关连接的通道。典型单元含一个寄存器、几个多路选择器和一个查找表(look-up table)——小型可编程存储器,以单元输入作地址,像 PROM 一样可实现任意逻辑函数。高端器件还有硬件乘法器、存储器块、锁相环等专用功能。
FPGA 的可编程开关两种实现:反熔丝(antifuse)——出厂开路(与普通熔丝相反),编程时用大电流击穿使其永久导通,故为 OTP;SRAM 方式——用 MOSFET 作开关、存储单元控制通断,可无限次重编程,但配置信息易失(掉电丢失),上电时须从 ROM 或磁盘加载配置。SRAM 方式灵活,缺点只是上电配置这点小麻烦。
FPGA 规模可达数十万乃至数百万门,是最大 CPLD 的约 10 倍,特别适合需要片上存储或分布式架构的系统。但速度一般不及 PAL/CPLD,且延迟取决于信号在芯片内的布线路径,设计完成前很难预测性能——这与 PAL/CPLD 的”延迟完全可预测”形成鲜明对比。
超大产量时可以考虑掩膜编程门阵列(MPGA):结构与 FPGA 类似,但在制造阶段用光刻掩膜直接连线,密度更高、速度更快、单价更低;缺点是掩膜极其昂贵,只适合几万片以上的产量。
26.2.8 阵列逻辑的编程工具
配置 PLD 需要 CAD 工具流程:设计输入 → 功能仿真 → 优化 → 适配(fitting)→ 时序仿真 → 生成配置文件 → 编程/下载。设计输入最常用硬件描述语言(HDL)——简单 PLD 用 ABEL、CUPL、PALASM、AHDL 这类语言(用布尔方程、真值表、IF–THEN–ELSE 描述硬件功能),CPLD/FPGA 则用 VHDL/Verilog。也可以用原理图捕获(schematics capture)或从时序波形综合。功能仿真只验证逻辑正确性;适配到具体器件后还要做时序仿真。编程完成后读出校验,再烧一个安全位禁止读取配置——保护开发投入不被抄袭。FPGA 的适配(布线)远比 SPLD 复杂,工具复杂度和成本高约 100 倍。
26.2.9–26.2.10 定制 IC 与实现方式的选择
超大产量可做全定制 IC(架构精确匹配功能,效率最高,开发费天价);中等产量用半定制/专用集成电路(ASIC)——用标准单元(寄存器、计数器、I/O、存储器模块)拼装,比全定制便宜但效率也低些。
按复杂度和产量选型的大致路线图:
- 几个门:标准 CMOS 门电路;
- 约十到百个门:SPLD(PAL/GAL/EPLD/PEEL,看是否需要重编程);
- 更复杂:CPLD(线性结构合适)或 FPGA(单元结构合适,容量约 10 倍于 CPLD);
- 超大产量:MPGA/ASIC/全定制(单价低、开发/工具费高)。
Success
选型口诀:量小用 PLD,量大做定制;结构线性选 CPLD,规模优先选 FPGA;延迟要可预测就别用 FPGA。
26.3 微型计算机系统
阵列逻辑靠”改硬件配置”适配应用;微处理器靠”执行指令序列”适配应用——同样是 programmable,含义不同:前者改变器件内部结构,后者改变指令清单。物理部件叫硬件(hardware),控制它的程序叫软件(software)。
26.3.1 微机系统的组成
准确地说,干活的是微型计算机而非微处理器——微处理器只是计算机的一个部件。计算机的基本构件:

- 中央处理器(CPU):读取并执行程序指令,内含算术逻辑单元(ALU);
- 存储器:存放程序(指令序列)与数据;
- 输入/输出(I/O):与外界通信(桌面电脑是键盘/显示器/打印机,洗衣机里是水温/电机转速)。
处理器+存储器+I/O 集成进单芯片的器件叫单芯片微型计算机(不是”微处理器”!),适合存储需求不高的控制与仪器应用。藏在设备里默默干活的计算机统称嵌入式系统(embedded system),专为嵌入式设计的微机常称微控制器(microcontroller)。
字长(wordlength):机器一次处理/存储的位数,决定机器一次搬运多少数据(不限制计算精度,短字长机器多用几条指令即可)。8 位一组叫字节(byte),4 位叫半字节(nibble);8 位机的字长恰好等于一个字节纯属巧合。
总线结构:计算机各部分之间靠三组并行数据高速公路通信。

- 数据总线:线数 = 字长,8 位机的数据总线宽 8 位;
- 地址总线:线数决定寻址范围——16 位地址总线可寻址 2¹⁶ = 65,536 个单元,32 位则超过 40 亿;
- 控制总线:同步各部件操作的信号。
例如要把一个数据字存进存储器:数据放数据总线、地址放地址总线、同步信号放控制总线,三者齐发。
寄存器与总线:寄存器是计算机的基本构件。用带三态输出的 D 触发器可构成直接挂在总线上的存储寄存器——一个控制输入负责把总线数据写入(时钟),另一个负责使能输出驱动总线(三态控制)。读(reading)= 从寄存器取数上总线,写(writing)= 把总线数据存入寄存器。关键性质:读是非破坏性的——使能输出不改变寄存器内容,同一个数可以反复读;只有写新数据才会改变内容。同一总线上任一时刻只能传一个字,所以这是顺序通信系统。
架构之争:程序与数据共用一块存储器、共用一组总线的叫冯·诺依曼架构(Von Neumann architecture)——灵活、硬件简单,但取指和取数挤同一总线,容易拥塞限速;程序与数据分储、总线分开的叫哈佛架构(Harvard architecture)——指令与数据可同时获取、速度快,但结构更复杂。
26.3.2 数据与程序的存储
数值:单字节可存 0–255;16 位两字节存 0–65,535;32 位存 0–4,294,967,295;更大数字用更多单元即可。例:宇宙中约 10⁷⁵ 个原子,用二进制存需要 250 位(2²⁵⁰≈1.8×10⁷⁵),通常取整字节——32 字节(256 位,量程约 10⁷⁷)。
负数:两种表示法。原码(sign–magnitude):最高位作符号位(0 正 1 负),其余位表数值——简单但有 +0/−0 两个零的毛病。主流是补码(two’s complement):从正数一直往下数过零,全 1 就是 −1,全 0 后是 −2……求负数的补码可用 减其绝对值:
白话:n 位补码中,负数 = 用 2ⁿ 减去它的绝对值。最高位仍是符号位:8 位有符号数范围 −128~+127(无符号是 0~255);16 位有符号是 −32,768~+32,767。只表示大小的叫无符号数(unsigned),带极性的叫有符号数(signed)。
浮点数:若干字节打包,一部分表示带符号的尾数(mantissa)、其余表示带符号的指数(exponent)。典型 4 字节(32 位)格式精度约七八位十进制,量程 10⁻³⁸–10⁺³⁸。
文本:每字符一个代码(如 ASCII),通常一个存储单元一个字符;大字符集(多语言、图形符号)可能一个字符要多个字节。
程序存储:程序是指令清单。每种处理器有自己的指令集(instruction set),为一个机器写的程序一般不能在另一种机器上运行。8 位机中一条指令的操作由单字节**操作码(opcode)**定义(故指令集至多 256 条);部分指令还需要附加信息——操作数(operand),可以是数据或地址。因此指令长度有 1 字节(纯操作码)、2 字节、3 字节(操作码+2 字节地址)之分。注意各机器存 16 位地址时高低字节的先后顺序不同(俗称字节序,原文叫 byte sexing),分析程序存储时必须弄清。
CISC 与 RISC:复杂指令集计算机(CISC)用复杂指令缩短程序、减少取指次数,但执行复杂指令的硬件庞大、速度受限;精简指令集计算机(RISC)指令少而简单,架构简洁、跑得飞快——高性能处理器多走 RISC 路线。
26.3.3 处理器的内部构造
处理器 = 一组寄存器 + 算术逻辑运算电路 + 指令译码执行电路 + 对外的总线缓冲 + 内部互连总线。其结构称为架构(architecture)。主要部件:
- 累加器(accumulator):通用工作寄存器,大多数操作围绕它进行;
- 变址寄存器(index register):存地址,可自动加 1/减 1,便于顺序访问一片地址;8 位机多用 16 位;
- 程序计数器(program counter):存放下一条程序字节的地址,每取一字节自动加 1;
- 指令寄存器(instruction register):暂存当前操作码,交给译码与控制单元产生控制信号序列;
- 算术逻辑单元(ALU):执行加/减/加一/减一、按位与/或/异或、移位与循环移位(循环=掉出末端的位从另一端补回)等运算;简单 8 位 ALU 不能直接乘除,要用加减+移位指令序列实现;
- 处理器状态寄存器(flags register):各”标志位”反映 ALU 运算结果与机器状态——Z(结果为零)、N(结果为负)、C(进位)、V(溢出进入符号位)。配合条件指令,程序员可以让程序按运算结果走不同分支;
- 指令译码与控制单元:处理器的”心脏”。程序执行 = **取指周期(fetch cycle)与执行周期(execute cycle)**的无限循环:取指周期固定不变(PC→地址缓冲→发读命令→数据入指令寄存器),执行周期则由操作码经译码网络选择不同的控制信号序列。时钟由晶振产生,一切按节拍进行;
- 堆栈指针(stack pointer):指向存储器中”栈”的位置。push 把数据存入 SP 指向的单元并使 SP 加 1;pull(pop)先使 SP 减 1 再取出数据。多次压栈再弹出,数据按相反顺序出来——先进后出(FILO)。这个机制是子程序嵌套和中断处理的基石(后面会看到);
- 地址/数据总线缓冲:芯片内信号功率极低,对外驱动需要缓冲器增强、改善噪声性能。
26.3.4 与外部部件的通信
对外部器件(存储器或 I/O)而言,处理器看它们都是”有地址的寄存器”:发数据 = 地址上地址总线、数据上数据总线、同步信号上控制总线;收数据 = 发地址和命令,等器件把数据放上数据总线。
总线复用(bus multiplexing):为省引脚,很多处理器让 8 根线分时兼作数据总线和低位地址总线(记作 AD₀–AD₇)。用两个控制信号——地址选通(address strobe,又称 ALE,address latch enable)和数据选通——的下降沿标记总线上信息稳定可读的时刻。外部用 8 位**地址锁存器(address latch)**在 ALE 下降沿把低位地址锁存,配合全程有效的高位地址拼出完整 16 位地址。读时序图要认识图 26.28 的符号约定。
26.3.5 存储器的组织
芯片内有成千上万个存储寄存器,不可能每个都引一根写使能/输出使能线——由少量控制线加内部地址译码选择单元。n 根地址线可寻址 2ⁿ 个单元,所以存储器容量都是 2 的幂:1 kbyte = 1024 字节(2¹⁰,10 根地址线)、1 Mbyte = 2²⁰ 字节、1 Gbyte = 2³⁰ 字节。小心单位陷阱:器件容量常按 kbit/Mbit 标注(器件未必组织成 8 位宽),“1 M 内存”是 1 Mbit 还是 1 Mbyte 差别巨大。

典型器件有三根控制线:输出使能 、写使能 (都是低有效)和片使能(chip enable)—— 无效时器件对其他控制信号一概不理。多片存储器共存时, 承担**片选(chip select)**角色。

做法:四片 16 kbyte 器件的 14 根地址线(2¹⁴=16384)接地址总线低 14 位(A₀–A₁₃),最高两位 A₁₄、A₁₅ 接”2–4 译码器”,四根输出各接一片的片选。两位最高位有 4 种组合,恰好每次选中一片;单元地址由其余 14 位决定。整个地址空间被自动划分成四块——这张分区图叫**存储器映射(memory map)**或地址映射,工程上常用十六进制表示(与二进制互转方便)。
26.3.6 存储器类型
半导体主存分 RAM 与 ROM 两大类。
RAM(随机存取存储器):可快速读也可写。“随机存取”指任意单元的访问时间相同(区别于磁带——读带尾比带头慢得多),其实微机里大多数存储器都是随机存取的,这个名字纯属历史遗留,更准确应叫读/写存储器。两种电路实现:
- 静态 RAM(SRAM):双稳态存储,只要不断电信息无限保持;
- 动态 RAM(DRAM):靠电容充放电存储,每位元件更少、集成度更高,但电荷会泄漏,必须定期刷新(refresh)。
RAM 是易失的(volatile)——断电丢内容。嵌入式系统的控制程序必须上电即在,所以程序存 ROM。
ROM(只读存储器):非易失,适合存程序和不变数据。家族成员:
| 类型 | 全称 | 特点 |
|---|---|---|
| ROM | 掩膜只读存储器 | 厂商光刻编程,单价低、掩膜费高,适合量产 |
| PROM | 可编程 ROM | 熔丝型,用户编程一次,不可改 |
| EPROM | 紫外可擦除 PROM | 石英窗口,UV 照 20–30 分钟擦除,编程器写入 |
| EEPROM | 电可擦除 PROM | 在线电改写,无需取下芯片 |
| FLASH | 闪存 | 电擦写且快,大器件几秒即可重编程 |
EEPROM 能写能读,为何不算非易失 RAM?因为 RAM 读写都在微秒以下,而 EEPROM 读快写慢(写一字节可能要几毫秒)——是”读快写慢”器件,归 ROM 更贴切。FLASH 正是为解决 EEPROM 编程慢而生。
Warning
三个易混点:① 单芯片含 CPU+存储器+I/O 的叫”单芯片微机”或”微控制器”,不能叫”微处理器”(那只是 CPU);② RAM 的”随机存取”不是它的独有属性,它真正的特征是可读写且快,名字是历史遗产;③ 字长 ≠ 计算精度上限,短字长只是要多做几次运算。
存储器标准:JEDEC 标准规定了字节宽度存储器的统一引脚排列,使得同一插座可插 RAM/ROM/EPROM/EEPROM/FLASH、任意容量,给产品留下扩展余地。
26.3.7 输入/输出
原始传感器信号往往与计算机不兼容(模拟量、幅度不对等),需要信号调理(signal conditioning)——放大、滤波、隔离、模数/数模转换——把输入变成干净的数字信号;输出侧同理,把计算机的信号变成驱动执行器所需的电压/电流波形。
I/O 组织方式:
- 存储器映射 I/O(memory-mapped I/O):让外部器件”看起来像存储单元”,占用存储器映射的一部分。优点:指令集中所有指令都能操作 I/O 寄存器,简单通用。缺点:要全地址译码产生片选,指令较长(计算机大部分时间在取指而非执行,指令短程序就快)。
- 独立 I/O 地址空间:部分处理器提供专用 I/O 指令,通常 256 入 256 出(地址一字节搞定),只需译码低位地址。缺点是地址少、可用指令少。多数带独立 I/O 空间的处理器同时支持存储器映射 I/O。
- I/O 寄存器/端口:I/O 最常见的形式——对处理器像普通寄存器,但连着外部引线。写输出寄存器,‘1’/‘0’ 模式就出现在输出线上;读输入寄存器,返回的就是输入线上的电平。双向寄存器称并行 I/O 端口(port,“门户”)。
串行通信:远距离传输用串行省线,但移位寄存器方案需要单独的时钟通道,多数串行系统用以下两种同步方式:
- 异步通信:每字节附加冗余信息——恒为 0 的起始位、恒为 1 的一个或多个停止位,可加奇偶校验位。
线路空闲时为逻辑 1,收到 1→0 的跳变(起始位)接收机就同步自己的本地时钟,再按间隔采样各数据位。两个晶振足够精确,单个字内相位漂移可忽略;停止位的恒 1 特性用于自检——若收发时钟失配,会把后续位错采为停止位,接收机报帧错误(framing error);校验出错则报奇偶错误。收发双方必须约定相同的字长和速率。广泛用于键盘等数据流不规律的应用。 - 同步通信:数据连续成流时,接收机用时钟恢复电路从信号跳变中重建发送时钟,数据直接打入移位寄存器;每块数据前发送唯一同步模式标记块起点,靠计数跟踪字边界。校验按整块进行——校验和(checksum)或循环冗余码(CRC)。
速率与方向:线路上每秒的(状态)变化数叫波特率(baud rate)。单向链路叫单工(simplex);双向叫双工(duplex),又分同一时刻只能一方向的半双工(half-duplex)与可同时双向的全双工(full-duplex)。常用串行器件:UART、ACIA、SIO、USART——都是全双工收发器。逻辑电平不宜远传,需配线驱动器/线接收器,并有多种串行通信标准保证兼容。
程序控制 I/O 与轮询:程序员在程序中定点读写外设称为程序控制 I/O。但像键盘这样”数据何时来不可预知”的设备,需要轮询(polling):给设备配一个状态寄存器,其中的**数据就绪位(data ready flag)**由设备置位、处理器取走数据后清除。轮询有两种姿势:忙等(反复读状态位直到就绪,期间啥也不干)或在主循环的合适位置顺便测一下(数据没来就继续干别的)。嵌入式控制程序通常是”初始化 + 永久主循环”结构,正是后一种的用武之地。但设备一多,挨个轮询浪费大量处理器时间。

中断(interrupt):让外设主动报告”需要服务”——处理器硬件上有一条中断请求线(IRQ),外设激活它,处理器就暂停当前程序跳去执行中断服务程序(interrupt service routine, ISR)。

关键细节:处理器总是先执行完当前指令再响应中断(否则机器状态不确定);进入 ISR 前把各寄存器内容(含程序计数器)保存,ISR 结尾遇到中断返回指令(RTI)时恢复寄存器、跳回主程序断点继续。ISR 存放地址由中断向量(interrupt vector)指定——向量就是地址;类似的还有复位向量(reset vector),规定上电或复位后从哪里开始执行。向量通常存放在存储器映射的固定位置,程序员把主程序和 ISR 的起始地址填进去。中断可分:可屏蔽中断(maskable,可用指令开关)、非屏蔽中断(NMI,永远有效)、软件中断(由专用指令触发,处理机制同硬件中断)。嵌入式系统复位向量直指应用程序,上电自动开跑——称旋钥系统(turnkey system)。
中断与堆栈:中断嵌套时(第一个 ISR 执行中又来第二个中断),若用固定单元保存寄存器会互相覆盖。用堆栈就完美解决:FILO 结构保证各级现场按逆序恢复,层层正确返回。
Success
堆栈三用途:子程序返回地址、中断现场保护、多级嵌套的逆序恢复——全靠 FILO。理解了 push/pop 的逆序本质,这三件事就是同一个故事。
DMA(直接存储器访问):中断驱动 I/O 每次服务都要保存/恢复现场,大量数据传输时太浪费。DMA 让专用控制器绕过处理器直接在设备与存储器间搬运数据,处理器只让出总线几个周期——称”周期窃取(cycle stealing)“。这是最快的 I/O 方式,但需要大量额外硬件,通常只给磁盘驱动这类大流量应用。
Success
I/O 三板斧排序:程序控制最简单,能用就用;中断响应快但不省心(硬件复杂、异步难调试);DMA 最快最贵,专供大数据量。
26.3.8 单芯片微机与 PLC
单芯片微机把三大件集成一片,计算机从”系统”变成”元件”。早期器件只有 2 kbyte ROM、64 字节 RAM、32 条并行 I/O、一个 8 位计数器——存储太小甚至逼人写汇编。现代器件 ROM/RAM/EEPROM 俱全,I/O 丰富(多计数器、多中断、串行通道),16/32 位品种还有存储器管理与 DMA。有趣的是:市场主力仍是简单 8 位机——用量最大的嵌入式场景(汽车、家电)根本用不了那么多算力。
PIC 微控制器:Microchip 公司的 PIC 系列用双总线哈佛架构 + RISC,从 6 脚几百字节的小件(PIC10F200:256 字 ×12 位 flash 程序存储、16 字节 RAM、3 条 I/O)到 80 脚 128 kbyte 的大件(PIC18F87J10:9 个并行口多达 67 条 I/O、5 个定时器、2 个 PWM、2 路串口、15 通道 10 位 ADC),片上外设覆盖定时/看门狗、显示驱动、RS232/SPI/I²C/CAN/USB 通信和模拟接口。
可编程逻辑控制器(PLC):面向工业控制的一体化微机——处理器、电源、接口电路装进坚固机箱,配标准化输入/输出模块,无需任何电子设计即可使用,支持多种图形/文本语言编程。它诞生于 20 世纪 70 年代,本是继电器控制系统的替代者,为了照顾继电器工程师的习惯,编程界面沿用了梯形图(ladder diagram / ladder logic)。PLC 以可靠性见长,现成硬件加现成接口软件大幅缩短开发周期,特别适合小批量工业控制。
26.4 实现方式的总结
数字系统怎么实现?答案几乎总由功能复杂度决定:几个门用标准 CMOS 门电路;再多就该上阵列逻辑;更复杂的系统要在 CPLD、FPGA 与微机之间权衡——可编程与不可编程路线的深入比较留到第 28 章。
Warning
两条”programmable”不要混为一谈:PLD/FPGA 的编程是改硬件配置(烧熔丝/写配置位),微机的编程是给指令清单(软件)。架构层面:冯·诺依曼共享总线易拥塞,哈佛双总线快但复杂——PIC 用哈佛+RISC 正是为嵌入式效率做的组合。
自测五题(点击展开)
- PLA 与 PAL 的本质区别是什么?各自的优缺点? PLA 两个阵列(与、或)都可编程,灵活性最大、乘积项利用率最高,但结构复杂、速度慢;PAL 固定或阵列、只编程与阵列,结构简单速度快,靠提供不同或门数量/输入数的型号来弥补灵活性损失。
- FPGA 的 SRAM 编程方式有什么优缺点? 优点:MOSFET 开关+存储单元控制通断,可无限次重编程。缺点:配置信息易失,掉电丢失,上电时必须从非易失存储器(ROM/磁盘)加载配置。相比之下反熔丝是 OTP——一次性击穿导通、不可逆。
- 为什么 EEPROM 不算非易失 RAM?FLASH 解决了什么问题? EEPROM 读快写慢(写一字节可能需几毫秒),而 RAM 读写都在微秒以下,故 EEPROM 归为 ROM 类。FLASH 提供电擦写且速度大幅提升,最大器件几秒即可完成重编程,克服了 EEPROM 编程慢的问题。
- 为什么中断处理要保存寄存器?为什么要用堆栈而不是固定单元? ISR 几乎必然改写处理器寄存器,不保存现场主程序无法正确继续;保存的内容含程序计数器(断点地址),RTI 时恢复。固定单元在中断嵌套时会被第二次中断的现场覆盖,导致无法返回主程序;堆栈的 FILO 特性保证各级现场按逆序依次恢复。
- 程序控制 I/O、中断驱动 I/O 与 DMA 各适合什么场合? 程序控制(含轮询)最简单,默认首选——如洗衣机读按键;中断驱动适合事件到达时间不可预知、且要快速响应的场合——如键盘接口,但硬件较复杂、异步行为难测试;DMA 最快且几乎不占处理器时间,但硬件开销大,适合大流量数据传输——如磁盘驱动器。