深入浅出FPGA内部资源CLB的解析
FPGA的基本组成单元: CLB资源等
详细介绍一下CLB可分为CLBLL和CLBLM两类, 这是单纯的以Xilinx旗下的FPGA的某一款为例,单纯的只是介绍个概念性的东西。SliceL和SliceM内部都包含4个6输入查找表(LUT6)、3个数据选择器(MUX)、1个进位链(Carry Chain)和8个触发器(Flip-Flop)。
SLICEM(M:Memory):其内部的LUT可以读也可以写,可以实现移位寄存器和64bit的DRAM等存储功能,还可以实现基本的查找表逻辑。SLICEL(L:Logic): 其内部的LUT只可以读,只能实现基本的查找表逻辑。
一.LUT的介绍
对于LUT而言,LUT 可以看作是一个小型的、单口的 RAM,其中地址线是输入信号,存储单元的内容是输出信号。例如,一个 4 输入的 LUT,可以被看作是一个有 16 个地址的 RAM,每个地址存储一个输出值。
假设有一个 4 输入的 LUT 实现一个逻辑函数 𝑓(𝑎,𝑏,𝑐,𝑑)。这意味着 LUT 有 16 个地址,每个地址对应一个 4 位输入的组合(𝑎,𝑏,𝑐,𝑑 作为地址线),每个地址存储一个输出值(0 或 1)。配置 LUT 就是初始化这 16 个存储单元的内容。
输入: a b c d | 输出: f(a, b, c, d) |
---|---|
地址 0: 0 0 0 0 | 存储值: 0 |
地址 1: 0 0 0 1 | 存储值: 1 |
地址 2: 0 0 1 0 | 存储值: 1 |
地址 3: 0 0 1 1 | 存储值: 0 |
… | |
地址 15: 1 1 1 1 | 存储值: 1 |
LUT的组成问题 | |
xilinx公司的7系类FPGA中使用的是6-LUT,每个LUT有六个独立的输入(A1-A6),两个独立的输出(O5-O6)。一个Slice中的四个LUT分别以A,B,C,D编号。从组成结构来说,一个6-LUT由两个5-LUT组成和一个数据选择器组成。 |
二.MUX的介绍
使用 LUT 实现 MUX
4:1 MUX 实现:
一个 4:1 MUX 有 4 个数据输入(D0, D1, D2, D3),2 个选择信号(S0, S1),以及 1 个输出(Y)。
一个 LUT6 有 6 个输入,因此可以直接实现一个 4:1 MUX:
4 个数据输入连到 LUT 的前 4 个输入端。
2 个选择信号连到 LUT 的后 2 个输入端。
LUT 的内容根据选择信号的不同组合,输出相应的数据输入
当选择信号大于 4 时(例如 MUX8)
8:1 MUX 实现:
- 一个 8:1 MUX 有 8 个数据输入(D0, D1, D2, D3, D4, D5, D6, D7),3 个选择信号(S0, S1, S2),以及 1 个输出(Y)。
- 因为一个 LUT6 只有 6 个输入,无法直接实现 8:1 MUX,需要使用两个 4:1 MUX 和一个 2:1 MUX 进行实现。
假设我们要在一个 Slice 中实现一个 16:1 MUX:
- 第一步:配置四个 LUT6 实现 4 个 4:1 MUX。
- 第二步:使用 F7AMUX 和 F7BMUX 将这四个 4:1 MUX 组合成两个 8:1 MUX。
- 第三步:使用 F8MUX 将两个 8:1 MUX 组合成一个 16:1 MUX。
三.进位逻辑链
只要记住是做运算的就行了
四.FF触发器
一个CLB由2个slice构成,其中每个slice就有8个存储单元。这8个存储单元还有所不同,其中的4个可以被配置成触发器(Flip-Flop,简写为 FF)或锁存器(Latch),其他4个则只能被配置成触发器(FF)。当配置为latch时,CLK为Low时latch是“透明”的,也就是我们之前提到的处于使能状态,相当于是缓冲器。值得注意的是,当那4个可以被配置成latch的存储单元被配置成latch时,剩下的4个(只能被配置成FF的)存储单元将不能被使用。
触发器(Flip-Flop)和寄存器(Register)在数字电路设计中是两个相关但不同的概念。虽然触发器和寄存器都用于存储数据,但它们的用途和结构有一些显著的区别。下面是对这两个概念的详细解释:
触发器(Flip-Flop)
特点:
- 基本存储单元:触发器是最基本的时序存储单元,每个触发器可以存储1位数据。
- 边沿触发:触发器通常是边沿触发的(上升沿或下降沿),这意味着它们在时钟信号的边沿变化时更新其状态。
- 类型:
D 触发器(D Flip-Flop):存储数据输入的值。
T 触发器(T Flip-Flop):在时钟边沿时翻转输出状态。
JK 触发器(JK Flip-Flop):可以进行设置、清除和翻转操作。
SR 触发器(SR Flip-Flop):可以进行设置和清除操作。
示例(D 触发器的 Verilog 代码):
module D_flip_flop (
input wire clk, // 时钟信号
input wire d, // 数据输入
output reg q // 数据输出
);
always @(posedge clk) begin
q <= d; // 在时钟上升沿采样输入并更新输出
end
endmodule
寄存器(Register)
特点:
- 多位存储单元:寄存器是由多个触发器组成的,可以存储多位数据(例如8位、16位、32位等)。
- 同步存储:寄存器中的所有触发器共享同一个时钟信号,因此寄存器在时钟边沿时同步更新其所有位的数据。
- 用途广泛:寄存器广泛用于存储数据、地址、控制信号等,可以作为缓存、计数器、移位寄存器等。
示例(8位寄存器的 Verilog 代码):
module Register (
input wire clk, // 时钟信号
input wire [7:0] d, // 8位数据输入
output reg [7:0] q // 8位数据输出
);
always @(posedge clk) begin
q <= d; // 在时钟上升沿同步更新所有位的数据
end
endmodule
主要区别:
-
存储位数:
触发器:单个触发器存储1位数据。
寄存器:寄存器可以存储多位数据,由多个触发器组成。 -
结构复杂度:
触发器:简单的存储单元。
寄存器:复杂的存储单元,由多个触发器组成,常用于处理多位数据。 -
用途:
触发器:用于实现基本的时序逻辑和单个位的存储。
寄存器:用于实现多位数据存储、数据缓存、计数器、移位寄存器等功能。
触发器和缓冲器(Buffer)
缓冲器(Buffer)在数字电路中是一个简单的电路元件,用于隔离或驱动信号。缓冲器不具有存储功能,只是简单地传输信号,并可以增强信号强度。缓冲器和触发器是不同的概念。
缓冲器的示例(Verilog 代码):
module Buffer (
input wire in, // 输入信号
output wire out // 输出信号
);
assign out = in; // 直接传输输入信号到输出
endmodule
总结:
触发器(Flip-Flop) :基本的时序存储单元,用于存储1位数据。
寄存器(Register) :由多个触发器组成的多位存储单元,用于存储多位数据。
缓冲器(Buffer) :用于隔离或驱动信号,不具有存储功能。
理解这些基本概念和区别,有助于在数字电路设计中选择合适的元件,从而实现所需的功能。