2. FPGA基础概念
FPGA(现场可编程门阵列)之所以被称为“可编程”芯片,其本质在于它不像CPU或ASIC那样拥有固定的硬件功能,而是通过配置内部海量的可配置逻辑资源,按需“搭建”出用户想要的数字电路。要真正掌握紫光同创FPGA的开发,首先必须理解其底层硬件的基本构成:查找表(LUT)如何实现任意逻辑函数,触发器(FF)如何完成时序同步,块RAM(BRAM)如何存储数据,以及DSP单元如何加速运算。本章将逐一拆解这些核心架构,帮助读者建立从“代码”到“电路”的映射认知。
上图展示了FPGA内部的核心资源布局。从工程视角看,FPGA并非一个“黑盒”,而是由可配置逻辑块(CLB)、块RAM、DSP单元、IO块以及丰富的布线资源构成的二维阵列。紫光同创的FPGA(如Logos系列、Titan系列)在架构上遵循了这一经典范式,但在具体容量、DSP精度和BRAM大小上做了针对国产应用场景的优化。下面我们逐一深入剖析这些基础单元的工作原理。
2.1 可编程逻辑原理:从真值表到查找表(LUT)
核心原理:FPGA实现逻辑功能的基本单元并非传统的“与门”、“或门”,而是一种名为“查找表”(Look-Up Table, LUT)的存储结构。一个N输入的LUT,本质上是一个具有2^N个存储单元的SRAM。你可以把它想象成一个微型真值表:输入信号作为地址线,去“查”这个表,表里预先存好的值就是输出。
例如,要实现一个二输入与门(Y = A & B),在FPGA中并不是真的去连接一个与门电路,而是将LUT的4个存储单元(2^2=4)分别写入0、0、0、1。当A=0,B=0时,地址为00,输出0;当A=1,B=1时,地址为11,输出1。这样,任何复杂的组合逻辑,都可以通过修改LUT中存储的“真值表”内容来实现,这就是“可编程”的底层奥秘。
紫光同创工程映射:在紫光同创的PDS(Professional Design Suite)开发环境中,当你使用Verilog/VHDL编写类似 assign Y = A & B; 的语句时,综合器会自动将这段代码转换为LUT的配置位流。对于常用的4输入LUT(LUT4),它拥有16位配置数据。如果逻辑超过4个输入,工具会自动级联多个LUT来完成。
2.2 触发器(Flip-Flop):时序逻辑的基石
如果说LUT解决了“逻辑计算”问题,那么触发器(FF)则解决了“时间同步”问题。FPGA中的触发器通常是D触发器,它有一个数据输入端(D)、一个时钟输入端(CLK)、一个复位端(RST)和一个输出端(Q)。
工作原理:D触发器在时钟信号的上升沿(或下降沿)到来时,将D端的数据“锁存”到Q端,并在下一个时钟沿到来前保持不变。这种边沿敏感的特性,使得FPGA能够构建复杂的时序状态机、流水线以及计数器。
- 同步复位与异步复位:紫光同创FPGA的触发器支持同步复位(仅在时钟沿时复位)和异步复位(复位信号立即生效)。在工程实践中,推荐使用异步复位、同步释放的复位策略,以避免亚稳态问题。
- 时钟使能(Clock Enable):每个触发器还通常带有一个时钟使能端(CE)。当CE为高时,触发器才响应时钟沿;CE为低时,输出保持不变。这是实现低功耗设计和门控时钟的关键。
2.3 块RAM(Block RAM):片上数据存储的仓库
FPGA内部除了用触发器构成的小型寄存器堆外,还有大量专用的硬核存储单元——块RAM(BRAM)。紫光同创的BRAM通常以18Kb或36Kb为基本单位。
架构特点:BRAM是真正的双端口RAM,支持同时读写。它被精心设计为可配置多种位宽和深度,例如可以配置为1K×18bit、512×36bit等模式。与分布式RAM(由LUT构成)相比,BRAM具有更高的密度和更稳定的时序性能,适合存储中大型数据缓冲、FIFO(先入先出队列)以及帧缓存。
| 特性 | 分布式RAM(LUT实现) | 块RAM(BRAM硬核) |
|---|---|---|
| 构成单元 | LUT + 触发器 | 专用SRAM阵列 |
| 容量 | 小(几百bit) | 大(18Kb/36Kb) |
| 速度 | 延迟较小,但占用逻辑资源 | 高速,时序稳定 |
| 典型应用 | 小型寄存器堆、移位寄存器 | FIFO、数据缓冲、图像行缓存 |
| 数量限制 | 受限于CLB数量 | 受限于芯片型号(如Logos-25有56个BRAM) |
实战经验:在紫光同创FPGA设计中,若需缓存大量数据(如以太网帧),应优先例化BRAM原语(如 RAMB18),而非用数组综合。PDS工具会自动推断,但手动例化原语能更精确地控制读写时序和输出寄存器,从而提升时序收敛成功率。
2.4 DSP单元:硬核乘法与累加加速器
在数字信号处理(DSP)应用中,乘法运算是最频繁的操作。如果使用LUT搭建乘法器,会消耗大量逻辑资源且速度受限。因此,FPGA内部集成了专用的DSP硬核单元。
紫光同创DSP48结构:该单元内部包含一个18×18位的有符号乘法器,后接一个可配置的加法器/减法器/累加器。这意味着你可以通过配置,让DSP48直接完成 P = A × B + C 或 P = A × B + P(累加)操作,而无需消耗任何CLB逻辑。
// 示例:在紫光同创FPGA中使用DSP原语实现乘加运算
// 该代码将被综合器映射到DSP48单元
module mac (
input clk,
input [17:0] a, b,
input [35:0] c,
output reg [35:0] p
);
always @(posedge clk) begin
p <= a * b + c; // 综合工具自动推断DSP
end
endmodule
工程价值:在高速FIR滤波器、FFT运算或图像卷积处理中,DSP单元的数量直接决定了运算吞吐量。例如,紫光同创Titan系列中拥有数百个DSP48单元,可支持并行处理多路高清视频流。
2.5 案例拆解:基于LUT+FF+BRAM的简易数据通路设计
为了将上述概念串联起来,我们设计一个简单的数据通路:8位累加器。该设计将使用到LUT(实现加法逻辑)、FF(实现累加寄存器)以及BRAM(存储历史数据)。
背景与目标:假设我们需要统计一个传感器输入的脉冲个数,并将每秒钟的计数值存入BRAM中,供外部读取。
- 输入:clk(100MHz),rst_n,pulse(传感器脉冲)。
- 处理:使用一个16位计数器(由FF构成)对pulse计数。每秒产生一个写使能信号,将计数值写入BRAM。
- 输出:BRAM中的数据通过串口读出。
资源映射分析:
- 计数器:16位计数器需要16个FF,加法逻辑需要约4个LUT4。
- BRAM:存储60秒的数据,需要60×16bit = 960bit,使用1个BRAM18即可(配置为1K×16bit)。
- 控制逻辑:秒脉冲产生逻辑需要额外的FF和LUT。
复盘:通过这个案例,可以看到FPGA设计实际上是“算力”(LUT+DSP)与“存储”(FF+BRAM)的协同工作。如果单纯用FF做存储,60个16位数据需要960个FF,会占用大量CLB;而使用BRAM则几乎不消耗逻辑资源。这就是理解架构差异带来的设计优化。
常见误区警示:
- 误区1:认为LUT可以无限级联。实际上,级联深度增加会导致路径延迟增大,时序难以收敛。应尽量将大逻辑拆分为流水线。
- 误区2:忽略复位策略。在紫光同创FPGA中,若使用异步复位且复位信号毛刺较大,容易导致寄存器进入亚稳态。务必使用全局复位网络(如
BUFG)驱动复位信号。 - 误区3:BRAM读写冲突。在真双口模式下,若两个端口同时写同一地址,数据会不确定。工程中需设计仲裁逻辑或使用“先读后写”模式。
2.6 总结与架构选型复盘
本章节深入剖析了FPGA的四大核心基础架构:LUT(可编程逻辑)、FF(时序同步)、BRAM(数据存储)和DSP(数字运算)。理解这些资源的物理含义,是进行高效FPGA设计的前提。
关键要点回顾:
- LUT是万能逻辑门:任何组合逻辑均可通过配置LUT实现,但需注意输入数量限制。
- FF是时序的节拍器:所有同步逻辑都依赖于FF的边沿触发特性。
- BRAM是数据缓冲池:合理使用BRAM能大幅节省逻辑资源,提升系统稳定性。
- DSP是数学加速器:涉及乘法、乘加运算时,务必使用DSP硬核,避免用LUT搭建。