一直以来,觉得自己关于FPGA方面,摸不到“低”——对底层架构认识不清,够不着“高”——没真正独立做过NB的应用,如高速、复杂协议或算法、神经网络加速等高大上的应用,所以能力和认识水平都处于中间水平。这段时间做时序优化,感觉心有余而力不足了,可能要触及手动布局布线了,打开Device布局图才开始有兴趣探究一些底层结构的东西。

看吧,资源已经用了80%的A7 200芯片

可能翻开任何一本有关FPGA的书籍,上来就会介绍FPGA的历史,原理,内部结构什么的,大部分人看着都极其枯燥,常常要么直接略过,要么就看一遍,久了也就忘记了(部分靠翻译文档的书作者该好好反思)。我硬着头皮去弥补之前缺失的一些基础知识,结合Xilinx A7 芯片,总结一下自己的收获。

1. 总览

平台:Vivado

芯片:XC7A200

FPGA主要有六部分组成:可编程输入输出单元、可编程逻辑单元、完整的时钟管理、嵌入块状RAM、布线资源、内嵌的底层功能单元和内嵌专用硬件模块。其中最为主要的是可编程输出输出单元、可编程逻辑单元和布线资源

放大,这些就是内部资源,主要是逻辑单元和块状RAM及一些内嵌功能单元

再放大,这些逻辑单元的内部结构也出来了,像大型“停车场”

2. 可配置逻辑单元

可配置逻辑单元(Configurable Logic Block,CLB)在FPGA中最为丰富,由两个SLICE组成。由于SLICE有SLICEL(L:Logic)和SLICEM(M:Memory)之分,因此CLB可分为CLBLL和CLBLM两类。

点击内部的逻辑单元,通过阴影区别包含的范围,你可以清晰的看到结构划分的层级。在旁边窗口可以清晰的看到选中部分的属性(Properties)。

来,再放大,放大到一个SLICEL,如下图所示。

SLICEL和SLICEM内部都包含4个6输入查找表(Look-Up-Table,LUT6)、3个数据选择器(MUX)、1个进位链(Carry Chain)和8个触发器(Flip-Flop),下面分部分介绍的时候,时不时可以再回头看这张结构图。

2.1 6输入查找表(LUT6)

虽然SLICEL和SLICEM的结构组成一样,但两者更细化的结构上略有不同,区别在于LUT6上(如下图所示),从而导致LUT6的功能有所不同(如下表格所示)。

LUT功能 SLICEL SLICEM
逻辑函数发生器 v v
ROM v v
分布式RAM v
移位寄存器 v

上边的功能可以看到,不论是SLICEL还是SLICEM,他们的LUT6都可以作为ROM使用,配置为64x1(占用1个LUT6,64代表深度,1代表宽度)、128x1(占用2个LUT6)和256(占用4个LUT6)的ROM。

另外既然SLICEM中的M代表memory的意思,所以增加了更多存储功能。可以配置为RAM,尤其指分布式RAM。其中RAM的写操作为同步,而读操作是异步的,即与时钟信号无关。如果要实现同步读操作,则要额外占用一个触发器,从而增加了意识时钟的延迟(Latency),但提升了系统的性能。这就解释了为什么我们实现RAM同步读写的时候,读出输出要延迟一个clk。一个LUT6可配置64x1的RAM,当RAM的深度大于64时,会占用额外的MUX(F7AMUX,F7BMUX,F8MUX,即一个SLICE中的那3个MUX)。

SLICEM中的LUT还可以配置为移位寄存器,每个LUT6可实现深度为32的移位寄存器,且同一个SLICEM中的LUT6(4个)可级联实现128深度的移位寄存器。

2.2 选择器(MUX)

SLICE中的三个MUX(Multiplexer:F7AMUX,F7BMUX和F8MUX)可以和LUT6联合共同实现更大的MUX。事实上,一个LUT6可实现4选1的MUX。

SLICE中的F7MUX(F7AMUX和F7BMUX)的输入数据来自于相邻的两个LUT6的O6端口。

一个F7MUX和相邻的两个LUT6可实现一个8选1的MUX。因此,一个SLICE可实现2个8选1的MUX。

4个LUT6、F7AMUX、F7BMUX和F8MUX可实现一个16选1的MUX。因此,一个SLICE可实现一个16选1的MUX。

2.3 进位链(Carry Chain)

进位链用于实现加法和减法运行。就是结构图中,中间那个大的部分,可以看到它内部实际还包含4个MUX和4个2输入异或门(XOR)。

异或运算是加法运算中必不可少的运算。

2.4 触发器(Flip-Flop)

每个SLICE中有8个触发器。这个8个触发器可分为两大类:4个只能配置为边沿敏感的D触发器(Flip-Flop)和4个即可配置为边沿敏感的D触发器又可配置为电平敏感的锁存器(Flop&Latch)。当后者被用作锁存器的时候,前者将无法使用。

当这8个触发器都用作D触发器时,他们的控制端口包括使能端CE、置位/复位端口S/R和时钟端口CLK是对应共享的,也就是就是说共用的。{CE,S/R,CLK}称为触发器的控制集。显然,在具体的设计中,控制集种类越少越好,这样可以提高触发器的利用率。那么怎样减少控制集种类呢?我的理解是:

  • 减少时钟种类,即频率越少越好;
  • 统一规范的设计逻辑,如复位。

S/R端口可配置为同步/异步置位或同步/异步复位,且高有效,因此可形成4种D触发器,如下表所示。

原语(Primitive) 功能描述 原语(Primitive) 功能描述
FDCE 同步使能,异步复位 FDRE 同步使能,同步复位
FDPE 同步使能,异步置位 FDSE 同步使能,同步置位

在我们的常规设计中,FDCE和FDPE占了绝大多数。

说到高有效,让我想起了一个大家习以为常,但很少深究的问题:为什么一开始接触FPGA的时候,都告诉我们低电平复位?后来查了一些资料,有说从功耗、噪声可靠性方面考虑等等,但是偶然看到Xilinx和Altera两家芯片的触发器不一样!如下图所示,Xilinx的触发器是高电平复位,而Altera的触发器时低电平复位。所以这也是需要考虑的一点吗?

参考文献:

  1. 《7 Series FPGAs Configurable Logic Block》(UG474)
  2. 《VIVADO从此开始》——高亚军著(强烈推荐此书!!!!本博客论述部分大多来自高老师的书)

FPGA基础学习(7) -- 内部结构之CLB的更多相关文章

  1. FPGA基础学习(8) --内部结构之存储单元

    目录 1. 基本结构 2. BRAM与DRAM的比较 3. BRAM的特点 4. Block Memory的使用 4.1 配置为RAM或ROM 4.2. 配置为FIFO 参考文献: 上一篇中提到了SL ...

  2. FPGA基础学习(3) -- 跨时钟域处理方法

    文章主要是基于学习后的总结. 1. 时钟域 假如设计中所有的触发器都使用一个全局网络,比如FPGA的主时钟输入,那么我们说这个设计只有一个时钟域.假如设计有两个输入时钟,如图1所示,一个时钟给接口1使 ...

  3. FPGA基础学习(9) -- 复位设计

    目录 1. 常见问题 2. 常见的复位方式 3. 合理的复位设计 3.1 复位电平 3.2 异步复位同步化 3.3 恰到好处的复位 4. 补充 4.1 所谓的上电初始化 参考文献 一开始接触到FPGA ...

  4. FPGA基础学习(6) -- 原语

    目录 1. IBUF和IBUFDS(IO) 2. IDDR(Input/Output Functions) 3. IBUFG和IBUFGDS(IO) 原语,即primitive.不同的厂商,原语不同: ...

  5. FPGA基础学习(5) -- 时序约束(实践篇)

    目录 1. 理论回顾 2. 时间裕量 3. 最大延迟和最小延迟 4. 案例分析 参考文献: 距离上一篇有关时序的理论篇已经有一段时间了(可以参考博文FPGA时序约束--理论篇),实际上此段时间,甚至到 ...

  6. FPGA基础学习(4) -- 时序约束(理论篇)

    在FPGA 设计中,很少进行细致全面的时序约束和分析,Fmax是最常见也往往是一个设计唯一的约束.这一方面是由FPGA的特殊结构决定的,另一方面也是由于缺乏好用的工具造成的.好的时序约束可以指导布局布 ...

  7. FPGA基础学习(1) -- FFT IP核(Quartus)

    为了突出重点,仅对I/O数据流为steaming的情况作简要说明,以便快速上手,有关FFT ip核模型及每种设置详细介绍请参考官方手册FFT MegaCore Function User Guide. ...

  8. FPGA基础学习(2) -- FIFO IP核(Quartus)

    ALTERA在LPM(library of parameterized mudules)库中提供了参数可配置的单时钟FIFO(SCFIFO)和双时钟FIFO(DCFIFO).FIFO主要应用在需要数据 ...

  9. FPGA基础知识了解

    FPGA学习的一些误区 FPGA入门必看资源 FPGA百度百科 FPGA基础知识及其工作原理 高端设计工具为少有甚是没有硬件设计技术的工程师和科学家提供现场可编程门阵列(FPGA).无论你使用图形化设 ...

随机推荐

  1. Java 程序员最喜欢的 11 款免费 IDE 编辑器

    Java开发人员需要花费大量的时间埋头于Java代码中,使用各种不同的IDE(Intergrated Development Environment)来开发Java代码,所以下面我将为大家介绍11个不 ...

  2. JS中关于位置和尺寸的api

    HTMLElement.offsetParent 由于offsetTop 和 offsetLeft 都是相对于 offsetParent 内边距边界的,故offsetParent的意义十分重大.off ...

  3. AID-应用标识符的组成规则

    AID:即唯一标识一个应用,分为两部分,RID(5字节)+PIX(最多11字节) RID:注册标识符,由ISO组织来分配,标识一个全球唯一的应用提供商,一般是分配给卡组织,比如分配给Master,比如 ...

  4. 【转载】Mysql中的Btree与Hash索引比较

    转载地址:http://www.jb51.net/article/62533.htm 这篇文章主要介绍了Mysql中的Btree与Hash索引比较,本文起讲解了B-Tree 索引特征.Hash 索引特 ...

  5. Mac上phantomjs装了不能用的解决

    下了,装了.然后整这句命令: phantomjs --version 直接报错.. 查了半天的官方文档,居然连个毛线都么找到.终于...墨迹到了一个方法,就抱着试一试的心态在terminal里输入了这 ...

  6. SourceInsight中 加namespace宏后,无法跳转问题解决

    Option->preferences->languages: C++ language->special, checked Ignore namespace declaration ...

  7. 启动samba服务--ubuntu 14.04

    1. 修改配置文件 /etc/samba/smb.conf文件末尾添加 [homes] comment = Home Directories browseable = yes read only = ...

  8. 编写高质量代码改善C#程序的157个建议——建议66:正确捕获多线程中的异常

    建议66:正确捕获多线程中的异常 多线程的异常处理需要采用特殊的方式.一下这种方式会存在问题: try { Thread t = new Thread((ThreadStart)delegate { ...

  9. 洛谷P4178 Tree (点分治)

    题目描述 给你一棵TREE,以及这棵树上边的距离.问有多少对点它们两者间的距离小于等于K 输入输出格式 输入格式:   N(n<=40000) 接下来n-1行边描述管道,按照题目中写的输入 接下 ...

  10. 微信开发之c#下jssdk签名生成

    参考文章 :微信JS-SDK 权限签名算法 C#版 这篇文章讲解的的比较详细,而且算法准确,但是这篇文章有几个错误的地方需要注意; url必须动态生成 url不能写死,否则就算结果和官方检测的一致,也 ...