赞
踩
这应该是笔者的第一篇CSDN博客了,之所以起名叫从1开始学习FPGA,原因在于笔者已经有一定的FPGA基础,并且使用FPGA完成了一些项目。但是基本没有系统成理论的学习FPGA,经常是用到哪看到哪,导致很多之前用过的东西往往经过一段时间就忘了。开始写CSDN博客更多的是当一个笔记使用,并且不断监测自己学习,如果我的文章可以帮助到读者是更好不过的了。如果存在错误还望帮助指出,感激不尽。
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,configurable)、输入输出单元(IOB,IO Bank),内嵌存储器、时钟资源管理器(DCM)、布线资源、其他硬件外设。本文主要讲解了其中最重要的CLB,其他单元待后面使用到的时候在进行细讲
CLB是FPGA最核心的资源。目前市面上主流的FPGA主要是Xilinx和Altera两家为主,虽然名称上可能有些区别,但实际内部结构还是相似的。一般芯片手册中的逻辑资源大都是指的CLB。
以Cyclone Ⅲ这款器件为例子,每个CLB中间包含16个逻辑资源单元(logic element),LE是能实现用户逻辑功能的最小单位。LE内部的基本结构如下图所示:
从图中可以看到,每个LE内部除了大量的逻辑门以外,还包含了一些其他的部分。从左往右看,依次进行介绍。
LUT:查找表,这部分是实现FPGA组合逻辑功能的核心。如图所示的芯片包含了一个四输入的查找表,查找表的功能类似一个四选一选择器。在我们使用FPGA的组合逻辑功能时,FPGA的综合过程会将所有的结果写入LUT中,在实际运行时,实际上是将data1到data4的数据当作并行地址线使用,直接在LUT中找到相应地址对应的数据并输出出来。因此从硬件层面上每个LUT可以当作分布式RAM或者是移位寄存器使用。
同步置位和清除逻辑:根据LAB侧的时钟对时序逻辑进行同步置位及同步清除。
异步清除逻辑:主要处理的是芯片级的复位,没什么需要多说的。
进位链:主要是实现进位操作,协助进行一些计算。
可编程寄存器:一个可编程的寄存器,用于实现时序电路的一些操作
以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存在着一定的差异,进而导致了两者的不同。
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的移位寄存器。
每个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输入异或门。
每个SLICE中含有8个触发器,其中4个只能被配置为边沿触发(FF),另外4个可以被配置为边沿触发或电平触发(FF/L)。当后者被配置为电平触发时,前者将无法使用。当这8个触发器被配置为D触发器时,输入信号包含:CLK(时钟信号),S/R(置位/复位信号,高电平有效),CE(使能信号)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。