第6讲:系统级设计技术
第6讲:系统级设计技术
前几讲主要围绕 FPGA 的基本结构、仿真、综合以及常见数字接口展开讨论。这些内容构成了数字系统设计的基础能力。但在实际工程中,一个可运行的 FPGA 系统往往不是由单个模块直接构成,而是由多个功能模块、处理器子系统、片上总线、存储控制逻辑以及外设接口共同组成。此时,设计者面临的问题就不再只是“某个模块能否工作”,而是“多个模块如何协同构成一个完整系统”。
因此,本章将讨论系统级设计技术。所谓系统级设计,并不是简单地把多个模块拼接起来,而是要求设计者从功能划分、接口标准、资源组织、重用方式和验证策略等更高层次出发,规划一个可扩展、可维护、可验证的 FPGA 系统。本章重点介绍三类常见内容:基于 IP 核的模块化设计流程、部分可重配置的基本原理,以及软核处理器的系统集成方法。在此基础上,还将进一步讨论系统级集成验证与联调的基本思路。
学习目标
通过本章学习,读者应达到以下目标。首先,应能够理解系统级设计与单模块 RTL 设计之间的差异,认识模块化、标准化和层次化在复杂 FPGA 工程中的重要作用。其次,应能够掌握基于 IP 核构建系统的基本流程,理解软核、固核和硬核 IP 的区别,并了解常见片上互连接口的基本定位。再次,应能够理解部分可重配置的基本思想,知道静态逻辑与可重配置区域的划分原则,以及该技术的适用场景与局限。然后,应能够初步掌握软核处理器在 FPGA 系统中的作用,理解处理器、总线、存储器和外设之间的集成关系。最后,应能够建立系统级验证与联调意识,理解“模块正确”与“系统可用”之间仍存在明显差距。
引例:为什么模块级设计正确后,系统集成仍然可能失败
在 FPGA 学习过程中,很多读者都会经历这样一种情况:各个子模块单独仿真时都能正确工作,但当它们真正集成到一个系统中时,却出现了各种问题,例如数据无法正确传输、时钟域之间通信异常、处理器无法访问外设、复位后系统状态混乱,或者下载到开发板后系统根本没有预期行为。
产生这些问题的原因在于,系统级设计关注的不仅是每个模块内部逻辑是否正确,更关注模块之间的接口、时序、资源共享和控制关系是否合理。一个 UART、一个存储控制器和一个处理器核,即使各自都能独立工作,也不意味着它们在统一时钟、统一地址空间和统一复位框架下就一定能够协调运行。尤其是在存在多个时钟域、多个主从设备或复杂片上互连时,系统问题往往比单模块问题更隐蔽、更难定位。
因此,系统级设计的核心任务不是“再写更多代码”,而是以更高层次的方法组织已有模块,使它们形成一个结构清晰、边界明确、行为可验证的整体。这正是本章讨论的重点。
基于 IP 核的模块化设计流程
在复杂 FPGA 设计中,从零开始编写所有功能模块通常既不现实,也没有必要。工程中大量使用的时钟管理、存储控制、总线互连、DMA、串行通信控制器和处理器核,往往都以 IP 核形式提供。合理使用 IP 核,不仅可以提高开发效率,还能增强系统结构的可维护性和可复用性。
什么是 IP 核
IP(Intellectual Property)核是已经封装好的、可重复使用的硬件功能模块。对设计者而言,它相当于数字系统中的“标准功能部件”。一个 IP 核可以是简单的 FIFO,也可以是复杂的 DDR 控制器、以太网 MAC 或处理器子系统。
按照交付形式的不同,IP 核通常可以分为以下三类:
软核(Soft IP)
以可综合 HDL 代码形式提供,灵活性较高,可移植性较好,适合教学和跨平台原型设计。固核(Firm IP)
通常以网表或较低层次中间表示形式提供,保留一定可配置能力,但内部结构对用户不完全开放。硬核(Hard IP)
以版图级形式固化在器件中,通常具有更高性能和更低功耗,例如部分 FPGA 内置的高速收发器、PCIe 控制器或 SERDES 资源。
从教学角度看,软核最容易理解,因为读者仍可从 HDL 和综合角度观察其行为;而硬核则更强调器件资源和系统集成。
为什么系统设计需要模块化
模块化设计并不仅仅是为了“代码写得整齐”,更重要的是降低复杂度。一个系统若被划分为多个职责明确的模块,设计者就可以分别关注计算、存储、控制和通信等不同功能,再通过标准接口将它们连接起来。这样做的好处主要有以下几点:
- 降低单个模块的设计复杂度;
- 便于多人协作开发;
- 便于功能复用和版本维护;
- 有利于测试、替换和升级局部模块;
- 有利于逐层定位系统错误。
因此,在系统级设计中,模块边界的划分与接口形式的定义,往往和模块内部逻辑本身同样重要。
基于 IP 核的系统构建流程
一个较为典型的基于 IP 核的系统设计流程通常包括以下步骤:
需求分析
明确系统需要完成的功能,例如数据采集、协议转换、图像处理或控制任务。功能划分
将系统划分为时钟与复位、数据通路、控制逻辑、处理器子系统、外设接口等不同部分。IP 选型与自研模块规划
对于通用功能,优先考虑成熟 IP;对于具有课程或研究特色的部分,则保留自定义 RTL 实现。接口标准化
尽量统一模块间接口形式,减少大量非标准定制连接。系统集成
通过总线、桥接逻辑或顶层连线将各模块连接为完整系统。系统级验证与联调
从局部仿真过渡到子系统验证,再到板级联调。
常见片上接口标准
在系统级设计中,接口标准化十分重要。若每个模块都采用完全不同的自定义接口,系统会迅速变得难以维护。工程中常见的片上互连接口包括:
- AXI4:适合存储器映射、高吞吐读写场景;
- AXI4-Lite:适合寄存器访问和控制配置;
- AXI4-Stream:适合连续数据流,如图像、音频和高速采样数据;
- Avalon-MM / Avalon-ST:常见于 Intel FPGA 生态;
- 简单握手接口:适合教学或小规模定制模块。
这些接口的共同目标,是在模块之间建立统一的数据、地址、握手和时序约定,使系统更容易扩展和替换。
IP 封装的基本要求
一个适合系统集成的 IP 核,不应只是“能工作的一段代码”,还应具备清晰的接口定义和可复用性。通常需要关注以下方面:
- 接口命名清晰:时钟、复位、输入、输出和握手信号应有统一风格;
- 参数化能力:如数据位宽、深度、地址宽度和工作模式应可配置;
- 时钟与复位策略明确:说明是同步复位还是异步复位,是否支持多时钟域;
- 寄存器映射明确:若模块可由处理器访问,应有清晰地址表;
- 配套文档完整:包括功能说明、时序图、参数说明和使用限制;
- 验证样例齐全:至少提供基本仿真测试用例或参考工程。
工具支持与图形化集成
在商业 FPGA 工具中,系统集成通常可借助图形化平台完成。例如,Vivado 的 IP Integrator 可以通过图形方式连接处理器、总线、存储器和外设;Quartus 生态中也存在类似的系统构建工具。对于教学而言,理解这些工具的作用即可,不必将其视为“自动生成系统”的黑盒。
下面给出一个简化的 Tcl 示例,用于说明系统级工具通常通过脚本管理 IP 创建过程:
create_bd_design "system"
create_ip -name clk_wiz -vendor xilinx -library ip -version 6.0 [get_ips]
create_ip -name axi_interconnect -vendor xilinx -library ip [get_ips]这个例子本身并不重要,重要的是读者应理解:系统级设计通常不只是编辑 HDL 文件,还常常需要同时管理 IP 参数、工程脚本、地址映射和约束文件。
部分可重配置原理
当 FPGA 系统规模较大、功能模式较多,或者要求运行时动态切换硬件功能时,传统的“一个工程对应一个完整比特流”的方式可能不再最优。此时,部分可重配置(Partial Reconfiguration,PR)便成为一种重要技术。
部分可重配置的基本思想
部分可重配置的核心思想是:将 FPGA 逻辑划分为静态区域和可重配置区域。其中,静态区域在系统运行期间保持不变,负责全局时钟、总线互连、处理器控制、外部接口等基础功能;可重配置区域则可根据需求装载不同功能模块,从而在不停止整个系统的前提下改变部分硬件逻辑。
例如,一个系统在某一时刻可能需要执行滤波算法,而在另一时刻需要执行压缩算法。如果这两种功能不会同时运行,就可以让它们共享同一片可重配置区域,在不同时间装载不同硬件模块。
为什么需要部分可重配置
部分可重配置的主要价值体现在以下几个方面:
资源复用
多个互斥功能共享同一硬件区域,减少总体资源占用。动态升级
在系统运行过程中替换局部功能,提高系统灵活性。缩短功能切换时间
与全芯片重新配置相比,部分重配置的数据量更小、切换更快。支持多模式系统
适合通信、图像处理、边缘计算等需要模式切换的场景。
静态逻辑与可重配置区域划分
一个良好的 PR 设计首先取决于区域划分是否合理。一般而言:
- 静态逻辑应包含系统不会轻易变化的部分,如处理器、片上总线、时钟、配置接口和关键控制模块;
- 可重配置区域应容纳可替换的计算模块或协议模块,并尽量减少与外部的复杂耦合。
划分时需要注意两个原则:
边界清晰
可重配置区域与静态区域之间的接口应尽量简单、稳定,避免每次替换模块都改变整个系统结构。依赖尽量少
若可重配置模块与静态系统耦合过深,则不仅设计困难,验证和维护成本也会显著上升。
基本实现流程
在工具层面,部分可重配置通常包括以下步骤:
- 定义顶层系统和静态区域;
- 指定某些模块所在区域为可重配置分区;
- 为同一分区准备多个可替换功能模块;
- 对静态设计和各重配置模块分别实现;
- 生成完整比特流和各个部分比特流;
- 在运行过程中通过配置接口加载目标部分比特流。
下面给出一个示意性的 Tcl 片段:
set_property HD.RECONFIGURABLE 1 [get_cells reconfig_region]
create_partition_def -name pr_partition -module reconfig_module该示例的重点不在语法细节,而在于说明:PR 设计并不是简单写几个 if 语句,而是需要在工程、层次、布局和配置层面同时规划。
应用场景
部分可重配置常见于以下场景:
- 多模式通信系统:不同调制解调或协议处理模块按需切换;
- 硬件功能动态升级:在现场替换某个算法模块;
- 资源分时复用:多个复杂计算核轮流占用同一片逻辑区域;
- 边缘智能系统:根据任务不同切换推理、预处理或加速模块。
技术优势与局限
虽然 PR 很有吸引力,但并非所有系统都适合使用。其主要优势和局限可以概括如下。
优势:
- 能提高硬件资源利用率;
- 支持运行时功能切换;
- 为复杂系统提供更高灵活性。
局限:
- 设计流程明显复杂于普通工程;
- 接口和区域划分要求较高;
- 验证难度较大;
- 不同厂商和器件对工具支持程度差异较大。
因此,对初学者而言,更重要的是理解其思想与适用条件,而不是在一开始就追求完整工程实现。
软核处理器集成
随着 FPGA 系统规模提升,纯硬件状态机并不总是最合适的控制方式。对于寄存器配置、流程控制、协议管理、数据搬运协调和人机交互等任务,引入处理器往往会显著提高系统灵活性。因此,在 FPGA 中集成软核处理器,是系统级设计中的一个重要方向。
什么是软核处理器
软核处理器是用 HDL 描述并可综合到 FPGA 逻辑资源中的处理器核。与固定在芯片中的硬核 CPU 不同,软核处理器本质上仍由 FPGA 的 LUT、触发器、BRAM 等资源实现,因此更灵活,但其性能通常受限于可编程逻辑资源与时钟频率。
软核处理器的意义在于:它为 FPGA 系统提供了一个“软件控制平面”。设计者可以把复杂但低速的控制决策交给软件执行,而把高速、并行、实时的关键数据通路保留给硬件电路实现。
软核处理器的系统价值
在系统设计中,软核处理器特别适合承担以下任务:
- 配置外设寄存器;
- 管理 DMA 或数据通路启动停止;
- 执行系统初始化和状态监测;
- 实现简单协议栈或控制算法;
- 作为人机交互、命令解析和调试接口的控制中心。
这样做的好处是:硬件负责“快”的部分,软件负责“灵活”的部分。二者结合,往往比纯硬件方案更易于维护,也比纯软件方案更能发挥 FPGA 的并行优势。
常见软核处理器
不同 FPGA 生态中常见的软核处理器如下:
| 类型 | 典型代表 | 特点 | 常见配套总线 |
|---|---|---|---|
| Xilinx 生态 | MicroBlaze | 集成度高,便于与 Xilinx IP 协同 | AXI4 / AXI4-Lite |
| Intel 生态 | Nios II | 与 Platform Designer 配合方便 | Avalon-MM / Avalon-ST |
| 开源生态 | RISC-V 软核 | 可定制性强,适合教学与研究 | 视实现而定 |
从教材角度看,具体使用哪一类软核并不是最重要的,关键在于理解处理器在 FPGA 系统中的角色:它并不是取代硬件,而是与硬件加速模块共同构成片上系统。
软硬件协同的基本结构
一个典型的“软核处理器 + 硬件加速模块”系统,通常包括以下部分:
- 处理器核:执行控制程序;
- 指令/数据存储器:存放程序和运行数据;
- 总线互连:连接处理器与外设;
- 外设寄存器模块:供处理器配置硬件;
- 中断控制逻辑:实现事件通知;
- 硬件加速器:处理大量并行数据任务;
- 调试与下载接口:支持程序加载和系统调试。
在这一结构中,处理器通常通过存储器映射方式访问外设寄存器。例如,某个加速模块可能具有 start、status、length、result 等寄存器,处理器通过读写这些寄存器控制硬件工作。
存储器映射与寄存器接口
软核处理器之所以能控制外设,关键在于统一地址空间。设计者通常为每个外设分配一段地址区域,使处理器像访问普通内存一样访问硬件寄存器。
例如,一个简单外设可能具有如下寄存器:
0x00:控制寄存器0x04:状态寄存器0x08:输入参数寄存器0x0C:结果寄存器
这种方法的优点是结构直观,软件和硬件边界清晰。读者应建立一个基本认识:系统级设计中的很多“接口”,本质上不是若干裸露连线,而是“总线 + 地址映射 + 寄存器协议”的组合。
集成时需要关注的问题
软核处理器虽然增强了系统灵活性,但也带来新的系统级问题。集成时通常要关注:
- 时钟规划:处理器、外设与高速数据通路是否工作在同一时钟域;
- 复位顺序:处理器启动前,外设寄存器和时钟是否稳定;
- 中断机制:外设完成任务后如何通知处理器;
- 带宽匹配:处理器总线访问速度是否足以满足系统需求;
- 软硬件分工:哪些功能适合软件实现,哪些应下沉为硬件逻辑。
若这些问题处理不当,系统可能虽然“能跑”,但效率低、结构混乱、难以维护。
系统级集成验证与调试
当设计进入系统级后,验证方法也必须随之变化。此时,单独模块的 testbench 已不足以覆盖整个系统的行为。设计者需要从“模块验证”过渡到“集成验证”和“联调验证”。
系统级验证为什么更难
系统级验证之所以比模块级验证困难,主要原因有三点:
模块间耦合更强
错误可能并不出现在某个模块内部,而出现在模块接口、握手时序或地址映射关系中。系统状态更多
时钟、复位、中断、DMA、缓存和软件执行流程共同决定系统行为。问题可重复性变差
某些错误只会在特定数据、特定启动顺序或特定板级环境下出现。
因此,系统级验证不能只依赖“多写几个激励”,还必须建立分层验证思路。
分层验证思路
一个较为合理的系统验证流程通常包括以下层次:
模块级验证
先确认各独立模块在仿真中功能正确。子系统级验证
验证若干相关模块组合后的行为,例如“处理器 + UART”“DMA + FIFO + 存储控制器”。顶层系统联调
在统一时钟、统一复位和完整连接关系下验证整体行为。板级验证
下载到开发板后,通过串口输出、逻辑分析仪、ILA 或示波器观察真实运行情况。
这种逐层推进的方法,有助于缩小问题范围,避免一开始就在“整机黑盒”中排查故障。
系统级验证的关注点
与模块级验证相比,系统级验证通常更关注以下问题:
- 复位释放后系统是否进入正确初始状态;
- 处理器是否能正确访问各外设寄存器;
- 主从设备之间是否存在握手死锁;
- 时钟域跨越是否正确处理;
- 数据流是否出现丢包、乱序或阻塞;
- 中断与状态标志是否能正确联动;
- 系统吞吐率和实时性是否满足要求。
这些问题很多并不是单个 RTL 文件中能直接看出来的,而必须通过系统整体行为来判断。
常见调试手段
在 FPGA 系统集成阶段,常见调试手段包括:
仿真波形观察
适合分析模块之间的时序关系与控制流程。串口打印
适合软核处理器系统,用于观察程序执行步骤、寄存器状态和错误码。片上逻辑分析工具
如 ILA、SignalTap 等,可在真实硬件运行时采集内部信号。状态寄存器与调试寄存器
为关键模块预留观测窗口,便于软件读取运行状态。回环与自检机制
对通信路径或数据通路构造闭环测试,快速判断链路是否正常。
从工程实践看,系统级调试往往不是依靠单一手段完成的,而是需要“仿真 + 板级观测 + 软件日志”联合使用。
面向系统的设计建议
为了让系统更容易验证和维护,在设计之初就应考虑以下原则:
- 尽量统一时钟与复位结构;
- 为关键模块预留状态输出或调试寄存器;
- 避免过深层次的隐式控制关系;
- 对地址空间、寄存器定义和中断编号进行文档化;
- 对系统启动流程进行清晰规划;
- 在顶层设计中保持模块边界和命名风格一致。
这说明一个重要事实:验证便利性本身就是系统设计质量的一部分。若一个系统无法被有效观察和调试,它在工程上就很难称为成熟设计。
本章小结
本章围绕系统级设计技术展开讨论,重点介绍了 FPGA 工程从“模块实现”走向“系统构建”时需要掌握的几个核心概念。首先,本章说明了基于 IP 核的模块化设计流程,指出系统级设计必须重视功能划分、接口标准化和模块复用,并介绍了软核、固核和硬核 IP 的基本区别。其次,本章讨论了部分可重配置的基本思想,说明该技术通过划分静态逻辑与可重配置区域,实现局部功能的动态切换,但同时也带来更高的设计与验证复杂度。再次,本章介绍了软核处理器集成的基本方法,强调处理器在 FPGA 系统中主要承担控制与管理功能,而高速并行处理仍应由专用硬件逻辑完成。
在此基础上,本章进一步讨论了系统级集成验证与调试的方法,指出系统设计的难点往往不在某个模块本身,而在于模块之间的接口关系、复位时序、地址映射、总线握手和软硬件协同。总体而言,本章希望读者建立这样一种认识:系统级设计并不是“更大的 RTL”,而是一种以层次化、标准化、可复用和可验证为核心的工程方法。
术语表
| 术语 | 英文全称 | 含义说明 |
|---|---|---|
| IP | Intellectual Property | 可复用的硬件功能模块。 |
| Soft IP | Soft Intellectual Property | 以 HDL 代码形式提供的可综合 IP。 |
| Firm IP | Firm Intellectual Property | 以网表或较低层次形式提供的 IP。 |
| Hard IP | Hard Intellectual Property | 固化在器件中的专用硬件资源。 |
| AXI | Advanced eXtensible Interface | 常见片上总线接口标准。 |
| AXI4-Lite | AXI4-Lite | 面向寄存器访问的轻量级 AXI 接口。 |
| AXI4-Stream | AXI4-Stream | 面向连续数据流的 AXI 接口。 |
| PR | Partial Reconfiguration | 部分可重配置技术。 |
| Soft-core CPU | Soft-core CPU | 综合到 FPGA 逻辑中的处理器核。 |
| Memory-Mapped I/O | Memory-Mapped I/O | 通过统一地址空间访问外设寄存器的方法。 |
习题与思考
- 为什么在复杂 FPGA 工程中,模块化和接口标准化比单纯增加代码量更重要?
- 软核、固核和硬核 IP 分别适用于哪些场景?它们的主要差异是什么?
- 为什么说系统级设计不仅是模块拼接,还涉及时钟、复位、地址映射和验证策略?
- 部分可重配置中的“静态区域”和“可重配置区域”分别应承担什么样的功能?
- 在什么情况下,引入软核处理器比纯硬件状态机更合适?
- 为什么处理器访问外设通常采用存储器映射方式?这样做有什么好处?
- 系统级验证与模块级验证相比,难点主要体现在哪些方面?
- 如果一个系统在仿真中正确、上板后却异常,应优先从哪些系统级因素入手排查?
课程作业:系统级方案设计与模块集成规划
请结合本章关于 IP 核、部分可重配置和软核处理器的内容,完成一个简化 FPGA 系统方案设计作业。作业要求如下:
- 自拟一个系统主题,例如数据采集与显示、串口控制终端、图像预处理平台或多传感器采集系统;
- 按系统功能将设计划分为时钟与复位、数据通路、控制逻辑、外设接口和处理器管理等模块;
- 说明哪些部分适合采用成熟 IP,哪些部分更适合自行编写 RTL;
- 画出系统结构框图,并标明各模块之间的接口形式,例如 AXI4-Lite、AXI-Stream、简单握手接口或存储器映射寄存器;
- 若系统需要较高灵活性,可说明是否适合引入软核处理器;若功能存在模式切换,可讨论是否适合采用部分可重配置思想;
- 从验证角度说明该系统最可能出现的问题点,例如复位时序、地址映射冲突、跨时钟域通信或软件配置错误。
作业报告要求
本章作业报告应至少包含以下内容:
- 系统功能说明与应用背景;
- 模块划分依据与结构框图;
- IP 与自研模块的分工分析;
- 接口标准与数据流向说明;
- 验证与调试关注点总结;
- 对软核处理器或部分可重配置是否采用的结论与理由。
阅读建议
建议读者在学习本章后,尝试从已有实验中选择两个或三个模块,按照“时钟与复位—数据通路—控制寄存器—接口连接”的思路手工组织成一个简化系统。若条件允许,还可以进一步尝试使用软核处理器对某个自定义外设进行寄存器访问实验,以体会系统级设计与单模块 RTL 设计在思维方式上的差异。对于希望继续深入的读者,可进一步学习片上总线协议、DMA 结构、缓存一致性和软硬件协同设计等内容。
