本文主要介绍了博主在阅读天野英晴主编的《FPGA 原理和结构》一书时的读书笔记,方便更好的了解和入门 FPGA。本博客图片均来自于参考文献 [1]。
FPGA 是一种可编程的逻辑器件,用来实现任意逻辑电路的集成电路。FPGA 有如下几种要素:
FPGA 的结构也可以从不同的粒度进行讨论:
FPGA 的可编程特性让 FPGA 可以通过可编程的开关来控制电路结构,这种可编程的开关可以使用多种技术实现:
目前,由于 SRAM 可以使用先进的 CMOS 工艺的优点,SRAM 是 FPGA 的主流类型。
岛形 FPGA 结构如下:
大部分逻辑块都包含查找表,触发器和数据选择器 (既有组合电路也有时序电路的功能),查找表的输入决定了逻辑块的复杂程度,从而有了对电路面积和延迟的权衡。增大查找表的输入会降低逻辑深度,加快电路速度,但有可能产生资源浪费,反之会改善电路的面积效率,但会降低电路的速度。实验证明 5,6 输入的查找表在 FPGA 使用面积和电路延迟上权衡较好,现在的商用 FPGA 都倾向于采用 6-LUT。FPGA 也会有一些专用的的电路连接在 LUT 后,比如加法计算的进位链。
布线时是通过对连接块和开关块的控制来激活或者断开线与线之间的连接,开关快和连接块都是需要配置存储器 (一般是SRAM) 来对其的开关进行控制。
FPGA 还会有一些用于计算的单元,比如 DSP 这种专用的硬核块,但如果过多的专用计算硬核块没有被利用也会导致浪费。因此,高性能,高编程自由度,高使用效率之间存在权衡关系。
早期 FPGA 上的存储资源并不多,随着技术和数据存储需求的增长,FPGA 架构开始集成高效的片上存储器 (外部存储器会有带宽系统瓶颈),现在的 FPGA 片上存储器 (嵌入式存储器) 有: (1) BRAM,(2) LUT (LUT 本质是连接 SRAM 的多路选择器,可以用来实现逻辑功能,也可以用来存储),(3) 存储器 IP 等。
JTAG 是一种用来调试 FPGA 的接口标准,其中应用了边界扫描测试标准,边界扫描是通过外部访问移位寄存器,在输入引脚决定测试值,在输出引脚观测输出值的机制。接口简单,信号需要的少。JTAG 还可以用来写入 FPGA 的配置数据。为了观察 FPGA 的内部信号,还可以把需要观测的信号写入嵌入式存储器,然后通过 JTAG 读到上位机。
PLL 和 DLL 是用来控制 FPGA 中的时钟的,FPGA 开发时可能需要生成跟外部没有相位差的时钟,或是需要不同频率,不同相位的时钟,其中
FPGA 开发流程
按设计和验证分类的 FPGA 设计流程:
基于 HDL 的设计流程是:
板卡是一种 FPGA 和多种输入输出设备结合的开发板,用户电路也可以主动写观测模块用于调试开发模块的功能:
HLS 的设计是从 C 语言代码生成 RTL 描述的过程 (也被称之为行为综合),其中 HLS 有几种不同的输入输出描述方式:
行为综合还可以设置生成接口的类型方式:
关于 HLS 设计的更多细节,可以参考博主的 Vivado HLS UG871 学习笔记系列的博客。
基于 IP 的设计可以使用提前用 RTL 描述好的通用的格式 (称为 IP 核) ,与其他模块互相连接即可。
FPGA 上的处理器分为硬核处理器和软核处理器。硬核处理器以硬核的形式集成在 FPGA 中。比如 SoC,这种处理器是标准的嵌入式处理器 (Xilinx ZYNQ 系列中称为 PS);软核处理器使用可编程逻辑实现的具有处理器功能的模块,自由度较高。
软件开发环境 (SDK):基于处理器的系统也需要进行软件开发,SDK 包含开发用的编译器,调试器等,软件开发环境需要知道硬件的一些组成和架构信息,让用户通过操作系统或是直接对内存进行管理。
关于软硬件整合之后执行的示意图如下:
其中主要有以下几种方式:
[1] FPGA 原理和结构 / (日) 天野英晴主编;赵谦译,北京人民邮电出版社,2019.3 (2022.9 重印)。