数字电子技术基础

官方工学老师·30 页·深入(追求细节与边界)·0 次浏览·2 天前
FPGA工具链HDL设计开发流程

数字电子技术基础

看懂HDL编码到比特流下载全链路,掌握每个环节的关键工具与设计陷阱

按 空格/→ 演示下一步

1 / 30 页

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

FPGA工具链HDL设计开发流程

数字电子技术基础

看懂HDL编码到比特流下载全链路,掌握每个环节的关键工具与设计陷阱

1第 1 页 · 数字电子技术基础

数字电路与FPGA概述

上页我们知道数字信号只有0和1两种状态。但怎么用真实器件实现「判断」和「运算」?这条路走了几十年——从满桌飞线的晶体管,到今天能容纳百万逻辑门的FPGA。

分立晶体管
每个三极管、电阻单独焊,一台计算机需要上万颗
标准逻辑芯片
74系列把AND/OR/NOT等基本门封装好,直接调用
可编程逻辑PLD
内部结构固定,门之间的连线由用户烧写决定
FPGA
海量可配置逻辑块+可编程互连,功能和连线全由你定
下厨做饭对应 →数字电路实现方式的演进

分立晶体管=自己种菜从头做;74芯片=去饭馆点现成菜;FPGA=进自助厨房,食材工具任你发挥

2第 2 页 · 数字电路与FPGA概述

FPGA开发完整流程

从左到右看FPGA开发的五阶段主干,底部虚线箭头表示时序不满足时的反馈回路。

图解渲染中…
C综合:把HDL翻译成门级网表D实现:映射到FPGA物理资源并布线E时序仿真:带延时的功能验证G板级验证:上电实测真实运行
3第 3 页 · FPGA开发完整流程

电路设计方法

FPGA开发流程走完一圈,轮到第一个真正动手的环节——把想法变成电路。这页回答一个常见疑问:为什么现在主流都是写代码而不是画图?

原理图设计
用图形拖拽门电路和连线,所见即所得
HDL文本设计
用Verilog/VHDL描述电路,主流工业方式
HDL≠软件编程
描述的是并行硬件结构,不是顺序执行
协同使用
顶层用原理图连接IP,底层用HDL实现
面包板搭电路对应 →原理图 vs HDL

面包板要插每个芯片每根线,HDL写「模块做什么」,EDA自动搭出等价电路

4第 4 页 · 电路设计方法

功能仿真原理

设计完电路后,下一步是把逻辑跑一遍验证对错——这就是功能仿真。它的核心特点很极端:彻底忽略硬件延迟,只问「对不对」,不问「快不快」。

零延迟模型
门和触发器用 0 或 1 个时间单位过渡,不反映真实器件速度
只验证布尔逻辑
输出是否与设计意图一致,不关心信号何时到达
不检查时序约束
setup/hold、最大频率、线延迟全部跳过
RTL 阶段完成
比综合、布局布线早得多,发现错误代价最小
剧本围读对应 →功能仿真

演员围读只对台词顺逻辑,不走位、不卡时间——只确认故事讲得对不对

5第 5 页 · 功能仿真原理

指定目标芯片

功能仿真通过后,下一步就是把设计绑定到具体芯片上——器件选型与工程配置。

1
梳理设计需求
统计逻辑单元、BRAM、DSP、IO数量及速率等级
2
初选厂商系列
在Xilinx/Intel/Lattice系列中按架构圈定候选
3
敲定具体型号
对比资源余量、速度等级、封装、温度等级
4
工程指定器件
在Vivado/Quartus中新建工程并选定该型号
5
配置引脚约束
按原理图分配引脚、写入XDC/SDC约束文件
6第 6 页 · 指定目标芯片

功能仿真vs时序仿真

两者长得像、都是仿真,但验证的根本问题不同——一个查逻辑,一个查时间。

功能仿真
  • 验证RTL逻辑功能是否正确
  • 不考虑任何门延时与线延时
  • RTL编码完成后立即可执行
  • 速度快,分钟级即可完成
时序仿真
  • 验证时序约束是否被满足
  • 包含真实的门延时与布线延时
  • 必须在布局布线之后进行
  • 更接近真实芯片的运行情况
两者都不可替代:功能仿真抓早期逻辑bug成本低,时序仿真抓后期时序违例保芯片能跑。
7第 7 页 · 功能仿真vs时序仿真

时序仿真信号流程

从左到右追踪信号流向:激励与SDF汇入仿真引擎,输出带门级延时的波形与时序报告。

图解渲染中…
d4SDF把工艺库里的门延时写回每个单元e5按真实门延时推进事件,不只看逻辑f6波形跳变沿相对激励有真实延迟
8第 8 页 · 时序仿真信号流程

时序约束基础

上页看到了时序仿真如何核对每一段延迟,但仿真到底在比对什么?答案就是时序约束——每个数据必须赶在时钟下次敲响之前抵达目标寄存器。

时钟周期 T_clk
时钟频率的倒数,是每个跳变之间分配给所有延迟的总时间预算
时序路径
数据从源寄存器经组合逻辑与布线,到达目标寄存器的完整通路
建立时间约束
数据须在下一上升沿前 T_setup 时刻已稳定,最大延迟的硬性上限
保持时间约束
采样后数据须维持 T_hold 不变,最短延迟的硬性下限
接力赛交接棒对应 →时序约束

一棒总用时=时钟周期;起跑冲刺=逻辑延迟;伸手准备=建立时间;松手延后=保持时间

Tco+Tlogic+Trouting+TsetupTclkT_{co} + T_{logic} + T_{routing} + T_{setup} \leq T_{clk}
9第 9 页 · 时序约束基础

外设接口类型

GPIO、UART、SPI、I2C等常用接口

外设接口类型
GPIO、UART、SPI、I2C等常用接口
10第 10 页 · 外设接口类型

自动化选外设流程

现代FPGA工具把外设配置从手写代码变成参数化向导,五步走完就能拿到可综合的IP核。

1
需求声明
在工程中写明接口类型、数量与性能指标
2
IP检索
工具按关键字筛选厂商与第三方IP核
3
参数配置
图形化界面设置模式、FIFO深度与中断
4
代码生成
自动产出HDL封装、约束模板与仿真模型
5
顶层集成
拖入Block Design连线,或实例化到顶层
11第 11 页 · 自动化选外设流程

引脚分配策略

深色块是高亮步骤,沿判定线看决策逻辑:识别电压→匹配Bank→混压处理→约束生成。

图解渲染中…
a6决策菱形:判断所有外设是否同压a7同Bank内直连无需转换a8混压需进入电平转换分支a10高速多并联选专用转换芯片
12第 12 页 · 引脚分配策略

锁定引脚与验证

引脚锁定文件与DRC检查

锁定引脚与验证
引脚锁定文件与DRC检查
13第 13 页 · 锁定引脚与验证

下载文件格式解析

编译完工程打开输出文件夹,会同时躺着 .sof、.pof、.rbf 几个文件——它们内部其实是同一份比特流,区别只在「打包方式」和「投递地址」。

SOF
SRAM Object File,通过JTAG下载到FPGA内部SRAM,掉电丢失
POF
Programming Object File,写入外部配置Flash,掉电保留、上电自加载
RBF
Raw Binary File,纯比特流,用于嵌入式主机远程在线升级
JIC
JTAG Indirect Configuration,在JTAG链路上间接把POF灌进Flash
牛奶的三种包装对应 →三种配置文件的归宿

SOF是巴氏鲜奶(直饮、过期作废);POF是常温奶(常温久存、开罐即饮);RBF是奶粉(纯原料、外部调配再还原)

14第 14 页 · 下载文件格式解析

生成下载文件命令

tcl

用 TCL 在 Vivado 中生成 .bit(直接加载)与 .bin(烧 Flash)的命令

代码高亮加载中…

write_bitstream 生成 .bit(SRAM 加载);write_cfgmem 打包 .bin(Flash 镜像);-loadbit 用 up 0x0 指定起始地址;glob 检查产物

15第 15 页 · 生成下载文件命令

扩展设计原则

下载文件生成后,工程看似结束。但下次要加功能、或者这段代码要搬到下一个项目——怎么写才省事?这就要靠三个设计原则。

模块化
按功能切分独立模块,每个模块职责单一、接口清晰
可复用
通用逻辑封装成 IP 核或函数,多个工程共享调用
可扩展
新增功能只追加模块,不改动已有模块的内部实现
乐高积木对应 →模块化设计原则

积木是模块,凸点是接口;同一套装拼不同造型是复用;买新积木扩展,不用拆旧的

16第 16 页 · 扩展设计原则

顶层模块架构

模块互联与信号路由

顶层模块架构
模块互联与信号路由
17第 17 页 · 顶层模块架构

时钟域交叉设计

芯片内部常有多时钟域(如 CPU 100MHz、外设 50MHz)并行。数据跨域传递,像把货物从一条传送带直接扔到另一条不同时速的传送带——会散落错位,必须设计同步策略。

亚稳态
触发器采样违反建立/保持时间时,输出悬停在不确定电平,是 CDC 失败的根本原因
单比特同步
用两级触发器串联打两拍,把亚稳态概率降到 MTBF 可接受范围
多比特同步
多位数据直接打拍会位间错位,应改用握手协议或异步 FIFO 跨域
异步 FIFO
读写双方用格雷码指针 + 双口 RAM 隔离,是多比特跨域的工业标准方案
复位与约束
异步复位需同步释放;约束中把跨域路径标为 false path 跳过分析
海关出入境检查对应 →时钟域交叉

数据像旅客从 A 国过关到 B 国,海关(同步器)不检查就可能带亚稳态入境

MTBF=etr/τf1f2\text{MTBF} = \dfrac{e^{t_r / \tau}}{f_1 \cdot f_2}
18第 18 页 · 时钟域交叉设计

复位电路设计

verilog

Verilog 实现同步与异步复位 D 触发器,看敏感列表如何决定复位时机。

代码高亮加载中…

差异全在 always 敏感列表:同步版只写 posedge clk,异步版多写 or negedge rst_n,复位边沿一触发立刻响应。

19第 19 页 · 复位电路设计

资源评估与优化

从报告里找瓶颈,再针对性优化,最后回归验证,逐步逼近资源预算。

1
生成资源报告
综合后查看Utilization报告,列出LUT/FF/BRAM/DSP用量与占比
2
识别瓶颈类型
哪类资源最紧张就先优化它,警惕均衡占用陷阱
3
定位占用来源
将综合网表对应回RTL,下沉到具体模块或instance层级
4
针对性优化
LUT做资源共享、FF做配平、BRAM替寄存器堆,各有对策
5
迭代回归验证
重新综合对比前后报告,确认资源下降且时序未劣化
20第 20 页 · 资源评估与优化

状态机基本概念

前面我们把顶层模块、时钟域、复位电路这些骨架都搭好了,但模块内部到底该如何"记住自己在做什么"、"下一步该做什么"?这就需要状态机——FPGA 里描述时序行为最常用的模型。

状态
系统当前所处的"处境"。在 FPGA 里就是一组触发器的取值,N 个触发器最多表示 2^N 个状态
转移
从当前状态到下一状态的规则:当前状态 + 输入信号 → 下一状态,由组合逻辑实现
输出
每个状态对外产生的信号。Moore 型只看状态,Mealy 型看状态+输入
电梯控制系统对应 →状态机三要素

所在楼层=状态,按钮+当前楼层→下一楼层=转移,电机方向/门开闭=输出

next=f(state,input)output=g(state)g(state,input)\text{next} = f(\text{state}, \text{input}) \quad \text{output} = g(\text{state}) \text{或} g(\text{state}, \text{input})
21第 21 页 · 状态机基本概念

状态机类型对比

输出何时变化、依赖什么——两种状态机的根本分歧在这里

Mealy 型
  • 当前状态 + 当前输入共同决定输出
  • 输入变化可在同一周期传到输出
  • 描述同一功能时状态数更少
  • 对输入毛刺敏感
Moore 型
  • 仅由当前状态决定输出
  • 输出必随状态跳变,晚一拍
  • 等价功能下状态数可能更多
  • 输出只随时钟翻转,更稳定
同周期响应/省状态选 Mealy;时序稳定、抗毛刺选 Moore
22第 22 页 · 状态机类型对比

状态转移图绘制

看图分两段:上方 a1–a4 是绘制流程,下方 a5–a14 是化简流程(比较→隐含表→递归→合并)。

图解渲染中…
a4Moore:输出标在状态圆内;Mealy:输出标在转移箭头旁a7输出不同则两个状态必不等价,可直接排除a9隐含表记录每个待定对依赖的其他状态对a10递归检查所有隐含对:全部等价才能确认
23第 23 页 · 状态转移图绘制

一段式vs二段式vs三段式

三种风格的Verilog实现对比

一段式vs二段式vs三段式
三种风格的Verilog实现对比
24第 24 页 · 一段式vs二段式vs三段式

状态编码方式

前面已经用状态转移图约定状态集合和跳转关系;现在要把每个状态映射成位串。编码一改变,寄存器、译码逻辑、切换行为与实现代价都会跟着改变。

容量与二进制
有 M 个状态时,二进制至少需满足 2^n≥M;未使用的编码必须作为非法态或无效态处理。
独热编码
每个状态由一位表示,M 个状态需 M 位;状态比较直观,但寄存器与译码资源通常随状态数增加。
格雷码
相邻合法状态只改变一位,可减少多位同时翻转的瞬态风险;编码生成和约束更复杂。
选择原则
看状态数、互斥比较、寄存器与译码资源、关键路径和相邻转移;不要把某一种编码当作默认答案。
房间编号对应 →状态编码

二进制像连续房间号,独热像每间房单独亮灯,格雷码像相邻房间只改一个号码。

M2nM\le 2^n
25第 25 页 · 状态编码方式

状态机设计实战

verilog

三段式 Moore 状态机实现「1011」序列检测,可直接综合。

代码高亮加载中…

三段式拆分清晰:状态寄存器锁当前态,组合逻辑算次态,输出独立于输入;Moore 型 dout 比输入晚一拍,体现状态机时序的本质。

26第 26 页 · 状态机设计实战

状态机仿真验证

状态机仿真不是跑一两遍就完事,状态和转移必须逐条覆盖才算完整验证。

1
列状态清单
把状态转移图里每个状态逐一登记成表
2
列转移清单
标出每条转移及其触发条件
3
写状态覆盖用例
设计用例让每个状态至少被访问一次
4
写转移覆盖用例
设计用例让每条转移至少被触发一次
5
看覆盖率报告
对照人工清单找出未覆盖的状态或转移
6
补缺用例重跑
针对未覆盖项补充测试,直至100%覆盖
27第 27 页 · 状态机仿真验证

状态机设计自测

点击作答

关于Moore型和Mealy型状态机输出方式的本质区别,下列说法正确的是?

28第 28 页 · 状态机设计自测

开发流程总结

  • 前端后端分阶段把关:仿真不过不进实现
  • 约束驱动结果:时序、引脚、资源三约束缺一不可
  • 状态机是控制核心:编码选型决定资源与可靠性
  • 时钟与复位是地基:跨时钟域与复位决定系统稳定性
  • 模块化与顶层架构:层次清晰才便于复用与扩展
延伸主题:时序约束进阶:跨时钟域分析资源利用率优化技巧FPGA板级调试与信号抓取
29第 29 页 · 开发流程总结

深入思考问题

先自己思考,再对照参考答案。

1格雷码在状态机编码中有什么独特优势?

参考答案格雷码每次只翻转 1 位,能消除多位同时跳变产生的毛刺,常用于异步 FIFO 指针和低功耗场景。

2跨时钟域只打两拍就够了吗?什么情况下不够?

参考答案多 bit 数据流打两拍可能采样到中间态。需握手、格雷码编码或异步 FIFO 保证多 bit 安全跨域。

3时序约束里把频率设得过高,会产生什么后果?

参考答案布线失败或出现负 slack。频率超物理极限时,建立时间无法满足,必须降频、改流水线或换更快的芯片。

30第 30 页 · 深入思考问题