可编程逻辑器件
理清从PAL到FPGA的演化脉络、设计原理与适用边界
按 空格/→ 演示下一步
全部页面点击任意一页,跳回舞台从这页播放
可编程逻辑器件
理清从PAL到FPGA的演化脉络、设计原理与适用边界
什么是可编程逻辑器件
用户可配置逻辑功能的集成电路
PLD分类体系
PROM、PAL、GAL、CPLD、FPGA层次关系
PLD与传统逻辑器件
学生常把PLD当成'更好的逻辑器件',但二者本质是不同设计哲学——一个像印刷成书的固定内容,一个像可擦写的空白笔记本。
- 功能:出厂即固化,用户无法修改
- 周期:设计→流片/制板→量产,需数月
- 成本:单颗极低,NRE费用高达数百万
- 场景:大批量定型、极致性能与低功耗
- 功能:用户烧写配置,可反复擦写修改
- 周期:写代码→烧录→验证,小时到天
- 成本:单颗较高,无NRE门槛
- 场景:小批量、原型验证、需要迭代
与或阵列基本结构
PLD核心的与门阵列和或门阵列
PLD内部结构示意
从上往下读:信号经过两层可编程节点,才形成最终输出函数。
PROM、PAL、GAL区别
前页已经看到,PLD的差异不只在于“能不能编程”,而在于与、或阵列哪一层可改,以及输出端能不能重配。PROM、PAL、GAL正是在这条轴线上给出三种结构取舍。
PROM先按固定规则列全菜,再选哪些上桌;PAL可改菜单但上菜组合固定;GAL连上菜方式也能重配。
CPLD vs FPGA
CPLD 与 FPGA 都"可编程",但架构粒度天差地别,混用会选错器件。
- 逻辑单元:宏单元(与或阵列+触发器),粒度粗
- 互连:连续式固定布线,时延确定可预测
- 配置:非易失(Flash/EEPROM),上电即工作
- 适用:粘合逻辑、时序控制、给 FPGA 加载配置
- 逻辑单元:LUT 查找表+触发器,粒度细
- 互连:分段式开关矩阵,布线多样,时延随路径变
- 配置:易失(SRAM),需外挂 Flash 启动
- 适用:高速并行、DSP 算法、复杂数据处理
硬件描述语言是什么
前面讲的与或阵列、CPLD、FPGA 都是「已经搭好的硬件」——那用什么方式告诉芯片你要它长成这样?这就要换一种思维方式。
图纸描述建筑蓝图,HDL描述电路蓝图,都要靠下游工具「建造」成实物
Verilog基本结构
看一个最小但完整的Verilog模块,掌握模块、端口、逻辑体三段式写法。
模块由module…endmodule包裹;端口三件套是「方向+类型+位宽」;输出用reg而非wire,是因为它在always块中被赋值。
数据类型与常量
上一页我们认识了 Verilog 模块的结构。但写代码时每个信号前都要声明类型——就像电路元件有不同的封装:有的是纯导线,有的能存电荷。类型决定了信号怎么被赋值、综合成什么硬件。
电线要持续通电;蓄电池充上电后维持电压——reg 能否真保持,取决于 always 是时序还是组合
运算符与表达式
三组运算对比:逐bit的位运算、整体判布尔的逻辑运算、按数值计算并按位宽截断的算术运算。
L13按位与逐bit相与得1000_0000;L18逻辑与把8位数当布尔值,输出仅1bit;L22加法172+195=367超出8位,按位宽截断为0x6F。
行为描述方法概述
Verilog有三种描述方式,从底层结构到高层算法逐步抽象。
门级结构描述
用基本门元件搭建2选1选择器,展示门级结构描述风格。
高亮行依次声明内部连线、实例化与/或/非基本门,呈现"把电路当成连线网络"的描述方式。
数据流描述
用 assign 把组合逻辑写成单条表达式——条件运算符与按位形式任选一种。
assign 持续监测右侧表达式,输入任一变化立刻驱动 y;条件运算符和按位写法在 RTL 层等价,综合结果都是同一个二选一多路选择器。
行为描述always块
用always块描述一个4选1数据选择器,展示组合逻辑行为建模的标准写法。
output必须声明为reg才能在always块里赋值;@(*)通配敏感列表覆盖所有右侧信号;default补全sel的四种取值,杜绝锁存器推断。
模块实例化
8 位加法器由两个 4 位加法器实例化拼出,看 Verilog 层次化调用语法。
5 个高亮讲清层次化三要素:实例名=物理块标签;.port(sig) 按名连;[3:0]/[7:4] 位选择把 8 位总线拆给 4 位端口;wire c1 把多个实例串成进位链。
条件语句在组合逻辑中的应用
用同一个 4 选 1 多路选择器对比 if-else 与 case 两种写法,展示综合后硬件结构的关键差异。
if-else 综合成优先级多路选择器链,末尾 else 兜底避免推断锁存器;case 综合成并行多路选择器,各分支优先级相同,必须枚举所有 sel 值或显式 default。
阻塞与非阻塞赋值
always块里写条件时,等号其实有两种写法——"="和"<="。多了一个尖括号,执行时机却完全不同,这是Verilog区别于普通编程语言最关键的一处设计。
接力:前一人交棒,下一人才能起跑(=);群发:所有人基于同一份原稿同时改写(<=)
可综合描述子集
你已经写过 always、assign、if/case——但并不是所有 Verilog 代码都能变成真实芯片。这一页要回答:综合工具到底认哪些语句,不认哪些?
承重墙、钢筋能被施工建出来;'这里采光好'等批注只是给设计师看的
课后思考
先合上笔记想五分钟,再对照参考答案。三问分别对应 PLD 的本质、Verilog 的陷阱、综合的边界。
参考答案任意布尔函数都能写成与或两级形式(香农展开)。把与项、或项都做成可编程阵列,同一颗芯片就能改连线实现不同逻辑,这就是 PLD "通用模板"的本质。
参考答案非阻塞赋值在 always 块结束时才统一更新,所有触发器同时锁存新值,保持同步;阻塞赋值立即执行,多寄存器会出现"竞争",状态机跳错状态或产生毛刺。
参考答案高危写法:initial 块、#延时、$display、for 变量未声明 reg、if 缺 else 推断锁存器、case 缺 default、阻塞/非阻塞混用、敏感列表不全——综合器要么忽略,要么造出非预期硬件。