看前提醒:作者入门尚浅,本文基本是找到的教程的简略版笔记,本文主要为学习的FPGA教程系列,并结合部分学习中查找的其他资料整理而成。
学习笔记:《FPGA学习笔记》索引
可配置逻辑块(Configurable Logic Block,CLB) 是FPGA芯片的底层元件之一,如果将FPGA比作人体,那么CLB就是组成人体的细胞。
CLB由SLICE组成,不同架构的SLICE种类不一样,Xilinx7系中就有两种SLICE:SLICEL、SLICEM,SLICEM比SLICEL多了写存储数据功能。
FPGA每个SLICE基本都由LUT、MUX、进位链、寄存器组成:
下图为SLICEM的组成结构,SLICEL与SLICEM的差别仅在于SLICEM的4个LUT6具有存储功能,而SLICEL没有。
对于整体结构在本小节仅做了解,在本文做完各组件介绍后会对整体结构进一步分析。
LUT6本质由2个LUT5(5IN-1OUT)组成,首先两个LUT5分别对I[4:0]指定真值表,此时对于l[4:0]会分别有2位输出,这2位输出再经过由I5控制的选择器(MUX)输出为O6,即可实现LUT6。此时O5会输出上方LUT5的结果,但一般只在LUT6用作5位输入2位输出时使用。
LUT6可以用作5位输入2位输出(5IN-2OUT),使用此功能时I5将强制置1,使O6的输出为下方LUT5的输出。
在实际情况中:
下图中,左侧为SLICEM,右侧为SLICEL,二者仅红框部分,也就是LUT6部分不同。
对比SLICEM和SLICEL的LUT6,其异同点如下:
因为SLICEM的LUT6具有写存储功能,因此LUT6可以作RAM使用,1个SLICEM中有4个LUT6,可以组合为多种DRAM(Distributed RAM,分布式随机存储器):
配合MUX使用可以组成更大深度的DRAM:
一个端口WADDR[6:1]只可同步写,另一端口RADDR[6:1]只可异步读。64x3简单双端口DRAM(左图)可以存储64个3位数据,DATA[3:1]并行输入,三个O6(O[3:1])并行输出;32*6可以存储32个6位数据,DATA[6:1]输入,O[6:1]输出。
SRLC32E,使用SLICEM的LUT配置为32位移位寄存器。移位寄存器中的数据在脉冲信号作用下依次逐位移动,因此每个LUT可以将串行数据延迟1到32个时钟周期。移位寄存器使用电平转移,即输入是多少V输出就是多少V,因此可能出现亚稳态电平。
移位寄存器的应用包括:
移位寄存器功能包括:
移位寄存器时序图
MUX16_1中没有使用LUT6进行5次4选1(原:16-4-2-1,5次4选1:16-4-1),下图中,红线是使用5个LUT6进行16选1,绿线是通过4个LUT6+MUX进行16选1。可以看出红线路径无法保证延迟一致性,走线越长延迟偏差就越大,容易产生毛刺,造成逻辑错误。这也是MUXF7和MUXF8这样设计(靠近LUT6,且结构对称)的原因,其本身就是为多路选择器设计的。
基础补充:全加器。
全加器最低位CIN置1为减法,如0101-0010=0011,0101补码不变,(-0010)补码为反码+1,将0101和0010的反码传入,CIN置1即为反码+1操作,等价于0101+1110=0011。
进位链结构如下,红框部分为它的一个基本单元(本质为全加器)。
MUXCY(下一级进位)原理:
产生进位的条件是在A、B以及CIN中有两个或两个以上的1,分为两种情况:
以一个8位加法为例子:
module carrychain(
input [7:0] a,
input [7:0] b,
output[7:0] o
);
assign o=a+b;
endmodule
因为1个LUT6只能作为4位全加器使用,所以会使用到2个LUT6,其内部连线如下。a和b的低4位传到了红框中,结果传入进位链1,第4位进位传到进位链2,并输出低4位运算结果o[3:0];高4位传到绿框中,结果传入进位链2,最终输出高4位运算结果o[7:4]。
进位链级联数有限制,其取决于当前列SLICE的个数(图中绿框部分),且不能跨逻辑区域,逻辑区域里进位链最大级数=逻辑区域内一列的SLICE个数,全加器位宽为SLICE个数x4。
基础补充:触发器,通过时钟沿到来改变存储的输出状态;锁存器,通过电平变换改变存储的输出状态。FPGA中触发器使用较多。
Xilinx7系的存储单元结构主要分两种,如下图存储单元1、2:
相同点:
例1:INIT和SR复位电平的配置
module and_8_8(
input clk,
input rst,
input [7:0]i_data_1,
input [7:0]i_data_2,
output[7:0]o_data
);
reg [7:0]r_data_tmp=8'b0; //这里将会8个存储单元配置为INIT0 ,如果改成8'b1111_1111则配置成INIT1
always@(posedge clk)
begin
if(rst)
r_data_tmp<=8'b0;//这里将会8个存储单元配置为SRLOW ,如果改成8'b1111_1111则配置成SRHIGH
else
r_data_tmp<=i_data_1&i_data_2;
end
assign o_data=r_data_tmp;
endmodule
不同点:
小节2中给出过的SLICEM架构图如下,可以分为相同的4行,SLICEL与之类似,差别仅为LUT6不具备存储功能。
SLICE在CLB中的排列:
一个CLB有2个SLICE,上一级SLICE进位链输出连接到下一级SLICE进位链输入。
进位之外数据的互联:
同一CLB内的SLICE通过CLB内的快速互联单元(橙框)直连,黄框和绿框用于将线连到更远处。
DSP48E1可以用于进行多种逻辑、算术的单独、组合运算,内容较多,仅作简要总结。DSP48E1的简要架构如下:
红框之外的部件为寄存器,用于流水线操作,提高性能
DSP48E1的内部架构:
DSP48E1除了能做1个48位与48位加法/减法/逻辑操作(ONE48),还能被用来做2个24位与24位加法(TWO24),4个12位与12位加法(FOUR12)
模式探测器
输入主要为PATTERN,MASK,DATA,DATA为DSP48E1运算后未打拍的结果。使用PATTERN DETECT时输出要打一拍,与输出P对应上。
当DATA与PATTERN相同时,PATTERNDETECT为1,否则为0;当DATA与PATTERN反码相同时,PATTERNBDETECT为1,否则为0。MASK对应DATA每一位,置1时,对应位忽略与PATTERN的比较,当数据位全置1时,PATTERNDETECT用于检测高位(符号拓展位)是否全为0,不是的话产生上溢出(overflow),PATTERNBDETECT用于检测高位是否全为1,不是的话产生下溢出。
一般来说,存储较大数据时用BRAM,存储较小数据时用DRAM,分界线并不严格,跑通就行。
BRAM有 单口(Single Port,SP),简单双端口(Single Dual Port,SDP),真双端口(True Dual Port,TDP) 等,与DRAM类似。
BRAM的三种模式
1.WRITE_FIRST(写优先),时序图:
2.READ_FIRST(读优先),时序图:
3.NO_CHANGE,时序图: