从1开始学习FPGA——FPGA的一些基础知识(1)

本文介绍了FPGA开发的基本流程,包括需求分析、模块划分、代码设计与行为仿真、综合优化、时序约束、实现以及板级调试。重点讲解了FPGA的核心组件CLB,比较了AlteraCycloneIII和Xilinx7系列FPGA中CLB的构成和功能。
摘要由CSDN通过智能技术生成

        这应该是笔者的第一篇CSDN博客了,之所以起名叫从1开始学习FPGA,原因在于笔者已经有一定的FPGA基础,并且使用FPGA完成了一些项目。但是基本没有系统成理论的学习FPGA,经常是用到哪看到哪,导致很多之前用过的东西往往经过一段时间就忘了。开始写CSDN博客更多的是当一个笔记使用,并且不断监测自己学习,如果我的文章可以帮助到读者是更好不过的了。如果存在错误还望帮助指出,感激不尽。

一:FPGA的开发流程

1.需求分析及模块划分:任何工程开始都是从需求开始的,这是开发的基础。确定好需求以后,就要进行模块划分。FPGA终归是硬件设计,硬件设计就可以按照一块块进行功能划分,像是接口部分(IIC、SPI),运算部分(FFT、FIR),每一部分都可以按照既定的功能进行单独开发,开始按照功能进行合理的分配划分是较为重要的一件事;

2.代码设计及行为仿真:代码设计好理解,就是按照功能写相应的RTL级代码(Verilog或VHDL),行为仿真则是针对这一部分的RTL级代码进行仿真验证的,不同的FPGA厂家有不同的仿真软件,这个后面讲到仿真再细说;

3.综合优化、综合约束、功能仿真:这里先说一下综合的概念,综合(synthesis)指的是将RTL级的代码转换为基本门电路的过程。也就是说将语言描述的电路逻辑转化成与门、或门、非门、触发器等基本逻辑单元的互连关系。也就是我们常说的门级网表。给个例子(图片来源于知乎罗成)

综合约束则是给综合的时候添加的一些约束条件,这样才可以保证我们生成的基本门电路可以满足我们的设计要求,后面说到的时候再细讲;

功能仿真是针对基本门电路的仿真

3.时序约束、时序仿真、实现:实现(implement)是FPGA设计的下一步,上面提到综合的含义是指将RTL语言转换为门级电路,实现的含义则是指将门级电路进行布局布线的处理,从这一步开始才是真正的下沉到硬件端。FPGA的底层并不是真的一个个与或非门和触发器,而是由一个个可编程逻辑块(CLB)组成的。实现的含义就是告诉FPGA我们应该怎样连接这些CLB,从而实现我们需要的逻辑功能。不同的FPGA芯片、不同的约束条件都会产生不同的布局布线结果。

时序仿真和时序约束则是我认为的FPGA设计过程中第二重要的问题了(第一当然是功能设计,功能都没法实现就不要说别的问题了),具体的设计方法会在后面细讲,这也是我从1开始学习的主要原因。

4.板级调试:就是下载到板子里进行调试,没必要细讲

二:FPGA的内部组成——CLB

        目前市面上常见的FPGA大体上由一下几部分组成:可编程逻辑块(CLB,configurable)、输入输出单元(IOB,IO Bank),内嵌存储器、时钟资源管理器(DCM)、布线资源、其他硬件外设。本文主要讲解了其中最重要的CLB,其他单元待后面使用到的时候在进行细讲

        CLB是FPGA最核心的资源。目前市面上主流的FPGA主要是Xilinx和Altera两家为主,虽然名称上可能有些区别,但实际内部结构还是相似的。一般芯片手册中的逻辑资源大都是指的CLB。

2.1 CLB(Altera)

        以Cyclone Ⅲ这款器件为例子,每个CLB中间包含16个逻辑资源单元(logic element),LE是能实现用户逻辑功能的最小单位。LE内部的基本结构如下图所示:

        从图中可以看到,每个LE内部除了大量的逻辑门以外,还包含了一些其他的部分。从左往右看,依次进行介绍。

 LUT:查找表,这部分是实现FPGA组合逻辑功能的核心。如图所示的芯片包含了一个四输入的查找表,查找表的功能类似一个四选一选择器。在我们使用FPGA的组合逻辑功能时,FPGA的综合过程会将所有的结果写入LUT中,在实际运行时,实际上是将data1到data4的数据当作并行地址线使用,直接在LUT中找到相应地址对应的数据并输出出来。因此从硬件层面上每个LUT可以当作分布式RAM或者是移位寄存器使用。

同步置位和清除逻辑:根据LAB侧的时钟对时序逻辑进行同步置位及同步清除。

异步清除逻辑:主要处理的是芯片级的复位,没什么需要多说的。

进位链:主要是实现进位操作,协助进行一些计算。

可编程寄存器:一个可编程的寄存器,用于实现时序电路的一些操作

2.2 CLB(Xilinx)

        以7系列的FPGA为例子,其组成如下图所示:

可以看到,7系列的CLB分为两种,分别是CLBLL及CLBLM。其中每个CLBLL包含了两个SLICEL,而CLBLM包含了一个SLICEL以及一个SLICEM。无论是SLICEL还是SLICEM,都包含了4个6输入查找表(LUT6)、3个数据选择器(MUX)、1个进位链(Carry Chain)和8个触发器(Flip-Flop),尽管大体上结构是相同的,两者的LUT6存在着一定的差异,进而导致了两者的不同。

2.1.1 LUT6(六输入查找表)

LUT6可以实现一下几部分功能:

1)逻辑函数发生器:从LUT6的结构中可以看出来,任何6输入以下的逻辑运算都可以通过一个LUT6来实现,通过每个slice中的数据选择器进行级联,可以实现更多输入的逻辑函数发生器。

2)ROM:每个LUT6都可以配置为一个64×1的ROM,其中64为深度,1为ROM的宽度,同样结合数据选择器可以将LUT6进行级联,配置为更大深度的ROM。

3)分布式RAM:从上面的查找表功能可以看到,SLICEM可以配置为分布式RAM以及移位寄存器。当配置为分布式RAM的时候,RAM的写操作为同步逻辑,读操作为异步逻辑,如果要实现同步读操作,则需要占用额外的触发器,这样的坏处是多了一个时钟的时延,但是相应的提升了系统的性能。每个LUT可以配置为一个64×1的分布式RAM。

4)移位寄存器:每个LUT6可以被配置为一个深度为32的移位寄存器。

2.1.2 MUX(多路选择器)

        每个SLICE中含有三个MUX,分别称为F7AMUX、F7BMUX、F8MUX,其中,F7AMUX、F7BMUX的输入端为两个LUT,即以LUT的输出作为MUX的输入,F8MUX的输入则是F7AMUX、F7BMUX。因此,每个LUT可以被配置为一个4选1MUX(两个输入作为地址端输入,四个输入端口作为信号端输入),两个LUT配合一个MUX7可以作为一个8选1MUX;4个LUT配合两个MUX7及一个MUX8可以作为一个16选1的MUX使用。

2.1.3 进位链

        进位链用于实现加法以及减法运算,每个进位链中包含了2输入异或门。

2.1.4 触发器

        每个SLICE中含有8个触发器,其中4个只能被配置为边沿触发(FF),另外4个可以被配置为边沿触发或电平触发(FF/L)。当后者被配置为电平触发时,前者将无法使用。当这8个触发器被配置为D触发器时,输入信号包含:CLK(时钟信号),S/R(置位/复位信号,高电平有效),CE(使能信号)。

  • 24
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值