2. FPGA基础概念

FPGA(现场可编程门阵列)之所以被称为“可编程”芯片,其本质在于它不像CPU或ASIC那样拥有固定的硬件功能,而是通过配置内部海量的可配置逻辑资源,按需“搭建”出用户想要的数字电路。要真正掌握紫光同创FPGA的开发,首先必须理解其底层硬件的基本构成:查找表(LUT)如何实现任意逻辑函数,触发器(FF)如何完成时序同步,块RAM(BRAM)如何存储数据,以及DSP单元如何加速运算。本章将逐一拆解这些核心架构,帮助读者建立从“代码”到“电路”的映射认知。

FPGA 可编程逻辑核心架构图 FPGA 内部结构 CLB 可配置逻辑块 LUT4 + 触发器 (组合逻辑+时序) × N 个 Block RAM 18Kb / 36Kb 真双口/简单双口 × N 个 DSP48 单元 18×18 乘法器 加法/累加器 × N 个 IO 块 LVCMOS/LVDS DDR接口 Bank 分组 可编程互连布线资源(Switch Matrix) 配置数据流 (JTAG/SPI) 用户数据输入 (I/O引脚) 数据输出 (I/O引脚) 配置芯片 (SPI Flash) DDR3/DDR4 (高速数据存储) 图例 逻辑资源 (CLB) 存储资源 (BRAM) 运算资源 (DSP) 接口资源 (IO)

上图展示了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中,供外部读取。

  1. 输入:clk(100MHz),rst_n,pulse(传感器脉冲)。
  2. 处理:使用一个16位计数器(由FF构成)对pulse计数。每秒产生一个写使能信号,将计数值写入BRAM。
  3. 输出: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搭建。