第 217 篇

考研数电·零基础讲义 第23讲|可编程逻辑器件(PLD)简介

约 14 分钟 5027 字 华南师范大学数字电子技术考研数电零基础讲义

考研数电·零基础讲义 · 第 23 讲|可编程逻辑器件(PLD)简介 学完这一讲,你能说清 PLD 和普通逻辑芯片有什么不同,能读懂 PLA 的"点阵图"并写出它实现的函数,也能用一句话区分 PAL、GAL、CPLD、FPGA。预计用时 80–100 分钟。

本讲地图

  • PLD 的核心思想:芯片出厂时"什么功能都没有",由用户写入编程数据来决定内部怎么连线,从而决定逻辑功能。
  • PLA:与阵列、或阵列都可编程,是最简单的 PLD;任何逻辑函数都能写成"与—或"式,所以用"一排与门+一排或门"就够了。
  • PAL / GAL:PAL 与阵列可编程、或阵列固定;GAL 在 PAL 基础上加了可擦写和输出逻辑宏单元(OLMC)。
  • CPLD / FPGA:CPLD 是"很多个 GAL 拼起来";FPGA 是"一大堆查找表 LUT+可编程连线",用 SRAM 存配置。
  • 华师怎么考:考纲把 PLD 与存储器放在同一章,通常是简答/概念题(PLD 是什么、分哪几类、PLA 与 ROM 的关系),也可能给一张 PLA 的点阵图让你写函数式。教材对应第 4 章 4.6 节与附录一。

前置知识

  • 任何逻辑函数都能写成与—或式(最小项之和,见第 03 讲)。
  • ROM 的"地址译码(与阵列,固定)+存储矩阵(或阵列,可编程)"结构(见第 22 讲上)。
  • 同步触发器、D 触发器(见第 13 讲)。

一、为什么需要 PLD?

大白话

想象你要做一道菜。标准逻辑芯片(74 系列、4000 系列)像超市里卖的"预制菜":与非门就是与非门,译码器就是译码器,功能是工厂定死的。**专用集成电路(ASIC)**像"请大厨定做":功能完全贴合,但开模贵、周期长,销量小就不划算。

PLD(Programmable Logic Device,可编程逻辑器件)像一块"空白的面团":芯片里预先做好大量的门、触发器和连线,但连线是通的还是断的由你写入的数据决定。你想做什么电路,就写什么数据,一块芯片今天当译码器,明天当计数器。

与教材思考题对应的要点

类型 逻辑功能由谁决定 特点
标准化通用集成电路 厂家,固定 成本低,但功能固定,规模受限
ASIC(专用集成电路) 厂家按用户需求设计 性能好;设计、流片周期长、费用高,适合大批量
PLD 用户编程设定 通用器件;研制周期短,适合新产品研制和小批量;集成度高的可做"片上系统(SoC)"

可编程连接元件:连线怎么"可编程"?

PLD 里每个交叉点上有一个"可编程连接元件",相当于一个可以被设置成通或断的小开关。教材列了三种:

  1. 熔丝型:出厂时是通的,编程时用大电流烧断不要的熔丝。一次性。
  2. 反熔丝型:出厂时是断的,编程时用高电压击穿绝缘层把它接通。一次性。
  3. 叠栅(浮栅)隧道 MOS 管型:浮置栅上没电荷时管子正常工作,等于"接通";充入负电荷后管子始终截止,等于"断开"。电荷可以擦除,所以能反复改写(和 EPROM、EEPROM 的存储单元同一个原理,见第 22 讲)。

此外 FPGA 还用第 4 种:SRAM 单元控制一个 MOS 开关,SRAM 存 1 开关导通,存 0 截止。更换 SRAM 里的数据就能改变电路,但断电后数据丢失。

⚠️ 易错:熔丝型、反熔丝型只能编程一次;叠栅 MOS 型可擦写;SRAM 型可无限次改写但易失。

二、读懂 PLD 的"简化画法"

PLD 内部一个与门可能有几十个输入端,如果每个输入都画一根线,图会密密麻麻。所以教材(图 4.6.1)规定了简化画法:

  • 与门/或门只画一根输入线,这根线与竖线的交叉处如果有"圆点",就表示这个交叉点接通(保留了连接);没有圆点表示断开(本讲图中蓝点、橙点即此意)。
  • 与门输出恒等于 0 的情况(所有交叉点都接通,A⋅A‾=0A\cdot\overline{A}=0⁠)有专门的简化画法(教材图 4.6.1(b))。
  • 输入缓冲器有互补输出:一个输入AA经缓冲器后同时得到AA和A‾\overline{A}两根竖线,所以与阵列的每个输入变量占两列。

读图口诀:横线=一个乘积项(与门),竖线=输入变量(或其反变量),交叉点有点=该变量参与这个乘积。

三、PLA:最基本的与—或阵列

大白话

还记得第 22 讲的 ROM 吗?ROM 的结构是:地址译码器(把每个地址对应成一个最小项)→ 存储矩阵(决定每个最小项送到哪几个输出)。所以 ROM 本身就是"固定的与阵列+可编程的或阵列"。

PLA(Programmable Logic Array,可编程逻辑阵列) 更灵活:与阵列也可编程。这样不必把所有最小项都生成出来,只生成化简后需要的乘积项,节省资源。

结构

PLA 由三部分组成:

  1. 可编程的与阵列:产生若干个乘积项;
  2. 可编程的或阵列:把乘积项相加,得到若干个输出函数;
  3. 输出缓冲器:三态输出,受使能端OE′OE'控制(低电平有效)。

教材图 4.6.2 的 PLA 最多能产生 8 个乘积项,输出 4 个函数,编程后得到(⁠OE′=0OE'=0时):

Y3=ABCD+A‾ B‾ C‾ D‾,Y2=AC+BD,Y1=A⊕B,Y0=C⊙DY_3=ABCD+\overline{A}\,\overline{B}\,\overline{C}\,\overline{D},\quad Y_2=AC+BD,\quad Y_1=A\oplus B,\quad Y_0=C\odot D

⚠️ 注意异或、同或要先展开成与—或式才能放进 PLA:A⊕B=AB‾+A‾BA\oplus B=A\overline{B}+\overline{A}B⁠,C⊙D=CD+C‾ D‾C\odot D=CD+\overline{C}\,\overline{D}⁠。所以 8 个乘积项正好用完:Y3Y_3用 2 个,Y2Y_2用 2 个,Y1Y_1用 2 个,Y0Y_0用 2 个(本例中各函数的乘积项互不共用)。

我们用 Python 对这组函数代入检验:ABCD=1111ABCD=1111时Y3Y2Y1Y0=1101Y_3Y_2Y_1Y_0=1101⁠;00000000时10011001⁠;10101010或01010101时都是01100110⁠,与式子一致。

例题 1:用 PLA 实现全加器

题目:用 PLA 实现一位全加器,输入A,B,CiA,B,C_i(这里记CC⁠),输出和SS⁠、进位CoC_o⁠。

第一步:写函数式。 全加器真值表(见第 11 讲)给出

  • S=A‾ B‾C+A‾BC‾+AB‾ C‾+ABCS=\overline{A}\,\overline{B}C+\overline{A}B\overline{C}+A\overline{B}\,\overline{C}+ABC(4 个最小项,卡诺图上互不相邻,无法化简);
  • Co=AB+AC+BCC_o=AB+AC+BC(化简后 3 项)。

第二步:数乘积项。 SS要 4 个,CoC_o要 3 个,二者没有公共项(⁠ABCABC不在CoC_o的化简式中),共 7 个乘积项。

第三步:画点阵。 每个乘积项一根横线:

PLA 全加器 与阵列 A A' B B' C C' 或阵列 S Co A'B'C A'BC' AB'C' ABC AB AC BC A=1,B=1,C=0 只有 AB 行为 1 → S=0, Co=1 与阵列 6×7=42 个交叉点,或阵列 7×2=14 个交叉点;蓝点、橙点=保留的连接 S=A′B′C+A′BC′+AB′C′+ABC,Co=AB+AC+BC

图 1:蓝点是与阵列保留的连接,橙点是或阵列保留的连接。红色高亮行是 A=1,B=1,C=0 时唯一为 1 的乘积项 AB(动画闪烁)

逐行读图: 第一行A‾ B‾C\overline{A}\,\overline{B}C在A′A'⁠、B′B'⁠、CC三列有蓝点,表示这个与门接了这三个输入;它右边的橙点落在SS竖线上,表示它参与SS的或运算。

第四步:数连接点。 与阵列:7 个乘积项 × 6 条竖线(⁠A,A‾,B,B‾,C,C‾A,\overline{A},B,\overline{B},C,\overline{C}⁠)=42 个可编程交叉点;或阵列:7 个乘积项 × 2 个输出=14 个。我们用 Python 对 8 种输入全部代入,S,CoS,C_o均与全加器真值表一致。

第五步:代入检验一组。 输入ABC=110ABC=110⁠:只有ABAB这一行为 1,SS的或门里没有它,所以S=0S=0⁠;CoC_o的或门里有它,所以Co=1C_o=1⁠。确实是1+1+0=1021+1+0=10_2(和 0、进位 1)。

例题 1 的补充:乘积项可以共享

PLA 的乘积项数是有限的资源,所以同一个乘积项如果被多个输出用到,应当共享。例如要实现Y1=AB+ACY_1=AB+AC⁠,Y2=AB+BCY_2=AB+BC⁠:如果每个输出各用各的,要2+2=42+2=4个乘积项;但ABAB在两个函数里都出现,只要产生一次,然后在或阵列里让它同时连到Y1Y_1和Y2Y_2,总共只要AB,AC,BCAB,AC,BC这 3 个乘积项。此时与阵列有3×6=183\times6=18个交叉点(3 个乘积项,A,A‾,B,B‾,C,C‾A,\overline{A},B,\overline{B},C,\overline{C}共 6 条竖线),或阵列有2+2=42+2=4个连接点。(已用 Python 对 8 种输入核对。)这就是"化简时尽量找公共项"在 PLD 里的意义,和第 04 讲"多输出函数化简"是一回事。

PLA 的缺点

编程要同时设置与阵列和或阵列,编程软件复杂、速度较慢;而且早期 PLA 的两级阵列都可编程,器件性能不好做。后来的 PAL 把或阵列固定下来,简化了结构。今天已很少单独使用 PLA,但这种"与—或阵列"的思想仍用在集成电路内部。

四、PAL:与阵列可编程,或阵列固定

大白话

PLA 里两层都能调,灵活但复杂。PAL(Programmable Array Logic,可编程阵列逻辑) 想:"大部分函数的乘积项不多,不如把每个输出固定分配几个与门,用不着再让或阵列可编程了。"

于是 PAL = 可编程与阵列+固定或阵列+输出电路。

  • 未编程前,与阵列所有交叉点都有熔丝接通;编程时保留有用的、熔断没用的。
  • 每个输出的或门输入端数固定(比如 4 个或 8 个)。如果某个函数的乘积项数超过了或门的输入端数,这一个器件就实现不了(要借别的输出做级联)。
  • 常见器件指标:输入最多 20 个,乘积项最多 80 个,输出最多 10 个,每个或门最多 16 个输入。

PAL 的四种输出电路(教材图 F1.6)

结构 特点 能干什么
专用输出 或门输出经三态缓冲器输出 只能做组合函数输出
可编程 I/O 由一个乘积项控制三态门:为 1 时引脚作输出,为 0 时作输入 引脚可当输入也可当输出,更灵活
带异或门的 I/O 在或门和三态门之间加异或门,编程控制输出极性(同相/反相) 可编程得到原函数或其反函数
寄存器输出 或门输出经 D 触发器再输出,触发器状态又反馈回与阵列 可以做时序电路(如计数器)

教材例子 PAL16R4 被编成了 4 位二进制可控计数器:M1M0=11M_1M_0=11加计数,1010预置数,0101保持,0000清零(计数器的原理见第 16 讲)。

⚠️ 易错:PAL 的或阵列是固定的,这是它与 PLA 的根本区别;PAL 靠"寄存器输出"才能做时序电路,没有触发器的 PAL 只能做组合电路。

五、GAL:可擦写+输出可编成各种模式

GAL(Generic Array Logic,通用阵列逻辑)是 PAL 的升级版,结构仍是"可编程与阵列+固定或阵列+输出电路",但有两点改进:

  1. 连接元件改用叠栅 MOS 管,可以用电压擦除后重新编程。GAL 是最早能反复编程的 SPLD。
  2. 输出电路改成输出逻辑宏单元 OLMC(Output Logic Macro Cell)。一个 OLMC 里有一个或门、一个 D 触发器和 4 个数据选择器等控制电路;通过写入"结构控制字"(SYN、AC0、AC1(n)、XOR(n)),可以把输出设置成 4 种模式:专用输入、专用组合输出、反馈组合输出、寄存器输出。一种 GAL 器件就能代替多种 PAL,所以叫"通用"。

以 GAL16V8 为例:与阵列规模32×6432\times64(共32×64=204832\times64=2048个可编程交叉点,我们用 Python 算过),8 个 OLMC,10 个输入缓冲器,8 个三态输出缓冲器和 8 个反馈/输入缓冲器。

⚠️ 易错:OLMC 的"可编程"指输出结构可以改,不是指或阵列可编程——GAL 的或阵列仍是固定的。

六、CPLD 与 FPGA

PLA、PAL、GAL 都叫 SPLD(简单 PLD,也叫低密度 PLD),规模有限。需要更大规模时有两条路:

PLD 分类与特点 PLD 可编程逻辑器件 SPLD(简单) CPLD(复杂) FPGA PLA 与或均可编 PAL 或阵列固定 GAL 可擦写 多个 LAB + 互联阵列 宏单元=与或阵列+触发器 CLB + IOB + 互联 查找表(LUT) + SRAM 编程 共同点:写入编程数据决定逻辑功能;高端器件可在系统编程(ISP) 前三类靠"与-或"两级逻辑;FPGA 靠"查表",断电后配置数据要重新载入

图 2:PLD 家族一览。SPLD 里是 PLA、PAL、GAL,之外是 CPLD 和 FPGA

CPLD:把很多 GAL 拼起来

CPLD(Complex PLD,复杂 PLD,高密度 PLD)的结构是若干逻辑阵列块 LAB 加一块可编程互联阵列 PIA。每个 LAB 里有很多宏单元,每个宏单元大致就是"一组与或阵列+一个触发器+几个数据选择器",相当于一个 GAL 的输出单元。

  • 例:Altera 的 MAX7000 系列,EPM7256S 含 256 个宏单元;新的 MAX II 系列 EPM2210 约相当于 1700 个宏单元。
  • 采用**在系统可编程(ISP)**技术:不用把芯片从电路板上取下,计算机的编程数据可直接写入。
  • 特点:本质是"与或阵列",延时可预测,配置数据存在片内非易失性存储器里,上电即可工作。

FPGA:查表+海量小模块

FPGA(Field Programmable Gate Array,现场可编程门阵列)结构完全不同,由三部分组成:

  1. CLB(可组态逻辑模块):每个里面有若干逻辑单元,每个单元由查找表 LUT和辅助逻辑(触发器等)组成;
  2. IOB(输入/输出模块);
  3. PIM(可编程互联矩阵):用 MOS 开关管连线,开关由 SRAM 位控制。

名字里的"门阵列"是因为 CLB 排成阵列,像早期的门阵列集成电路,并不是说内部有一大堆与非门。

什么是查找表(LUT)?

LUT 就是一小块 SRAM。nn个输入变量当作地址,SRAM 里存的是真值表的函数值,输入一变,就"查"出对应的输出。**一个nn输入的 LUT 能实现任意nn变量逻辑函数,需要2n2^n位存储。**这和第 22 讲"用存储器实现组合逻辑函数"是同一回事。

例题 2: 用 4 输入 LUT 实现Y=AB+CDY=AB+CD⁠,写出要存入的 16 位数据。

地址顺序ABCD=0000∼1111ABCD=0000\sim1111⁠,逐个算YY⁠:

ABCDABCD 0000 0001 0010 0011 0100 0101 0110 0111
YY 0 0 0 1 0 0 0 1
ABCDABCD 1000 1001 1010 1011 1100 1101 1110 1111
YY 0 0 0 1 1 1 1 1

存入数据(地址从小到大):0001 0001 0001 11110001\ 0001\ 0001\ 1111⁠,共 7 个 1。(Python 逐位核对过。)同理,2 输入 LUT 实现异或只需存01100110这 4 位。

不同输入数的 LUT 所需位数:2 输入 4 位,3 输入 8 位,4 输入 16 位,6 输入 64 位。

CPLD 与 FPGA 对比

项目 CPLD FPGA
核心结构 与—或阵列+宏单元 LUT(查表)+触发器
逻辑块规模 复杂、数量较少 简单、数量巨大(可达数万 CLB)
编程元件 非易失(E²PROM/Flash) 通常是 SRAM(易失,断电要重新配置)
集成度 较低 很高

七、EDA 与硬件描述语言(了解即可)

PLD 的编程数据量巨大,不可能手工生成,必须用 EDA(Electronic Design Automation,电子设计自动化)工具:先用硬件描述语言 HDL(如 VHDL、Verilog)或原理图描述电路,编译软件自动化简逻辑、生成编程数据,再写入芯片。ISP(在系统可编程)让这一步不必取下芯片。

微处理器、单片机也"可编程",但它们是写入运行程序,不改变内部连接结构;PLD 是写入配置数据,改变的是内部电路连接。这是两种"可编程"的本质区别。

速记卡

器件 与阵列 或阵列 输出 可擦写 要点
PLA 可编程 可编程 三态缓冲 早期熔丝,一次 最灵活,最简单的 PLD
PAL 可编程 固定 4 种输出结构,可带触发器 熔丝,一次 或门输入数有限
GAL 可编程 固定 OLMC(4 种模式) 可(叠栅 MOS) 通用,最早可重复编程
CPLD 与或阵列+宏单元 LAB+PIA 可,ISP 上电即用
FPGA CLB 里是 LUT IOB+PIM SRAM,断电丢 集成度最高
  • 一个nn输入 LUT 存2n2^n位。
  • 熔丝/反熔丝:一次;叠栅 MOS:可擦写;SRAM 开关:可重配置但易失。
  • 读点阵图:横线乘积项、竖线变量、圆点=接通。

自测练习

1.(概念) PLA 与 ROM 在结构上有什么联系和区别?

答案与提示

两者都是"与阵列+或阵列"。ROM 的与阵列(地址译码器)固定,产生全部2n2^n个最小项,或阵列可编程;PLA 的与阵列、或阵列都可编程,只产生化简后需要的乘积项,更节省资源。

2.(概念) PAL 和 GAL 的区别有哪两点?

答案与提示

① 连接元件:PAL 多为熔丝,一次编程;GAL 用叠栅 MOS 管,可擦除重写。② 输出电路:PAL 的输出结构固定(不同型号不同);GAL 用可编程的 OLMC,一种器件可组态成多种输出结构。

3. PLA 与阵列有 4 个输入变量A,B,C,DA,B,C,D⁠,每个乘积项都接在互补输出缓冲器上,共 12 个乘积项,求与阵列的可编程交叉点个数。

答案与提示

每个输入有A,A‾A,\overline{A}两条竖线,4 个输入共 8 条竖线;12×8=9612\times8=96个交叉点。

4. 教材 PLA 的函数Y1=A⊕BY_1=A\oplus B⁠,请写出实现它所需的乘积项和或阵列连接。

答案与提示

A⊕B=AB‾+A‾BA\oplus B=A\overline{B}+\overline{A}B⁠,需要两个乘积项AB‾A\overline{B}与A‾B\overline{A}B⁠,两者都在或阵列里连到Y1Y_1⁠。

5. 用 PLA 实现半加器S=A⊕BS=A\oplus B⁠,C=ABC=AB⁠,需要几个乘积项?

答案与提示

S=AB‾+A‾BS=A\overline{B}+\overline{A}B用 2 项,C=ABC=AB用 1 项,共 3 项(Python 验证真值表:00→00,01→10,10→10,11→01)。

6. 用 3 输入 LUT 实现Y=A⊕B⊕CY=A\oplus B\oplus C⁠,要存几位?存什么数据?

答案与提示

23=82^3=8位。地址ABC=000∼111ABC=000\sim111时奇偶个数:0110100101101001(即ABCABC中有奇数个 1 时存 1)。

7.(华师风格) 简述 FPGA 与 CPLD 在结构和编程方式上的主要区别。

答案与提示

CPLD 由若干 LAB(宏单元=与或阵列+触发器)与可编程互联阵列组成,一般采用非易失的编程元件,上电即用;FPGA 由大量 CLB(LUT+触发器)、IOB 和可编程互联矩阵组成,一般用 SRAM 存配置数据,断电丢失需重新载入,集成度更高、结构更灵活。

8.(概念) PLD 与单片机"编程"有什么不同?

答案与提示

PLD 编程写入的是配置数据,改变器件内部的连接结构,从而改变硬件逻辑;单片机编程写入的是运行程序,硬件连接不变,由 CPU 逐条执行指令。

下一讲预告

下面进入最后一章数-模和模-数转换:第 24 讲先讲 D/A 转换器怎样把一串二进制数变成对应大小的电压,包括权电阻网络和倒 T 形电阻网络,这也是华师 2026 回忆真题中 D/A 题的基础。

👉 点击进入下一讲:第24讲(上)|D/A 转换器的结构与原理

评论

还没有评论。 来写第一条。

留下一条评论

选填,不会公开

纯文本,链接会自动识别。