可编程逻辑器件

官方工学老师·21 页·深入(追求细节与边界)·0 次浏览·2 天前
PLD家族数字电路硬件设计FPGA

可编程逻辑器件

理清从PAL到FPGA的演化脉络、设计原理与适用边界

按 空格/→ 演示下一步

1 / 21 页

全部页面点击任意一页,跳回舞台从这页播放

PLD家族数字电路硬件设计FPGA

可编程逻辑器件

理清从PAL到FPGA的演化脉络、设计原理与适用边界

1第 1 页 · 可编程逻辑器件

什么是可编程逻辑器件

用户可配置逻辑功能的集成电路

什么是可编程逻辑器件
用户可配置逻辑功能的集成电路
2第 2 页 · 什么是可编程逻辑器件

PLD分类体系

PROM、PAL、GAL、CPLD、FPGA层次关系

PLD分类体系
PROM、PAL、GAL、CPLD、FPGA层次关系
3第 3 页 · PLD分类体系

PLD与传统逻辑器件

学生常把PLD当成'更好的逻辑器件',但二者本质是不同设计哲学——一个像印刷成书的固定内容,一个像可擦写的空白笔记本。

固定逻辑器件
  • 功能:出厂即固化,用户无法修改
  • 周期:设计→流片/制板→量产,需数月
  • 成本:单颗极低,NRE费用高达数百万
  • 场景:大批量定型、极致性能与低功耗
可编程逻辑器件(PLD)
  • 功能:用户烧写配置,可反复擦写修改
  • 周期:写代码→烧录→验证,小时到天
  • 成本:单颗较高,无NRE门槛
  • 场景:小批量、原型验证、需要迭代
不是替代关系——大批量定型选固定逻辑(性能与单颗成本最优),原型验证与小批量选PLD(灵活性高、总投入低)。
4第 4 页 · PLD与传统逻辑器件

与或阵列基本结构

PLD核心的与门阵列和或门阵列

与或阵列基本结构
PLD核心的与门阵列和或门阵列
5第 5 页 · 与或阵列基本结构

PLD内部结构示意

从上往下读:信号经过两层可编程节点,才形成最终输出函数。

图解渲染中…
J1与阵列可编程交叉点,控制输入是否进入该乘积项J2或阵列可编程交叉点,控制乘积项是否进入输出P所有连入此节点的输入相与后得到的乘积项
6第 6 页 · PLD内部结构示意

PROM、PAL、GAL区别

前页已经看到,PLD的差异不只在于“能不能编程”,而在于与、或阵列哪一层可改,以及输出端能不能重配。PROM、PAL、GAL正是在这条轴线上给出三种结构取舍。

PROM
固定与阵列先展开所有输入最小项;可编程或阵列决定哪些项求和
PAL
与阵列可按需生成乘积项;或阵列固定连接;典型 PAL 为一次性可编程
GAL
与阵列可编程、或阵列固定;输出宏单元可重配极性、反馈和寄存器功能
写入边界
在早期PLD语境中,PROM与PAL典型为一次写入;GAL支持电擦写,可反复改逻辑
能力边界
PROM在资源足够时可表达任意逻辑;PAL受输出乘积项数限制;GAL增加输出重构能力
餐厅改菜单与上菜方式对应 →PROM、PAL、GAL

PROM先按固定规则列全菜,再选哪些上桌;PAL可改菜单但上菜组合固定;GAL连上菜方式也能重配。

F=j=1msjPj,Pj=i=1nij,ij{xi,xi,1}F=\sum_{j=1}^{m}s_jP_j,\quad P_j=\bigwedge_{i=1}^{n}\ell_{ij},\quad \ell_{ij}\in\{x_i,\overline{x_i},1\}
7第 7 页 · PROM、PAL、GAL区别

CPLD vs FPGA

CPLD 与 FPGA 都"可编程",但架构粒度天差地别,混用会选错器件。

CPLD(粗粒度)
  • 逻辑单元:宏单元(与或阵列+触发器),粒度粗
  • 互连:连续式固定布线,时延确定可预测
  • 配置:非易失(Flash/EEPROM),上电即工作
  • 适用:粘合逻辑、时序控制、给 FPGA 加载配置
FPGA(细粒度)
  • 逻辑单元:LUT 查找表+触发器,粒度细
  • 互连:分段式开关矩阵,布线多样,时延随路径变
  • 配置:易失(SRAM),需外挂 Flash 启动
  • 适用:高速并行、DSP 算法、复杂数据处理
小规模 + 确定时延选 CPLD;高密度 + 复杂算法选 FPGA。细粒度 vs 粗粒度是二者最根本的架构分水岭。
8第 8 页 · CPLD vs FPGA

硬件描述语言是什么

前面讲的与或阵列、CPLD、FPGA 都是「已经搭好的硬件」——那用什么方式告诉芯片你要它长成这样?这就要换一种思维方式。

描述对象是硬件
不是写给CPU的指令,而是描述电路的结构与行为
天生并行执行
所有信号同时运算,没有像C语言那样的先后顺序
必须可综合
代码要能映射为真实门电路,仿真语法未必能落地
两大工业语言
Verilog与VHDL语法风格不同,但描述能力对等
两种描述层次
行为级说「做什么」,结构级说「由什么门搭出来」
建筑施工图纸对应 →HDL代码

图纸描述建筑蓝图,HDL描述电路蓝图,都要靠下游工具「建造」成实物

9第 9 页 · 硬件描述语言是什么

Verilog基本结构

verilog

看一个最小但完整的Verilog模块,掌握模块、端口、逻辑体三段式写法。

代码高亮加载中…

模块由module…endmodule包裹;端口三件套是「方向+类型+位宽」;输出用reg而非wire,是因为它在always块中被赋值。

10第 10 页 · Verilog基本结构

数据类型与常量

上一页我们认识了 Verilog 模块的结构。但写代码时每个信号前都要声明类型——就像电路元件有不同的封装:有的是纯导线,有的能存电荷。类型决定了信号怎么被赋值、综合成什么硬件。

wire(连线型)
表示电路中的物理连线,必须被持续赋值驱动,不能存储值,综合后就是一根导线。
reg(寄存器型)
名字叫「寄存器」但不一定综合成触发器;只要在 always 块中被赋值就需要它。
integer(整型)
32 位有符号整数,行为类似 reg,常用于循环计数,综合时常推断为 32 位寄存器。
parameter(参数常量)
编译期常量,实例化时可被覆盖(localparam 不能),常用于位宽、状态机编码等。
常量字面量
写法是 [位宽]'[进制][值],如 8'hFF;未指定位宽时按 32 位处理,可能造成隐式截断。
电线 vs 蓄电池对应 →wire vs reg

电线要持续通电;蓄电池充上电后维持电压——reg 能否真保持,取决于 always 是时序还是组合

11第 11 页 · 数据类型与常量

运算符与表达式

verilog

三组运算对比:逐bit的位运算、整体判布尔的逻辑运算、按数值计算并按位宽截断的算术运算。

代码高亮加载中…

L13按位与逐bit相与得1000_0000;L18逻辑与把8位数当布尔值,输出仅1bit;L22加法172+195=367超出8位,按位宽截断为0x6F。

12第 12 页 · 运算符与表达式

行为描述方法概述

Verilog有三种描述方式,从底层结构到高层算法逐步抽象。

1
结构描述方式
直接调用门级元件并连线,像在画电路原理图
2
数据流方式
用assign语句描述信号间的运算关系,关注数据走向
3
行为描述方式
用过程语句描述算法逻辑,不必关心具体电路实现
13第 13 页 · 行为描述方法概述

门级结构描述

verilog

用基本门元件搭建2选1选择器,展示门级结构描述风格。

代码高亮加载中…

高亮行依次声明内部连线、实例化与/或/非基本门,呈现"把电路当成连线网络"的描述方式。

14第 14 页 · 门级结构描述

数据流描述

verilog

用 assign 把组合逻辑写成单条表达式——条件运算符与按位形式任选一种。

代码高亮加载中…

assign 持续监测右侧表达式,输入任一变化立刻驱动 y;条件运算符和按位写法在 RTL 层等价,综合结果都是同一个二选一多路选择器。

15第 15 页 · 数据流描述

行为描述always块

verilog

用always块描述一个4选1数据选择器,展示组合逻辑行为建模的标准写法。

代码高亮加载中…

output必须声明为reg才能在always块里赋值;@(*)通配敏感列表覆盖所有右侧信号;default补全sel的四种取值,杜绝锁存器推断。

16第 16 页 · 行为描述always块

模块实例化

verilog

8 位加法器由两个 4 位加法器实例化拼出,看 Verilog 层次化调用语法。

代码高亮加载中…

5 个高亮讲清层次化三要素:实例名=物理块标签;.port(sig) 按名连;[3:0]/[7:4] 位选择把 8 位总线拆给 4 位端口;wire c1 把多个实例串成进位链。

17第 17 页 · 模块实例化

条件语句在组合逻辑中的应用

verilog

用同一个 4 选 1 多路选择器对比 if-else 与 case 两种写法,展示综合后硬件结构的关键差异。

代码高亮加载中…

if-else 综合成优先级多路选择器链,末尾 else 兜底避免推断锁存器;case 综合成并行多路选择器,各分支优先级相同,必须枚举所有 sel 值或显式 default。

18第 18 页 · 条件语句在组合逻辑中的应用

阻塞与非阻塞赋值

always块里写条件时,等号其实有两种写法——"="和"<="。多了一个尖括号,执行时机却完全不同,这是Verilog区别于普通编程语言最关键的一处设计。

阻塞赋值 =
RHS立即求值并立刻写入LHS,按语句顺序逐条执行
非阻塞赋值 <=
RHS当前时刻采样,LHS推迟到本仿真步末尾统一更新
核心差异
同一句链b=a; c=b; 中,c读到的是新b还是旧b
混用陷阱
同一always块内混用=与<=,仿真结果依赖语句顺序,可能生成锁存器而非触发器
选用原则
纯组合always用=;带posedge/negedge的时序always一律用<=;存在反馈时优先<=
接力赛 vs 群发邮件对应 →阻塞 vs 非阻塞赋值

接力:前一人交棒,下一人才能起跑(=);群发:所有人基于同一份原稿同时改写(<=)

阻塞:b=a; c=bc=b非阻塞:ba; cbc=b\text{阻塞:} b=a;\ c=b \Rightarrow c=\text{新}b \\ \text{非阻塞:} b\leq a;\ c\leq b \Rightarrow c=\text{旧}b
19第 19 页 · 阻塞与非阻塞赋值

可综合描述子集

你已经写过 always、assign、if/case——但并不是所有 Verilog 代码都能变成真实芯片。这一页要回答:综合工具到底认哪些语句,不认哪些?

综合的本质
把 HDL 翻译成由门、触发器、连线组成的网表(netlist),物理上能实现的元素才被接受
可综合子集
语言中保证能映射到硬件原语的那部分语句;其他语句只能用于仿真验证
常见可综合语句
always @敏感列表、assign、if/case、for(边界确定)、模块实例化、运算符
常见不可综合语句
initial、#延时、$display/$monitor、fork-join、force/release、wait(部分)
工具决定边界
Vivado、Quartus、DC 各家支持的子集略有差异,最终以目标工具手册为准
建筑设计图对应 →可综合子集

承重墙、钢筋能被施工建出来;'这里采光好'等批注只是给设计师看的

20第 20 页 · 可综合描述子集

课后思考

先合上笔记想五分钟,再对照参考答案。三问分别对应 PLD 的本质、Verilog 的陷阱、综合的边界。

1可编程逻辑器件的核心思想,为什么是"与或阵列+可编程连接"?相比固定门电路,它的根本优势在哪?

参考答案任意布尔函数都能写成与或两级形式(香农展开)。把与项、或项都做成可编程阵列,同一颗芯片就能改连线实现不同逻辑,这就是 PLD "通用模板"的本质。

2在时序逻辑如状态机中,为什么必须用非阻塞赋值 `<=` 而非阻塞赋值 `=`?混用会出什么问题?

参考答案非阻塞赋值在 always 块结束时才统一更新,所有触发器同时锁存新值,保持同步;阻塞赋值立即执行,多寄存器会出现"竞争",状态机跳错状态或产生毛刺。

3Verilog 仿真通过但下到 FPGA 后功能出错,从"可综合子集"角度看,哪些写法可能是元凶?

参考答案高危写法:initial 块、#延时、$display、for 变量未声明 reg、if 缺 else 推断锁存器、case 缺 default、阻塞/非阻塞混用、敏感列表不全——综合器要么忽略,要么造出非预期硬件。

21第 21 页 · 课后思考