本章导航

本章回答一个核心问题:如何把布尔逻辑“写入”一块芯片,并在下载前后验证它?学习路线为: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 门相加。

PAL 的基本 AND/OR 结构

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

PAL 实现 SOP 表达式

2.2 GAL:可重复编程的 PAL

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

GAL 阵列简化图

2.3 读懂简化阵列图

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

PAL/GAL 简化表示法

2.4 Worked Example 10-1:把三变量函数写入 PAL

要求实现:

做法是把每个加项对应到一行 AND:第 1 行连接 ;第 2 行连接 ;第 3 行连接 ;第 4 行连接 。未使用的变量交叉点熔断,四行输出接固定 OR 门。

Worked Example 10-1 的 PAL 编程阵列

读图技巧

先写出每一行的乘积项,再把所有行用“+”连接;不要把阵列中的空白误认为逻辑 0,空白只表示该变量没有参与该乘积项。

2.5 宏单元

宏单元(macrocell)通常含一个 OR 门和输出逻辑,可配置成组合输出、输入/输出,或带触发器的寄存输出。三态缓冲器可让输出为高、低或高阻态;XOR 可选择输出极性:控制端为 0 时原样输出,为 1 时反相。

PAL/GAL 通用框图

组合输出宏单元

组合输入/输出宏单元

可编程极性宏单元

3. CPLD:把多个 SPLD 连接起来

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

通用 CPLD 框图

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

典型 CPLD 框图

CPLD 宏单元简图

3.1 共享扩展项与并行扩展项

每个宏单元的 AND 阵列能产生有限数量的乘积项。当一个 SOP 需要更多项时:

  • 共享扩展项(shared expander):借用另一个宏单元产生的反相乘积项,再与本宏单元的 AND 项组合。
  • 并行扩展项(parallel expander):直接把邻近宏单元未用的乘积项 OR 到本宏单元输出。

共享扩展项概念

共享扩展项增加六项 SOP

并行扩展项概念

并行扩展项示例

3.2 LUT 型 CPLD 与 PLA

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

LUT 型 CPLD 框图

LUT 逻辑生成方式

AND/OR 阵列逻辑方式

LUT 逻辑示例补图

行列互连

通道式互连

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

PAL 与 PLA 阵列比较

参数典型范围
宏单元数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 类型。

MUX 符号

完整 CPLD 宏单元

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

组合模式数据通路

寄存模式数据通路

5. FPGA:以 LUT 为核心的高密度器件

FPGA(Field-Programmable Gate Array,现场可编程门阵列)由三部分组成:

  1. CLB:可配置逻辑块,内部含多个逻辑模块。
  2. 可编程互连:行列式全局网络连接各 CLB 与 I/O。
  3. I/O 块:位于芯片边缘,可独立配置为输入、输出或双向。

CLB 较小、数量很多时称细粒度;CLB 较大、功能复杂时称粗粒度。

FPGA 基本结构

CLB 与全局互连

5.1 LUT 的工作原理

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

FPGA 逻辑模块

LUT 产生 SOP

5.2 Worked Example 10-2:编程 3 输入 LUT

要实现:

只需找出这五个乘积项对应的地址,并在相应五个存储单元写入 1,其余三个地址写入 0。

Worked Example 10-2 LUT 编程结果

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

正常模式 LUT 配置

扩展到 7 变量

5.3 Worked Example 10-3:扩展 LUT 输出

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

Worked Example 10-3 的扩展 LUT

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

带片上配置存储器的 SRAM FPGA

外部存储器配置 FPGA

FPGA 中的硬核

含嵌入式存储器和 DSP 的 FPGA

6. 可编程逻辑软件设计流程

设计流程(design flow)是从输入逻辑到目标器件(target device)配置的完整链路:

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

设计流程

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

编程所需电脑

开发软件

软件界面示意

目标器件

编程硬件

章节故障排查示意

CALL/REQ 组件代码示意

JTAG 边界扫描总览

电梯控制器比较器代码示意

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

交通灯控制器模块图

VHDL 文本输入

原理图输入

层次化模块符号

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

功能仿真激励波形

功能仿真输出

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

综合前后逻辑优化

综合后的优化逻辑

网表对应原理图

时序仿真正常结果

时序仿真毛刺

下载到目标器件

功能仿真不等于时序仿真

功能仿真可不指定目标芯片;时序仿真必须先选定器件,因为软件要使用该器件的门延迟、布线延迟和网表信息。

7. JTAG 边界扫描

IEEE 1149.1 JTAG 边界扫描在芯片内部、逻辑与每个 I/O 引脚之间放置扫描单元,可测试芯片内部逻辑和芯片间连线。必需部件包括边界扫描寄存器、旁路寄存器、指令寄存器和 TAP 控制逻辑;识别寄存器是可选的。

  • TDI:串行测试数据输入。
  • TDO:串行测试数据输出。
  • TMS:选择 TAP 状态。
  • TCK:TAP 时钟。
  • TRST:可选测试复位输入。

JTAG 器件结构

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

边界扫描逻辑

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

双向 BSC

典型 BSC 结构

串行移位通路

内部逻辑到输出引脚

输入引脚到内部逻辑

多器件边界扫描

SDI 到内部逻辑与 SDO

SDI 到输出引脚与 SDO

BSDL(Boundary Scan Description Language)用 VHDL 格式描述器件型号、I/O 引脚、TAP 引脚、扫描结构和测试映射,测试软件据此生成测试向量。

8. 仿真排错与边界扫描测试

仿真中若输出为 U(未定义),常见原因是触发器没有初始值,形成循环依赖。可在源代码设置断点(break point),暂停仿真并观察 D、Q 及相关输入;为寄存器提供明确初始值或复位后,再重新仿真。

排错示例波形

设置断点

D 触发器初始化修正

修正后的有效 Gray 码输出

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

边界扫描单元位于 I/O 与逻辑之间

INTEST 测试位模式

EXTEST 测试位模式

9. 应用案例:电梯控制器 PLD 实现

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

电梯控制器编程模型

电梯控制器组件代码示意 1

电梯控制器组件代码示意 2

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

七段显示段定义

七段译码器输入输出

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

顶层电梯控制器 VHDL

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. 自测题

  1. PAL 与 GAL 的阵列结构有何相同点和不同点?
  2. 为什么 PAL 适合实现 SOP 表达式?一个 4 变量 LUT 有多少个存储单元?
  3. 共享扩展项与并行扩展项分别如何增加乘积项数量?
  4. 宏单元的组合模式和寄存模式有何区别?XOR 在其中起什么作用?
  5. FPGA 的 CLB、逻辑模块、LUT 和全局互连分别承担什么任务?
  6. 为什么功能仿真在时序仿真之前?网表和 bitstream 各在流程哪一步产生?
  7. 写出 JTAG 的四个必需信号,并说明 BYPASS、INTEST、EXTEST 的用途。
  8. 若仿真波形出现 U,如何利用断点定位并修复?
  9. Worked Example 10-1 中,表达式 需要几行 AND?
  10. 设计十层电梯时,楼层计数器位宽、比较器输入和七段译码逻辑应如何调整?

学习检查

能够从布尔表达式画出 PAL 阵列、计算 LUT 存储单元数、解释 CPLD/FPGA 结构,并说清“设计输入→仿真→综合→实现→下载”的顺序,就掌握了本章主线。

12. 延伸练习图

PAL 阵列练习

PAL 编程练习阵列

CPLD 乘积项练习

并行扩展练习

宏单元输出练习

宏单元选择练习

MUX 数据选择练习

CPLD 宏单元综合练习

LUT 输出练习

逻辑模块扩展练习

波形仿真练习

边界扫描测试练习

章节复习图

扩展 LUT 参考图

自测一下