1. FPGA概述:从零开始认识这个“万能芯片”

大家好,我是你们的FPGA讲师。在正式开始之前,我想先聊聊我自己的经历。十几年前我刚入行时,第一次拿到Xilinx的Spartan-3开发板,看着上面密密麻麻的引脚,说实话有点懵。但后来我发现,FPGA这东西,说白了就是一块“万能积木”——你想让它干什么,它就干什么。今天我们就从最基础的内容开始,把FPGA的来龙去脉理清楚。

1.1 FPGA发展历史:从“胶合逻辑”到“万能芯片”

FPGA的全称是Field Programmable Gate Array,现场可编程门阵列。这个概念最早由Xilinx公司的创始人Ross Freeman在1985年提出。当时他有个疯狂的想法:能不能做一种芯片,用户买回去之后还能自己改电路?

嗯,这在当时简直是天方夜谭。因为传统的ASIC(专用集成电路)一旦流片,电路就焊死了,改不了。但Ross Freeman坚持了下来,第一颗FPGA芯片XC2064诞生了,只有64个逻辑块,64个触发器。放在今天,连个计数器都跑不起来。但在当时,这已经是革命性的突破。

我个人觉得,FPGA的发展可以分成三个阶段:

  • 第一阶段(1985-2000年):胶合逻辑时代。FPGA主要用来做接口转换、逻辑粘合。我记得那时候做项目,FPGA就是个“万能胶”,把CPU、DSP、外设粘在一起。
  • 第二阶段(2000-2010年):片上系统时代。FPGA开始集成硬核处理器(比如PowerPC)、DSP模块、高速收发器。这时候的FPGA已经可以独立完成一个系统级设计。
  • 第三阶段(2010年至今):异构计算时代。FPGA开始集成AI引擎、HBM高带宽内存、网络硬核。说白了,FPGA已经从一个“逻辑芯片”变成了“计算芯片”。

重要节点:2012年,Xilinx推出Zynq系列,首次在FPGA中集成ARM Cortex-A9硬核处理器。这标志着FPGA正式进入“异构计算”时代。我在2013年第一次用Zynq做项目时,那种“一颗芯片搞定一切”的感觉,真的很震撼。

1.2 FPGA与ASIC对比:为什么不用ASIC?

很多初学者会问:既然ASIC性能更好、成本更低,为什么还要用FPGA?这个问题我当年也问过我的导师。他的回答很简单:你愿意等半年吗?

ASIC的流片周期通常需要3-6个月,一次流片费用少则几十万,多则上千万。而且一旦流片回来发现bug,对不起,重新来一遍。FPGA就灵活多了,改代码、重新编译、下载,几分钟搞定。

我给大家列个对比表,一目了然:

对比项 FPGA ASIC
开发周期 几周到几个月 几个月到一年
修改成本 几乎为零(重新编译即可) 极高(重新流片)
单位成本 较高(适合小批量) 极低(适合大规模量产)
性能 中等(受限于可编程结构) 极高(全定制优化)
功耗 较高(可编程开关消耗) 较低(全定制设计)
适用场景 原型验证、小批量、快速迭代 大规模量产、高性能要求

我的建议:如果你做的是小批量产品(几千片以内),或者还在原型验证阶段,用FPGA。如果产品量很大(几十万片以上),而且性能要求极高,那就考虑转ASIC。我曾经有个项目,前期用FPGA验证了半年,确认没问题后才转的ASIC,一次流片成功。这就是FPGA的价值——帮你“试错”。

1.3 FPGA内部结构:拆开看看里面有什么

FPGA内部到底长什么样?我习惯把它想象成一个“乐高城市”。下面这张图是我画的FPGA内部结构示意图,你看完就明白了。

FPGA内部结构示意图 CLB阵列(可配置逻辑块) CLB CLB CLB CLB IOB 输入输出块 I/O Pad I/O Pad I/O Pad I/O Pad Block RAM 块存储器 18Kb / 36Kb DSP Slice 数字信号处理 乘加器 累加器 时钟资源 PLL锁相环 MMCM 全局时钟网络 时钟缓冲器 图例 CLB IOB Block RAM DSP 时钟资源

从上图可以看到,FPGA内部主要由这几部分组成:

1.3.1 CLB(可配置逻辑块)

CLB是FPGA的核心,说白了就是“乐高积木块”。每个CLB里面包含若干个LUT(查找表)和触发器。LUT本质上是一个小型的RAM,你可以用它来实现任何组合逻辑。比如你想实现一个与门,LUT里就存好真值表;想实现一个加法器,LUT里就存好加法结果。

我的经验:CLB的数量决定了FPGA的“逻辑容量”。选型时,我一般会留出30%的余量。为什么?因为布线阶段可能会消耗额外的逻辑资源。我曾经有个项目,综合报告显示只用了70%的LUT,结果布线时发现资源不够,最后不得不换更大容量的芯片。嗯,从那以后我就学乖了。

1.3.2 IOB(输入输出块)

IOB是FPGA与外界通信的“桥梁”。每个IOB可以配置成输入、输出或双向。现代FPGA的IOB还支持多种电平标准,比如LVCMOS、LVDS、HSTL等。你想想看,如果你的FPGA要跟3.3V的器件通信,但核心电压只有1.2V,IOB就是负责电平转换的“翻译官”。

1.3.3 Block RAM(块存储器)

Block RAM是FPGA内部的“小仓库”。每个Block RAM通常是18Kb或36Kb,可以配置成单端口、双端口、FIFO等模式。我经常用它来做数据缓存、FIFO队列、查找表等。

避坑指南:我曾经在项目中使用Block RAM做FIFO,结果发现读写时钟域不同步时,出现了数据丢失。后来才意识到,跨时钟域处理必须用格雷码或者双触发器同步。记住:Block RAM本身不处理跨时钟域问题,你得自己加同步逻辑。

1.3.4 DSP Slice(数字信号处理单元)

DSP Slice是专门为数学运算设计的硬核模块。每个DSP Slice包含一个乘法器、一个加法器和一个累加器。你可以用它来实现乘加运算、FIR滤波器、FFT等。相比用LUT搭乘法器,DSP Slice的速度快得多,功耗也低得多。

举个例子,如果你用LUT实现一个18x18的乘法器,可能需要几百个LUT,而且最高只能跑到100MHz。但用DSP Slice,一个就够了,跑500MHz都没问题。这就是硬核的优势。

1.3.5 时钟资源

时钟是FPGA的“心跳”。FPGA内部有专门的时钟网络,包括PLL(锁相环)、MMCM(混合模式时钟管理器)、全局时钟缓冲器等。PLL可以用来倍频、分频、移相。比如你输入一个50MHz的时钟,PLL可以倍频到200MHz,或者分频到25MHz。

我个人习惯,所有时钟信号都必须经过全局时钟网络。为什么?因为全局时钟网络的延迟最小、抖动最低。如果你把时钟信号当普通信号走局部布线,时序很容易出问题。

1.4 主流FPGA厂商介绍

目前全球FPGA市场主要由两家公司垄断:Xilinx(现在叫AMD Xilinx)和Intel(原Altera)。另外还有几家中国厂商正在崛起。

厂商 代表系列 特点 适用场景
AMD Xilinx Spartan、Artix、Kintex、Virtex、Zynq 市场占有率最高,工具链成熟(Vivado) 从低端到高端全覆盖
Intel (Altera) Cyclone、Arria、Stratix、Agilex 与Intel处理器集成度高,工具链Quartus 通信、数据中心、嵌入式
Lattice iCE40、MachXO、ECP5 低功耗、小封装 消费电子、IoT、桥接
紫光同创 Logos、Titan 国产替代,性价比高 国内项目、军工、安防
安路科技 ELF、PHOENIX 国产替代,工具链易用 工业控制、通信

我的选型建议:如果你是初学者,我建议从Xilinx的Artix-7系列开始。为什么?因为资料最多、社区最活跃、Vivado工具链也相对友好。等你熟悉了基本流程,再根据项目需求选择其他厂商。我个人最早用的是Altera的Cyclone II,后来转到了Xilinx,现在两个平台都在用。说实话,工具链各有千秋,但核心的RTL设计思想是通用的。

好了,这一章的内容就到这里。FPGA的世界很大,我们从最基础的结构开始,一步步深入。下一章我们会聊RTL设计的基本概念,包括组合逻辑和时序逻辑的区别,以及如何写好一个规范的Verilog模块。到时候见。


公众号:蓝海资料掘金营,微信deep3321