KN-charge

FPGA 概述  

  FPGA的出现可以说是划时代的事件。FPGA改变了单板硬件的设计方式,赋予RTL设计极大的灵活性,让ASIC前期物理验证有了保证,让各种高速接口有了载体,让规范协议的变化不再和硬件强相关,等等。

1.1、为什么要学习FPGA

  很多在校的学生对于学单片机、ARM、FPGA、DSP非常困惑,不清楚自己要学习什么。当前学习单片机和ARM的人是最多的,而学习FPGA和DSP的人相对少些;单片机和ARM的市场应用也是最多的,基本上涉及各个领域,而DSP一般应用在算法领域,FPGA一般应用在高性能处理、实时要求高的领域,比如高速接口、报文转发、图像处理、视频传输等,还可以应用在芯片前期验证.

  如果你对算法不是很熟悉,那么可以排除DSP。如果你只是想找个工作,对于是单片机还是FPGA没有要求,那么可以好好学习一下单片机和ARM。当然,对ARM的深人学习也还是比较困难的,特别是要达到操作系统级别。FPGA本身的特性决定了它适合做高速和大容量处理,而且FPGA工程的方案设计相对比较复杂和系统化,所以学习它之后,你的系统观念会更强,几年之后,与做单片机的差异也会越来越大,很可能那时你就是系统工程师了。这也是学习FPGA所能带来的一个好处,当你的系统观念越来越强时,承担的工作也就越来越重要,待遇自然也会越来越好。

学习FPGA还有一个好处就是可以转型做芯片设计.

1.2、学习FPGA的几个疑点

1.2.1、选择VHDL还是 Verilog

  VHDL和 Verilog都是用于数字电子系统设计的硬件描述语言,而且两种语言都是IEEE的标准。

  VHDL诞生于1982年。在1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言。自IEEE公布了VHDL的标准版本IEEE-1076(简称87版)之后,各EDA公司相继推出了自己的VHDL设计环境,或宣布自己的设计工具可以和VHDL接口。此后,VHDL在电子设计领域被广泛接受,并逐步取代了原有的非标准的硬件描述语言。而 Verilog HDL是由GDA( Gateway Design Automation)公司的 Phil Moorby在1983年末首创的,最初只设计了一个仿真与验证工具,之后又陆续开发了相关的故障模拟与时序分析工具。1985年,GDA推出它的第三个商用仿真器 Verilog-XL,获得了巨大的成功,从而 Verilog HDL得到迅速推广应用1989年,CADENCE公司收购了GDA公司,Verilog HDL成为了该公司的独家专利。1990年,CADENCE公司公开发表了Verilog HDL,并成立了LVI组织,以促进Verilog HDL成为IEEE标准,即IEEE Standard1995。

  2001年,IEE发布了Verilog-2001标准。Verilog-2001相对于Verilog1995做了很多有用的改进,给编程人员带来很大的帮助。

  很多初学者对于学习FPGA是使用VHDL还是Verilog没有方向,很多学校目前还是在教VHDL,真是误人子弟。之前,一位初学者学习了一个月的VHDL,然后才问我该学习VHDL还是Verilog。在此特別强调一下,现在基本上所有的芯片和设计都采用 Verilog,本人也经历了几个大型项目,全部采用Verilog,包括ARM的芯片和IP都是采用Verilog,使用VHDL的人非常非常少,只有部分学校还在教学和少数研究所在用。Verilog已经占据了完全主导的地位。

  它们的设计思想都是一样的,为什么还要学习大公司都不用的东西呢?

1.2.2、NIOS重要还是 Verilog重要

  NIOS接入式处理器是 Altera公司推出的采用哈佛结构、具有32位指令集的第二代片上可编程的软核处理器,其最大优势和持点是模块化的硬件结构,以及由此带来的灵活性可裁剪性

  因此很多初学者可能觉得NIOS很重要,但是很道憾地告诉大家,FPGA的主流和优势设计是使用 Verilog。为什么不是NIOS呢?因为NIOS使用C语言开发,需要在FPGA宝贵的逻辑资源内建一个CPU,速度可能还不及一般的ARM芯片。另外,功耗、成本都比ARM高很多,易用性也比ARM差很多。在一些ARM满足不了的场景使用NIOS倒是不错,比如系统需要3个以上串口等多个相关外设,或者单板上已经有大容量的FPGA(FPGA资源不使用也浪费)。

  FPGA为什么还那么流行呢?因为FPGA是逻辑器件,内部都是由可以编程的寄存器、组合逻辑构成,使用硬件语言编程实现,可以一个时钟周期执行一次动作,甚至0个时钟周期都可以执行操作(完全组合逻辑实现),而单片机/ARM需要CPU取指、译码、执行,自然FPGA的速度非常快,这一点是ARM替代不了的。

1.3、FPGA简介

  FPGA( Field-programmable Gate Array),即现场可编程门阵列,它是在PAL(Programmable Array Logic,可编程阵列逻辑)、GAL( Generic Array Logic,通用可编程阵列逻辑)、CPLD( Complex Programmable Logic Device,复杂的可编程逻辑器件)等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点可以说,FPGA是划时代的发明,解决了硬件逻辑可以任意编程而不需要改动硬件的问题,提高了硬件高速处理的能力,同时给ASIC前端验证提供了非常重要的手段。

  图1.1是FPGA的结构原理图,内部包含了很多个物理单元。

  

  下面介绍每个单元的基本概念。

1、可编程输入/输出单元(IOB)

  输入/输出单元简称I/O单元。它们是芯片与外界电路的接口部分,用于完成不同电气特性下对输入/输出信号的驱动与匹配需求。为了使FPGA有更灵活的应用,目前大多数FPGA的I/O单元被设计为可编程模式,即通过软件的灵活配置,可以适配不同的电气标准与I/O物理特性;可以调整匹配阻抗特性,上下拉电阻;可以调整驱动电流的大小等。

  可编程I/O单元支持的电气标准因工艺不同而异,因为不同器件商、不同器件族的FPGA支持的I/O标准不同,当配置为单端模式,例如按键输入、LED驱动等,可以设置为LVCMOS、LVTTL、HSTL、PCI、SSTL电平标准。
当选择差分输入输出模式(2个IO管脚差分输入或输出),可以设置为LVD、Mini_LVDS、RSDS、PPDS、BLVDS,以及差分HSTL和SSTL标准。。值得一提的是,随着ASIC工艺的飞速发展,日前可编程I/O接口支持的最高频率越来越高,一些高端FPGA通过DDR寄存器技术,甚至可以支持高达2Gbit/s的数据速率。 

  以下为7系列FPGA IOB管脚分类图:

  

2、基本可编程逻辑单元(CLB)

  基本可编程逻单元是可编程逻辑的主体,可以根据设计灵活地改变其内部连接与配置,完成不同的逻辑功能。FPGA一般是基于SRAM工艺的,其基本可编程单元几乎都是由查找表和寄存器组成的,FPGA内部查找表一般分为4个输入,查找表完成纯组合逻辑功能。FPGA内部寄存器结构相当灵活,可以配置为带同步/异步复位或置位、时钟使能的触发器,也可以配置成锁存器。FPGA一般依赖寄存器完成同步时序逻辑设计,比较经典的基本可编程逻辑单元的配置是一个寄存器加一个查找表,但是不同的厂商,寄存器与查找表也有一定的差异,而且寄存器与查找表的组合模式也会不同。例如,,Altera可编程逻辑单元通常称为LE( Logic Element),由一个寄存器加一个LUT(Look- Up-Table,显示查找表)构成。 Altera的大多数FPGA将10个LE有机地组合在一起,构成更大的逻辑单元一一逻辑阵列模块( Logic Array Black,LAB)。LAB中除了LE还包含LE之间的进位链、LAB控制信号、局部互连线资源、LUT级联链、寄存器级联链等连线与控制资源。Xilinx可编程逻辑单元称为Slice,由上、下两个部分组成,每个部分都由一个寄存器加一个LUT组成,称LC,两个LC之间有一些公用逻辑,可以完成LC之间的配合与级联。Lattice的底部逻辑单元称为PFU,由8个LUT和8~9个寄存器构成。当然,这些可编程逻辑单元的配置结构随着器件的不断发展也在不断更新,最新的一些可编程逻辑器件常常根据需求设计新的LUT和寄存器的配置比率,并优化其内部的连接构造。

  学习底层配置单元的LUT和寄存器的配置比率,其重要意义在于器件选型和规模估算。很多器件手册上用器件的ASIC门数或等效的系统门数表示器件的规模。但是,由于目前FPGA内部除了基本可编程逻辑单元外,还包含丰富的嵌入式RAM、PL或DL,以及专用的 Hard IP Core(如PCIE、 Serdes硬核)等。这些功能模块也会等效出一定规模的系统门,所以用系统门权衡基本可编程逻辑单元的数量是不准确的,常常让设计者混淆。比较简单而科学的方法是用器件的寄存器或LUT的数量衡量。例如, Xilinx的Spartan系列XC3s1000有15360个LUT,而Lattice的EC系列LFECI5E也有15360个LUT,所以这两教FPGA的可编程逻辑单元数量相当,属于同一规模的产品。 Altera的Cyclone Ⅳ器件族EP4CE6的LUT数量是600个,就比前面提到的两款FPGA规模略小。需要说明的是,器件选型是一个综合性的问题,需要综合考虑设计的需求、成本、规模、速度等级、时钟资源、I/O特性、封装、专用功能模块等诸多因素。

3、嵌入式块RAM

  目前,大多数FPGA都有内嵌的块RAM,FPGA内部嵌入可编程RAM模块,大大地拓展了FPGA的应用范围和使用灵活性。FPGA内嵌的块RAM一般可配置为单端口RAM、双端口RAM、伪双口RAM、内容可寻址存储器( Coment-addsable Memory,CAM)、FIFO等常用存储结构FPGA中其实并没有专用的ROM硬件资源,实现ROM的思路是对RAM赋初值。所谓CAM,也称内容地址存储器,CAM这种存储器在其每个存储单元都包含了一个比较的逻辑,写入CAM的数据会与其内部存储的每一个数据进行比较,并返回与端口数据相同的所有内部数据的地址。概括地讲,RAM是种根据地址读、写数据的存储单元,而CAM返回的是与端口数据相同的所有内部地址。CAM的应用十分广泛,比如在路由器中的交换表等。FIFO是先进先出队列的存储结构。FPGA内部实现的RAM、ROM、CAM、FIFO等存储结构都可以基于嵌入式块RAM单元,并根据需求自动生成相应的粘合逻辑以完成地址和片选等控制逻辑。

  不同器件商或不同器件族的内嵌块RAM,其结构也不同。Xilinx常见的块RAM大小是4Kbit和18Kbit, Lattice常用的块RAM大小是9Kbit.,Altera的块RAM最灵活。一些高端器件内部同时含有3种块RAM结构,分别是M512RAM、M4KRAM、M9KRAM。

  需要补充的一点是,除了块RAM,Xilinx和 Lattice的FPGA还可以灵活地将LUT配置成RAM、ROM、FIFO等存储结构,这种技术称为分布式RAM。根据设计需求,块RAM的数量和配置方式也是器件选型的一个重要标准。

4、丰富的布线资源

  布线资源连通FPGA内部的所有单元,而连线的长度和工艺决定着信号在连线上的驱动能力和传输速度。FPGA芯片内部有着丰富的布线资源,根据工艺、长度宽度和分布位置的不同而划分为4种不同的类别。

  第一类是全局布线资源,用于芯片内部全局时钟和全局复位/置位的布线;

  第二类是长线资源,用于完成芯片Bank间的高速信号和第二全局时钟信号的布线;(百度--芯片Bank介绍:https://zhidao.baidu.com/question/175441299207214684.html,DIMM:新型内存条)

  第三类是短线资源,用于完成基本逻辑单元之间的逻辑互连和布线;

  第四类是分布式的布线资源,用于专有时钟、复位等控制信号线。

  在实际中设计者不需要直接选择布线资源,布局布线器可自动地根据输入网表的拓扑结构和约束条件选择布线资源来连通各个模块单元。从本质上讲,布线资源的使用方法与设计的结果有密切、直接的关系。

5、底层嵌入功能单元

  底层嵌入功能单元的概念比较笼统,本文指的是那些通用程度较高的嵌入式功能模块,比如PLL、DLL、DSP、CPU等。随着FPGA的发展,这些模块被越来越多的嵌入到FPGA的内部,以满足不同场合的需求。

  目前,大多数FPGA厂商都在FPGA内部集成了DLL或者PLL硬件电路于完成时钟的高精度、低抖动的倍频、分频、占空比调整、相移等功能。高端FPGA产品集成的DLL和PLL资源越来越丰富,功能越来越复杂,精度越来越高。 Altera芯片集成的是PLL,Xilinx集成的是DLL,Lattice的新型FPGA同时集成了PLL与DLL以适应不同的需求。Altera芯片的PLL模块分为增强型PLL和快速PLL等,Xilinx芯片的DLL模块名称为 CLKDLL。在高端FPGA中, CLKDLL的增强型模块为DCM。这些时钟模块的生成和配置方法一般分为两种。一种是在HDL代码和原理图中直接例化,另一种是在IP核生成器中配置相关参数,自动生成IP。Altera的IP核生成器叫做 Mega wizard,Xilinx的IP核生成器叫做Core Generator,Lattice的IP核生成器叫做 Module/IP manager。另外,可以通过在综合、实现步骤的约東文件中编写约束属性来完成时钟模块的约束。

  越来越多的高端FPGA产品将包含DSP或CPU等软处理核,从而FPGA将由传统的硬件设计手段逐步过渡到系统级设计平台。例如Atera的Stratix、Stratix Ⅱ、Stratix Ⅳ等器件族内部集成了DSP Core,配合同样的逻辑资源,还可实现ARM、MIPS、NIOS Ⅱ等嵌入式处理系统;Xilinx的Vires Ⅱ和 Virtex Ⅱ pro系列FPGA内部集成了Power PC450的CPU Core和Microblaze RISC处理器Core;Lattice的ECP系列FPGA内部集成了系统DSP Core模块。这些CPU或DSP处理模块的硬件主要由一些加、乘、快速进位链,Pipelining和Mux等结构组成,用逻辑资源和块RAM实现软核部分,组成了功能强大的软运算中心。这种CPU或DSP比较适合实现FIR滤波器、编码解码、FFT等运算密集型应用。FPGA内部嵌入CPU或DSP等处理器,使FPGA在一定程度上具备了实现软硬件联合系统的能力,FPGA正逐步成为SPOC的高效设计平台。 Altera的系统级开发工具有SOPC Buider、DSP Builder,以及专用硬件结构与软硬件协同处理模块等;Xilinx的系统开发工具有EDK和Platform Studio;Lattice的嵌入式DSP开发工具有Matlab的Simulink。

6、内嵌专用硬核
  这里的内嵌专用硬核与前面的底层嵌入单元是有区分的,这里讲的内嵌专用硬核主要指那些通用性相对较弱,不是所有FPGA器件都包含的硬核。我们称FPGA和CPLD为同样逻辑器件,是区别于专用集成电路而言的。其实,FPGA内部也有两个阵营:一方面是通用性强,目标市场范围很广,价格适中的FPGA;另一方面是针对性较强,目标市场明确,价格较高的FPGA。前者主要指低成本FPGA,后者主要面向某些高端通信市场的可编程逻辑器件。

1.4、Verilog简介

1.4.1、端口定义
  模块的端口可以是输入端口、输出端口或双向端口。缺省的端口类型为线网类型(即wire类型)。输入端口默认为wire类型,不需要定义,输出端口或双向端口可声明为wire/reg类型,使用reg必须显式声明,使用wire也强烈建议显式声明。Verilog 2001语法中的端口定义包括端口名、信号的输入/输出、 wire/reg类型、位宽定义,极大地减少了端口声明占用的代码行数。当前 Verilog 2001语法已经非常普及。

  例子:

module LED(

  input sys_clk,

  input sys_rst_n,

  output reg[7:0] LED);

 

该例子包括输入、输出、名称、位宽、输出的信号类型。

1.4.2、信号类型定义
  信号类型主要有wire和reg两种。线网类型用于对结构化器件之间的物理连线的建模。由于线网类型代表的是物理连接线,因此它不存储逻辑值,必须由器件驱动,通常由 assign进行赋值。例如:assign A=B^C;
  reg是最常用的寄存器类型,寄存器类型通常用于对存储单元的描述,如D型触发器、ROM等。当存储器类型的信号在某种触发机制下分配了一个值,在分配下一个值时应保留原值。
  类型定义语法如下:
  reg [msb: lsb) reg1,reg2,...,regN;
  说明
  reg类型的信号不一定是寄存器。Verilog语法规定的Always语向都要使用reg定义,而 Always语向分为带时钟和不带时钟两种。不带时钟的,综合出来就是组合逻辑;带时钟的,综合出来才是寄存器。
1.4.3数字定义
  [size]\'base value
  其中:size定义以位计的常量的位长。
  base为o或O(表示八进制),b或B(表示二进制),d或D(表示十进制),h或H(表示十六进制)之一。
  value是基于base的值的数字序列。值x和z以及十六进制中的a~f不区分大小写。

1.4.4、阻塞赋值和非阻塞值
1、阻塞赋值
  “=”用于阻塞的赋值,凡是在组合逻辑(如在 assign语句中)赋值的请用阻塞赋值。阻塞赋值“=”在 begin和end之间的语句是顺序执行的,属于串行语句。
  一个组合逻辑的例子:
  always @(*) begin
    if (new_vld_after == 1\'b1)
      port_win =new_port_after;
    else if(new_vld_before ==1\'b1)
      port_win =new_port_before;
    else
      port_win =last_sel_port;
  end
注意:
  always语句的敏感变量如果不含有时钟,即 always(*),那么也属于组合逻辑需要使用阻塞赋值。
2、非阻塞赋值
  “<=”用于非阻塞的赋值,凡是在时序逻辑(如在always语句中)赋值的请用非阻塞赋值。非阻塞赋值“<=”,在begin和end之间的语句是并行执行的,属于并行执行语句
  一个时序逻辑的例子:
  always @(posedge sys_clk or negedge sys_rst_n) begin
    if(sys_rst_n == 1\'b0)
      counter <=25\'b0;
    else
      counter <= counter + 25\'b1;
  end
注意:
  时序逻辑值是带有时钟的always块逻辑,只有always带有时钟,这个逻辑才能综合为寄存器。

1.5、FPGA开发流程

 

分类:

技术点:

相关文章: