1. Orientation and Overview of this Course

整个课程大纲,一共 25 节 5 章。这里补充一页来自最后一课的 Summay 方便看的更清楚

2. Introduction

FPGA 也被称为“Liquid Hardware”。从底层结构来看,FPGA、CPLD 和 SPLD 在逻辑单元的组织和连接方式上有所不同。

FPGA通常由大量的可编程逻辑单元(PLU)组成,这些逻辑单元可以配置成各种不同的逻辑功能,如逻辑门、寄存器等。FPGA还包括大量的可编程连线(Interconnect)和存储单元(如查找表或存储器单元),这些单元可以用于存储逻辑功能的配置信息。

CPLD通常由一系列可编程逻辑模块(PLM)组成,这些模块包含了逻辑门和触发器,以及连接这些模块的可编程连线。CPLD通常具有更快的时钟速度和更低的延迟,这是因为它们通常使用了静态逻辑技术,而不是动态逻辑技术

SPLD通常由少量的逻辑门和触发器组成,通常用于实现相对简单的逻辑功能,如组合逻辑或状态机。

FPGA 与 GPU 谁是未来的趋势一直都争论不休,但其实和 CPU 一样,二者的架构不同各自擅长的领域也不同。

GPU的优势之一是能够同时执行多个进程,以及对大块数据进行流处理。这使得GPU在处理需要大规模并行计算的应用中表现出色,比如图形渲染、科学计算、深度学习等。

相比之下,FPGA(现场可编程门阵列)也可以执行并行计算,但其主要优势在于其灵活性和可定制性。FPGA可以根据特定的应用需求进行定制化设计(因为其总线位宽可以任意定制,因此可以定制特定位宽的数据处理,减少资源使用开销等)因此在某些特定的应用场景下,FPGA可以提供更高的性能和效率,功耗一般也更低。

3. FPGA Architecture

Xilinx 嵌入 ARM 的 FPGA 系列有:Zynq-7000 和 UltraScale+ MPSoC。左侧描述的是 FPGA 的架构,由横竖交叉的 routing 将密密麻麻的 Programmable Logic 连接起来,四周则是 Programmable I/O。右侧则是 FPGA 一般包括的资源

上图右侧资源中,比较陌生的几个在这简单整理下起功能

  • XADC(Xilinx Analog-to-Digital Converter):XADC是赛灵思(Xilinx)FPGA系列中的模拟数字转换器模块,用于将模拟信号转换为数字信号。XADC可以用于采集和处理模拟信号,例如温度传感器、电压监测等
  • Transceiver:Transceiver是FPGA中的高速收发器模块,通常用于支持高速串行通信协议,如PCIe、SATA、以太网等。这些模块可以实现高速数据传输,支持不同的协议和数据速率
  • CMT(Clock Management Tile):CMT是赛灵思FPGA中的时钟管理模块,用于生成、分配和管理时钟信号。CMT模块可以实现时钟频率的分频、倍频、延迟等功能,以满足不同的时序要求

SliceM 和 SliceL 应该是最熟悉也是最重要的两个,这里也记录下:

  • SLICEL(Slice LUT):SLICEL是FPGA中的逻辑单元模块,通常包括查找表(LUT)、寄存器、算术逻辑单元(ALU)等。SLICEL通常用于实现逻辑功能和算术运算,是FPGA中的基本计算单元。
  • SLICEM(Slice Memory):SLICEM是FPGA中的存储单元模块,用于实现存储器和存储器相关的功能。SLICEM通常包括存储器单元、存储器控制器等,用于实现存储器的读写操作和存储器相关的逻辑功能。

需要注意的是,当 LUTs 被用于组成存储器时,通常会消耗 SLICEM 而不是 SLICEL(如果组成 memory 所需的 SLICEM 不够,也不会消耗 SLICEL)。这是因为SLICEM(Slice Memory)专门用于实现存储器单元和存储器相关的功能,包括存储器单元、存储器控制器等。SLICEM通常包含更多的存储器资源和相关的控制逻辑,可以更好地支持存储器的读写操作和存储器相关的功能。相比之下,SLICEL(Slice LUT)通常用于实现逻辑功能和算术运算,包括查找表(LUT)、寄存器、算术逻辑单元(ALU)等。虽然LUT也可以用于实现存储器功能,但SLICEM更适合用于实现大规模的存储器单元和相关的存储器控制逻辑。

另外还有一个没有提及的资源是 FF(Flip-Flop) 触发器资源,每个 FF 通常包含一个存储器单元,用于存储一个比特的信息,并且具有时钟信号控制的输入端,用于在时钟信号的上升沿或下降沿触发状态的更新。是的,FF 和时序逻辑直接相关,可以理解为每个使用类似 always @(posedge clk) 都会占用一个或多个 FF 资源。这是因为时序逻辑通常需要使用触发器来存储状态信息,以响应时钟信号的边沿触发状态更新。

a. Logic Unit

Logic Unit 包括 LUT、MUX 以及 carry chain。在实现加法器时可以使用 LUT 实现(其本质也是数字逻辑组成的),也可以通过 Arithmetic-logic Unit 如 DSP48 这样的资源来实现。

b. Arithmetic-logic Unit

图中的 ALU 模块能够实现很多算术运算,在 Xilinx FPGA 中,ALU 指的是 DSP48

c. Memory Unit

Memory Unit 中 LUT 位于 SliceM 中,主要用来存放一些小块的数据(< 1kb)。
Block RAM 的结构如下

在 T 系列的 FPGA 中,一个 Block RAM 是由两个 18Kb 组成,可以被拆分重组成如上图的几种形式。
另外,RAM 可以被配置成如下几种形式:

  • Single port RAM:只能通过一个端口进行读写操作
  • Simple-dual port RAM:具有两个独立的读写端口,但读操作和写操作不能同时进行。举个例子,如果一个端口正在进行读操作,那么同一时刻另一个端口就不能进行读操作,但可以进行写操作。
  • True-dual port RAM:具有两个完全独立的读写端口,端口彼此之间的读写操作不会影响,相比上面的 Simple-dual port RAM。这是因为在它内部的存储单元,每个都有两个独立的数据输出端口,分别连接到两个读写端口。这样,即使两个端口同时访问同一个存储单元,也不会发生冲突,因为每个端口都有自己的数据输出路径。作为代价,其需要复杂的控制逻辑来确保并发的读写操作不会相互影响,通常会使用时序控制和状态机来实现这一点。
  • Single port ROM:只能通过一个端口进行读取操作(仅读取)
  • Dual port ROM:具有两个独立的读写端口,可以同时进行两个独立的读取操作(仅读取)
  • FIFO:用在两个时钟域之间进行数据传输的存储器结构,可以实现数据的先进先出的顺序。

4. Focus

在使用 C/C++ 进行开发时候,需要了解每个 function 的功能大致实现以及资源使用情况

5. Summary