本章导航
本章回答一个核心问题:如何把布尔逻辑“写入”一块芯片,并在下载前后验证它?学习路线为:SPLD(PAL/GAL)→ CPLD → 宏单元 → FPGA/LUT → 软件设计流程 → JTAG 边界扫描 → 电梯控制器案例。
1. 可编程逻辑器件总览
可编程逻辑器件(PLD)把大量逻辑门、触发器和可编程连线集成在芯片中。设计者不必为每个逻辑函数焊接门电路,而是通过软件决定哪些交叉点导通,再把配置数据下载到芯片。器件规模大致分为:
- SPLD:简单可编程逻辑器件,典型是 PAL 与 GAL。
- CPLD:把多个 SPLD(逻辑阵列块 LAB)放到同一芯片,并用可编程互连连接。
- FPGA:以大量较小的可配置逻辑块(CLB/逻辑模块)和 LUT 为核心,密度远高于 CPLD。
2. SPLD:PAL 与 GAL
2.1 PAL 的 AND-OR 结构
PAL(Programmable Array Logic,可编程阵列逻辑)由可编程 AND 阵列和固定 OR 阵列组成,因此天然适合实现“积之和”(SOP)表达式。输入缓冲器通常同时产生变量和反变量;每一个交叉点的熔丝就是一个可编程单元:保留熔丝表示连接,熔断表示断开。每一行 AND 门产生一个乘积项,多个乘积项再由 OR 门相加。

**例:**若需要 就在三行 AND 阵列分别保留对应变量连接,最后由固定 OR 门相加。PAL 多采用熔丝工艺,通常只能编程一次(OTP)。

2.2 GAL:可重复编程的 PAL
GAL(Generic Array Logic,通用阵列逻辑)保留 PAL 的 AND/OR 思路,但把熔丝换成 EEPROM(E²CMOS)等可重复编程技术。调试时可以反复擦除和下载,适合原型设计;代价是器件内部结构和编程条件更复杂。

2.3 读懂简化阵列图
数据手册常用斜线加数字表示多输入 AND 门,用红色 X 表示交叉点连接。输入三角形表示缓冲器,固定点连接同时提供原变量与反变量。读图时按“每行先 AND、各行再 OR”的顺序即可还原 SOP。

2.4 Worked Example 10-1:把三变量函数写入 PAL
要求实现:
做法是把每个加项对应到一行 AND:第 1 行连接 ;第 2 行连接 ;第 3 行连接 ;第 4 行连接 。未使用的变量交叉点熔断,四行输出接固定 OR 门。

读图技巧
先写出每一行的乘积项,再把所有行用“+”连接;不要把阵列中的空白误认为逻辑 0,空白只表示该变量没有参与该乘积项。
2.5 宏单元
宏单元(macrocell)通常含一个 OR 门和输出逻辑,可配置成组合输出、输入/输出,或带触发器的寄存输出。三态缓冲器可让输出为高、低或高阻态;XOR 可选择输出极性:控制端为 0 时原样输出,为 1 时反相。




3. CPLD:把多个 SPLD 连接起来
CPLD(Complex Programmable Logic Device,复杂可编程逻辑器件)由多个 LAB 和全局可编程互连阵列 PIA 组成。输入可送到任意 LAB,LAB 输出也能经 PIA 连接到其他 LAB。器件通常采用 EEPROM,支持在系统编程(ISP)和 JTAG 接口。

经典 CPLD 的一个 LAB 近似一个 SPLD,包含多个宏单元。宏单元内部有局部 AND 阵列、OR 门、乘积项选择矩阵和输出逻辑。


3.1 共享扩展项与并行扩展项
每个宏单元的 AND 阵列能产生有限数量的乘积项。当一个 SOP 需要更多项时:
- 共享扩展项(shared expander):借用另一个宏单元产生的反相乘积项,再与本宏单元的 AND 项组合。
- 并行扩展项(parallel expander):直接把邻近宏单元未用的乘积项 OR 到本宏单元输出。




3.2 LUT 型 CPLD 与 PLA
有些 CPLD 使用行列式互连和 LUT,而不是经典的 AND/OR 阵列。LUT 本质是可编程存储器,地址由输入变量组成,存储的 1/0 直接决定输出。SRAM 型 LUT 断电后丢失配置,通常由片上非易失存储器或外部主机在上电时重新配置。






PLA 与 PAL 的区别是:PAL 的 AND 阵列可编程、OR 阵列固定;PLA 的 AND 阵列和 OR 阵列都可编程。

| 参数 | 典型范围 |
|---|---|
| 宏单元数 | 10–1700 |
| LAB 数 | 10–221 |
| 最大频率 | 20.4–400 MHz |
| I/O 数 | 10–1156 |
| 电源电压 | 1.8 V、2.5 V、3.3 V、5 V |
4. 宏单元工作模式
典型 CPLD 宏单元包括 XOR、多个多路复用器(MUX)和触发器。XOR 决定 SOP 输出是否反相;MUX 选择全局时钟或乘积项时钟、全局清零或乘积项清零、组合输出或寄存输出。触发器可配置为 D、T 或 J-K 类型。


- 组合模式:旁路触发器,OR/XOR 结果直接送 I/O。
- 寄存模式:组合逻辑结果进入触发器,在时钟边沿采样后输出。


5. FPGA:以 LUT 为核心的高密度器件
FPGA(Field-Programmable Gate Array,现场可编程门阵列)由三部分组成:
- CLB:可配置逻辑块,内部含多个逻辑模块。
- 可编程互连:行列式全局网络连接各 CLB 与 I/O。
- I/O 块:位于芯片边缘,可独立配置为输入、输出或双向。
CLB 较小、数量很多时称细粒度;CLB 较大、功能复杂时称粗粒度。


5.1 LUT 的工作原理
n 个输入的 LUT 具有 个存储单元。每个输入组合对应一个地址;地址单元存 1 时,该最小项参与输出,存 0 时不参与。例如 3 输入 LUT 有 8 个单元,最多表示 8 个三变量乘积项。


5.2 Worked Example 10-2:编程 3 输入 LUT
要实现:
只需找出这五个乘积项对应的地址,并在相应五个存储单元写入 1,其余三个地址写入 0。

逻辑模块通常支持正常模式、扩展 LUT 模式、算术模式和共享算术模式,也可把触发器串接成计数器或移位寄存器。正常模式最多实现 6 变量 SOP;扩展 LUT 模式借助专用 MUX 可扩展到 7 变量。


5.3 Worked Example 10-3:扩展 LUT 输出
图示逻辑模块中,先分别读取两个 LUT 的 6 变量输出,再由第 7 个变量控制 MUX。把所有“对应 LUT 输出为 1 且选择条件满足”的地址写成最小项并相加,即得到最终 SOP:

SRAM 型 FPGA 断电丢失配置,可用片上非易失存储器或外部存储器在上电时加载。FPGA 还可嵌入硬核、软核、存储器和 DSP:硬核由厂商固定实现,速度和面积较优但不能修改;软核由可编程逻辑实现,灵活但占用资源更多。厂商提供的硬核设计属于 IP(知识产权)。




6. 可编程逻辑软件设计流程
设计流程(design flow)是从输入逻辑到目标器件(target device)配置的完整链路:
- 设计输入:原理图或 HDL(VHDL、Verilog)。
- 功能仿真:只验证逻辑关系,施加输入波形或编写 test bench。
- 综合:优化逻辑、删除冗余,生成网表(netlist)。
- 实现:针对具体器件完成映射、布局布线和引脚分配。
- 时序仿真:加入传播延迟,检查工作频率与毛刺。
- 下载:生成 bitstream 并写入器件,最后进行板级测试。

编程至少需要电脑、开发软件、PLD 器件和连接电脑的编程硬件/电缆。









原理图输入适合图形化学习;HDL 输入适合层次化、参数化和大规模工程。复杂系统可拆成多个模块,分别验证后封装成方框符号。




功能仿真可以用波形编辑器直接画 Clk、TL、TS、VS,也可以用 VHDL test bench 自动产生激励。若输出不符合预期,回到设计输入阶段修改。


综合的产物是网表:它列出实例、端口和网络连接。实现阶段把网表映射到具体芯片。时序仿真检查传播延迟造成的窄脉冲毛刺;发现毛刺时应分析逻辑和时序约束,而不是直接下载。






功能仿真不等于时序仿真
功能仿真可不指定目标芯片;时序仿真必须先选定器件,因为软件要使用该器件的门延迟、布线延迟和网表信息。
7. JTAG 边界扫描
IEEE 1149.1 JTAG 边界扫描在芯片内部、逻辑与每个 I/O 引脚之间放置扫描单元,可测试芯片内部逻辑和芯片间连线。必需部件包括边界扫描寄存器、旁路寄存器、指令寄存器和 TAP 控制逻辑;识别寄存器是可选的。
- TDI:串行测试数据输入。
- TDO:串行测试数据输出。
- TMS:选择 TAP 状态。
- TCK:TAP 时钟。
- TRST:可选测试复位输入。

BYPASS 让数据走一位旁路寄存器;EXTEST 测试外部引脚和器件间连线;INTEST 测试内部逻辑;SAMPLE/PRELOAD 采样输入或预置输出;IDCODE 读出器件识别码。

一个 BSC(边界扫描单元)含捕获寄存器、更新寄存器和 MUX,可实现五种数据通路:串行移位;内部逻辑到输出引脚;输入引脚到内部逻辑;串行输入到内部逻辑;串行输入到输出引脚并同时送 TDO。








BSDL(Boundary Scan Description Language)用 VHDL 格式描述器件型号、I/O 引脚、TAP 引脚、扫描结构和测试映射,测试软件据此生成测试向量。
8. 仿真排错与边界扫描测试
仿真中若输出为 U(未定义),常见原因是触发器没有初始值,形成循环依赖。可在源代码设置断点(break point),暂停仿真并观察 D、Q 及相关输入;为寄存器提供明确初始值或复位后,再重新仿真。




INTEST 将测试位串经 TDI 送入内部逻辑输入,再从 TDO 检查输出,适合发现内部逻辑、I/O 单元和扫描单元故障。EXTEST 通过实际引脚施加和采集数据,主要检查引脚及器件间连线;若 EXTEST 失败,再运行 INTEST 可定位故障是否在芯片内部。



9. 应用案例:电梯控制器 PLD 实现
电梯控制器可拆成楼层计数器、楼层请求/当前位置比较器、代码寄存器、定时器、七段译码器和 CALL/REQ 触发器。VHDL 用 entity/architecture 描述接口与行为,再在顶层 architecture 中实例化各组件并连接信号。



- 楼层计数器在 Sensor 上升沿根据 UP/DOWN 加一或减一。
- 比较器用楼层请求码与当前楼层码的大小关系产生 UP、DOWN、STOP。
- 代码寄存器在时钟上升沿锁存请求码。
- 定时器计数到 SetCount 后产生关门脉冲。
- 七段译码器把三位楼层码转换为 a–g 段信号。
- J-K 触发器保存 CALL/REQ 选择状态。


典型 Quartus/ModelSim 流程是:创建工程 → 定义目标器件与 HDL → 添加源文件 → 编译 → 图形波形仿真 → 引脚分配 → 再编译 → 通过 JTAG 下载 → 板级测试。

10. 本章小结
- PAL:可编程 AND、固定 OR,一次编程;GAL:可重复编程的 PAL。
- 宏单元提供组合、输入/输出和寄存逻辑。
- CPLD 由多个 LAB 和 PIA 组成,可用共享/并行扩展项增加 SOP 容量。
- FPGA 以 LUT、CLB、行列互连和 I/O 块为基本资源,密度高于 CPLD。
- 设计流程依次为设计输入、功能仿真、综合、实现、时序仿真和下载。
- 网表描述实例与网络连接;bitstream 是下载到目标器件的最终配置数据。
- JTAG 边界扫描使用 TDI、TDO、TCK、TMS,通过 BSC 测试内部逻辑和外部连线。
- 断点用于暂停仿真、定位未定义状态;BSDL 描述具体器件的扫描结构。
11. 自测题
- PAL 与 GAL 的阵列结构有何相同点和不同点?
- 为什么 PAL 适合实现 SOP 表达式?一个 4 变量 LUT 有多少个存储单元?
- 共享扩展项与并行扩展项分别如何增加乘积项数量?
- 宏单元的组合模式和寄存模式有何区别?XOR 在其中起什么作用?
- FPGA 的 CLB、逻辑模块、LUT 和全局互连分别承担什么任务?
- 为什么功能仿真在时序仿真之前?网表和 bitstream 各在流程哪一步产生?
- 写出 JTAG 的四个必需信号,并说明 BYPASS、INTEST、EXTEST 的用途。
- 若仿真波形出现 U,如何利用断点定位并修复?
- Worked Example 10-1 中,表达式 需要几行 AND?
- 设计十层电梯时,楼层计数器位宽、比较器输入和七段译码逻辑应如何调整?
学习检查
能够从布尔表达式画出 PAL 阵列、计算 LUT 存储单元数、解释 CPLD/FPGA 结构,并说清“设计输入→仿真→综合→实现→下载”的顺序,就掌握了本章主线。
12. 延伸练习图














自测一下
PAL、GAL、CPLD 和 FPGA 的结构差异是什么?
参考答案:PAL 由可编程 AND 阵列和固定 OR 阵列组成,多采用熔丝工艺、只能编程一次;GAL 保留 AND/OR 结构但用 EEPROM 代替熔丝,可反复擦写。CPLD 把多个 LAB(每个近似一个 SPLD)通过全局可编程互连阵列 PIA 连接起来,支持在系统编程。FPGA 则以大量较小的 CLB 和 LUT 为核心,配合行列式互连和 I/O 块,密度远高于 CPLD。
FPGA 查找表(LUT)如何实现组合逻辑?
参考答案:LUT 本质是一小块可编程存储器:n 个输入的 LUT 有 2^n 个存储单元,输入组合作为地址,单元存 1 表示对应最小项参与输出,存 0 则不参与。例如 3 输入 LUT 有 8 个单元,要实现 5 个乘积项之和,只需在这 5 个乘积项对应的地址写入 1、其余写 0。逻辑模块还支持扩展 LUT 模式,借助专用 MUX 可从 6 变量扩展到 7 变量。
可编程逻辑器件的一般设计流程有哪些步骤?
参考答案:设计流程共六步:设计输入(原理图或 VHDL/Verilog)→ 功能仿真(只验证逻辑关系)→ 综合(优化逻辑并生成网表)→ 实现(映射、布局布线和引脚分配)→ 时序仿真(加入传播延迟,检查工作频率与毛刺)→ 下载(生成 bitstream 写入器件并板级测试)。注意功能仿真可不指定目标芯片,而时序仿真必须先选定器件。
VHDL 中实体与结构体分别描述什么?
参考答案:实体(entity)描述模块对外的接口,即端口名称、方向和位宽,相当于器件的“引脚定义”;结构体(architecture)描述模块内部的行为或结构,相当于“内部电路”。复杂系统可拆成多个组件(component),在顶层结构体中实例化并用信号连接,例如电梯控制器就把楼层计数器、比较器、定时器、七段译码器等分别写成组件再在顶层连接。
JTAG 边界扫描主要用于什么测试?
参考答案:JTAG(IEEE 1149.1)在芯片内部逻辑与每个 I/O 引脚之间放置边界扫描单元(BSC),通过 TDI、TDO、TMS、TCK 四个必需信号串行移入移出测试数据。EXTEST 通过实际引脚测试外部连线和器件间连线;INTEST 把测试位串送入内部逻辑并从 TDO 检查输出,测试芯片内部;BYPASS 可让数据经一位旁路寄存器快速通过。若 EXTEST 失败再运行 INTEST,还能定位故障是否在芯片内部。