设计fpga可以做什么产品芯片,需要掌握哪些知识?

Array,即现场可编程门阵列。在开始学习FPGA之前,同学们首先应该清楚地了解FPGA的概念,明白FPGA到底是什么东西,可以用来做什么。FPGA是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物,是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。简而言之,FPGA就是一个可以通过编程来改变内部结构的芯片。

直观来说,FPGA就是一个可以“改变”内部结构的芯片,而让这个芯片来实现怎样的功能,就需要通过编程即设计硬件描述语言,经过EDA工具编译、综合、布局布线成后转换为可烧录的文件,最终加载到FPGA器件中去,改变FPGA内部的连线,最终完成所实现的功能。此时的FPGA就可以认为是用来实现具体功能的一个粗糙的芯片。

稍微接触过硬件的人大概都听说过另一种集成电路芯片即单片机,那么FPGA与单片机在结构上有着怎样的差别呢?对于单片机而言,FPGA是一种微处理器,类似于电脑的CPU,一般是基于哈佛总线结构或者冯·诺依曼结构。单片机用途广泛,多用于控制流水线上;FPGA的结构是查找表,它的结构比较复杂,相对应的它可以实现的功能也很强大,一般应用于通信接口设计、数字信号处理等比较高端的场合,而且FPGA还有一个特殊的应用场合,即ASIC的原型验证。

相较于专职专用的ASIC,FPGA工具在开发难度上降低了许多,并且大大缩短了开发周期,而且由于FPGA是可重复编程的,其研发成本与风险也要比ASIC减少许多,更适用于复杂多变的数据中心等应用。

但是FPGA也不是万能的,优势有时候也是劣势。虽然FPGA相比于单片机、CPU等集成电路芯片拥有效率更高、功耗更低的特点,但是易于开发程度远远不如单片机、CPU;在数字芯片设计领域,FPGA虽然相比ASIC具有更短的开发周期与开发难度,但是其存在着成本过高、性能较差并且在资源的利用率上远不及ASIC等问题,不能真正的替代ASIC。』

这段描述非常的接地气且通俗易懂,但从另一个层面来讲,FPGA对于不同的人有不同的意义。FPGA有多种类型,每一种类型具有不同的功能和组合。

二、FPGA的基本结构

FPGA可编程的特性决定了其实现数字逻辑的结构不能像专用ASIC那样通过固定的逻辑门电路来完成,而只能采用一种可以重复配置的结构来实现,而查找表(LUT)可以很好地满足这一要求,目前主流的FPGA芯片仍是基于SRAM工艺的查找表结构。

在任意一款FPGA芯片说明书中可以查看到该器件具体的参数指标,其中包含模块的数量、固定功能逻辑模块(如乘法器)的数目及存储器资源(如嵌入式RAM)的大小。当然仅仅依靠这些结构是构成不了FPGA的基本结构的,在芯片中还有其他众多部分,但是在比较FPGA时,上述结构是最重要的参考指标。在最底层的可配置逻辑模块(如片上的逻辑单元)上,存在着基本的两种部件:触发器和查找表(LUT),而触发器和查找表的组合方式不同,是各个FPGA家族之间区别的重要依据,并且查找表本身的结构也可能各不相同(有4输入或6输入或其他)。

查找表(Look-Up-Table)简称为LUT,其本质上就是一个RAM。目前FPGA内部中多使用4输入的LUT,每一个LUT可以看成一个有4位地址线的RAM。当用户在EDA工具上通过原理图或硬件描述语言设计了一个逻辑电路以后,FPGA开发软件会自动计算逻辑电路的所有可能结果,并把真值表(即结果)事先写入RAM中。这样,每输入一个信号进行逻辑运算就等于输入一个地址进行查找表操作,通过地址找到对应的RAM中的结果,最后将其输出。

以实现数字逻辑Y=A&B&C的功能为例。如果是在专用ASIC中,为了实现该逻辑,逻辑门都已经事先确定好,Y的输出值为两个逻辑与运算后的结果,其基本的实现结构如下图所示:

而在FPGA的结构中若要实现同样的逻辑功能,用户首先在EDA工具中使用硬件描述语言设计出“Y=A&B&C”逻辑代码,EDA工具(QUARTUS或其他开发工具)分析这一行代码,得出A、B、C在不同输入组合下(共8种),Y的值分别是多少,其真值表如下表所示:

然后软件工具将所有的结果写到查找表上,从而实现了该代码的功能。下图就是FPGA的实现基本结构。查找表就类似于一个RAM,输入A、B、C则相当于地址,通过A、B、C的地址就得读到值赋给Y并输出。

三、更为复杂的FPGA架构

1985,赛灵思公司推出了第一块FPGA芯片—XC2064,最初的FPGA包含了8×8=64的逻辑块阵列和85000个晶体管,其门电路不超过1000个,且每个逻辑块由一个四输入的查找表和其它一些简单功能模块构成。FPGA诞生之初由于其容量非常有限,因此只能用来执行一些相对简单的任务,如用来集中一些胶合逻辑或实现基本的状态机。而在22年后,FPGA行业两大巨头Xilinx和Altera公司纷纷推出了采用最新65nm工艺的FPGA产品,其门数量已经达到千万级,晶体管个数更是超过10亿个。在这22年间,FPGA在紧跟半导体工艺进步的同时也推动了半导体的发展进程——2001年采用150nm工艺、2002年采用130nm工艺,2003年采用90nm工艺,2006年采用65nm工艺,而目前最新推出的FPGA产品更是已经使用上10nm工艺。随着技术的发展和工艺节点的进步,FPGA的容量和性能在不断提高的同时,其功耗却不断的优化减少。2006年以前四输入查找表一直被广泛使用,在一些高端器件可能会用上六输入、八输入或更多输入端口的查找表。而一个多输入的查找表又可以分解成较小输入的查找表,即能够分裂成许多更小的功能。例如一个八输入的查找表可以分解成两个四输入的查找表或分解成一个三输入加一个五输入的查找表。在实际的高端器件中,这种可编程构造可以描述相当于百万级(有时甚至千万级)的原始逻辑门。

在FPGA内部,有着“软内核”与“硬内核”之分。比如若利用FPGA的可编程性在芯片内部构造实现了一个计数器逻辑,那么在构造计数器逻辑过程中使用到的功能便可以被称为“软功能”,又称之为软内核。而如果某个功能若是直接利用芯片实现的,则是利用了芯片内部的“硬功能”,一般又称之为硬内核。软内核与硬内核之间优势互补,软内核的优势在于可以在利用芯片资源的基础上利用编程设计让其完成需要实现的任何功能(注意是数字功能,不包括模拟功能)。而硬内核由于是实现固定功能的器件,因此其优势在于资源利用率高且功耗较低,占用硅片的面积也较小,并具有较高的性能。而两者最重要的区别在于:与软内核相比硬内核可用于实现模拟功能,例如锁相环的倍频功能,这个功能需要在模拟电路下实现,所以这一部分是在FPGA内部用硬件来实现的。

四、带嵌入式处理器的FPGA

在上文中提到“软内核”与“硬内核”的概念,而利用FPGA的可编程构造实现的事情之一即为使用其中的一部分数字逻辑资源制作一个或多个软处理器内核,当然,也可以实现不同规模的处理器。举例来说,可以创建一个或多个8位的处理器加上一个或多个16位或32位的软处理器,而所有处理器都在同一器件中。

而如果FPGA供应商希望提供一个占用较少硅片面积、消耗较低功率但性能更高的处理器,解决方案是将其实现为硬内核。如果需要高速、高性能的处理器,并且需要实现逻辑编程时,传统的方法是在电路板上放置处理器(如ARM、DSP等)和FPGA,ARM或者DSP工程师实现软件部分,FPGA工程师实现可编程逻辑部分,两者协同合作。现在最新的方案是使用ZYNQ一个芯片以更低的功耗、更高的速度实现以上功能。在2010年4月硅谷举行的嵌入式系统大会上,发布了可扩展处理平台的架构详情,这款基于无处不在的ARM处理器的SoC可满足复杂嵌入式系统的高性能、低功耗和多核处理能力要求。可扩展处理平台芯片硬件的核心本质就是将通用基础双ARM Corx-A9 MP Core处理器系统作为“主系统”,结合低功耗28nm工艺技术,以实现高度的灵活性、强大的配置功能和高性能。由于该新型器件的可编程逻辑部分基于赛灵思28nm 7系列FPGA,因此该系列产品的名称中添加了“7000”,以保持与7系列FPGA的一致性,同时也方便日后本系列新产品的命名。

考虑下面所示这个例子:

这个芯片完全以硬内核方式实现的双路ARM Cortex-A9微控制器子系统(运行时钟高达1GHz,包含浮点引擎,片上缓存,计数器,定时器等)以及种类广泛的硬内核接口功能(SPI,I2C,CAN等),还有一个硬内核的动态内存控制器,所有这些组件都利用大量传统的可编程构造和大量的通用输入输出(GPIO)引脚进行了性能增强。

如果是ZYNQ单芯片方案,是不是意味着只需要软件工程师或者FPGA工程师独立工作就可以了呢?笔者目前所了解的情况是:FPGA工程师负责搭建周边电路,如ARM的接口、时钟配置等,还负责可编程逻辑部分的开发。而软件部分仍然还是软件工程师负责。其主要原因在于FPGA逻辑开发和软件开发都是专业性比较强的技能,非常少的工程师能同时掌握这两个技能。当然,这里说的掌握性能,是专业性的、能应用到企业项目的技能,只是接触一下的不算。

五、数据存储以及配置方式

在FPGA内部存在着存储单元片内RAM块,数据是存放在RAM中并由其来设置工作状态的,若想要FPGA进行工作,就需要对片内RAM进行编程。而如果外部有大量数据交互时,就要通过增加外设来对数据进行暂时性的存储,如SDRAM存储器或者DDR3存储器,暂存在外设中的数据最终也是要通过FPGA内部的RAM进行存储与处理。当在EDA工具上将程序设计完成之后,便需要将软件上的程序烧录进FPGA内部。通过不同的配置模式,FPGA便会有不同的编程方式。以下为常用的几种配置模式:

2、主从模式:使用一片PROM配置多片FPGA;

3、串行模式:串行PROM配置FPGA;

4、外设模式:将FPGA作为微处理器的外设,由微处理器对其编程。

目前,主流的FPGA都是基于SRAM工艺的,在大部分的FPGA开发板上,使用的都是串行配置模式。由于SRAM掉电就会丢失内部数据,因此往往都会外接一个能够掉电保存数据的片外存储器以保存程序。这样一来,上电时FPGA便将外部存储器中的数据读入片内RAM以完成配置,对FPGA编程完成后便进入工作状态;掉电后FPGA内部SRAM中存储的数据丢失,逻辑清零。以这种方式配置FPGA不仅能反复使用,还无需重复的手动配置。完成一次主动配置之后每次上电便会自动的实现FPGA的内部编程。

六、为什么使用FPGA呢?

计算机应用是多种多样的,最适合于应用的方法也会因应用而异,其中包括现成的微处理器(MPU)和微控制器(MCU)、现成的图形处理单元(GPU)、FPGA和自定义片中系统(SOC)装置。要决定使用哪种方法,需要根据具体的应用需求来综合考虑。

举例来说,在研究诸如5G基站这样的尖端技术时,设计者需要考虑的是,基础标准和协议还在不断地发展。这就是说,设计者需要能够迅速、有效地应对任何超出控制范围的规范变更。

类似地,它们需要能够灵活地对系统部署到现场之后发生的标准和协议变化作出反应。另外,他们还必须能够应对系统功能中出现的意外错误或系统安全漏洞,通过修改已有功能或增加新功能来延长系统寿命。

虽然最好的性能通常由SoC提供,但是这种方法非常昂贵和耗费时间。此外,任何在芯片结构中实现的算法本质上都是“冻结在硅片中”。基于以上考虑,这种固有的不灵敏性便成为一个问题。要寻找性能和灵活性的最佳平衡,就需要另一种途径。这一途径通常由FPGA,微处理器/微控制器和FPGA的结合,或者以硬处理器内核为部分结构的FPGA提供。

FPGA适用于各种不同的应用,随着技术的发展,现在FPGA普遍适用于实现智能接口功能、电机控制、算法加速和高性能计算 (HPC)、图像和视频处理、机器视觉、人工智能、机器学习 (ML)、深度学习 (DL)、雷达、激光波束、基站和通信等领域 。

七、哪些公司生产FPGA?

有两个主要的制造商生产高容量和高性能的器件,分别是。

Intel(收购Altera)和Xilinx覆盖了从低端FPGA到高端SoC FPGA, 在高容量和高性能的器件方面此两家也提供了多种产品。

而Lattice则是几乎完全专注于面向中低端应用的FPGA供应商。

由于FPGA有很多的产品系列,每一个都提供了不同的资源,性能,容量 和封装风格等,所以在项目开始器件选型阶段的工作也是有一定难度的。

八、FPGA的设计流程

language,硬件描述语言)是两种最常用的数字硬件电路描述方法。其中,运用HDL设计方法具有更好的移植性、通用性以及利于模块划分的特点,在工作学习中被广泛使用。典型FPGA的开发流程一般如下图所示,其包括功能定义/器件选型、设计输入、功能仿真、综合优化、综合后仿真、实现、布线后仿真、板级仿真以及芯片编程与调试等主要步骤。

  8、FPGA时钟系统

  1. FPGA的全局时钟是什么?

  FPGA的全局时钟应该是从晶振分出来的,最原始的频率。其他需要的各种频率都是在这个基础上利用PLL或者其他分频手段得到的。

  BUFG,输入为固定管脚,输出为H型全铜全局高速网络,这样抖动和到任意触发器的延时差最小,这个也就是FPGA做同步设计可以不需要做后仿真的原因。

  全局时钟:今天我们从另一个角度来看一下时钟的概念:时钟是D触发器的重要组成部分,一个有效边沿使得D触发器进行一次工作。而更多的时候,D触发器保持住上次的值。对于D触发器来说,可以将输入信号和时钟作比较。也许你会问,这么比较有什么意义。首先看我们比较得出什么东西:

  就是D触发器改变一次值与时钟有效沿个数的比值。

  举例:你写了一个来一个时钟有效沿就取一次反的电路,那么他的翻转率就是100%,翻转率和你的FPGA的功率有很大关系,翻转率越高,FPGA功率越高。

  3. 全局时钟不够用是什么意思?

  因为全局时钟需要驱动很多模块,所以全局时钟引脚需要有很大的驱动能力,FPGA一般都有一些专门的引脚用于作为全局时钟用,他们的驱动能力比较强。但是如果这些引脚用完了,就只能用一般的引脚了,而他们的驱动能力不强,有可能不能满足你的时序要求。(驱动能力小的,产生的延迟会大一些)

  理论上,FPGA的任意一个管脚都可以作为时钟输入端口,但是FPGA专门设计了全局时钟,全局时钟总线是一条专用总线,到达片内各部分触发器的时间最短,所以用全局时钟芯片工作最可靠,但是如果你设计的时候时钟太多,FPGA上的全局时钟管脚用完了就出现不够用的情况。

  4. 什么是第二全局时钟?

  比如我有一个同步使能信号,连接到FPGA内部80%的资源(但不是时钟),这个时候,你的信号走线到达各个D触发器的延迟差很大,或者翻转率比较大的时候(>40%),这个时候你就需要使用第二全局时钟资源。

  第二全局时钟资源的驱动能力和时钟抖动延迟等指标仅次于全局时钟信号。第二全局时钟资源其实是通过片内的高速行列总线来实现的,而不像全局时钟总线是一条专用总线。第二全局时钟总线是通过软件布线得到的,所以硬指标肯定是拼不过全局时钟总线。特别是当你在已经有80%以上的布线率的情况下,可能会出现约束第二全局时钟资源失败的情况。

  CCLK:FPGA同步配置时钟。如果配置模式为主模式,则该时钟由FPGA器件生成,并输出;如果配置模式为从模式,则该时钟由外部提供;

  当所配置的数据存放在PROM中,即通过PROM来配置器件时,必须选择CCLK时钟;

  USER CLOCK:用户定义的配置时钟信号,该配置时钟目前很少采用;

  JTAG CLOCK:JTAG模式的配置时钟,该时钟提供给内部的JTAG控制逻辑。

  默认值为:CCLK

  6. CCLK是怎么产生的:

  CCLK的产生根据配置模式不同而不同,如果设置为Master模式,则由内部的震荡电路产生,作为外部ROM的工作时钟,默认为6MHZ,可通过配置选项设置;如果设置为Slave模式,则由计算机(或其他下载设备)提供,作为芯片内部下载电路的工作时钟;在JTAG模式情况下,CCLK不输出,此时芯片内部下载电路时钟由内部震荡电路提供,TCK仅用作边界扫描相关电路时钟。

  补充:FPGA的主配置模式中,CCLK信号是如何产生的?

  CCLK是由FPGA内部一个晶振电路产生的,同时ISE的软件在生成BIT流文件时,有个CCLK CONFIG选项,这个选项只有在时钟为CCLK时才可以起作用,可以在4-60MHz选择,可以控制CCLK的频率。

  在主从模式配置,配置数据的前60个字节导入FPGA之前,CCLK一直是2.5MHz,接下来由于前60个配置字节的作用,CCLK改为CONFIG设定的频率,直到结束,一般CONFIG默认的频率是4MHz.

  7. FPGA中全局时钟怎么用啊? 是把时钟接到FPGA的全局时钟输入引脚后,就起到全局时钟的作用了,还是在编译时需要制定某个时钟为全局时钟阿?

  其实全局时钟的使用关键在你的代码… 如果你的代码中只用了一个时钟作为所有的或者大部分触发器的时钟,编译器自然会把它编译为全局时钟。当然硬件连接上还是用全局时钟引脚较好,尤其是带PLL的,不是所有的全局时钟脚都能用PLL。

  无沦是用离散逻辑、可编程逻辑,还是用全定制硅器件实现的任何数字设计,为了成功地操作,可靠的时钟是非常关键的。设计不良的时钟在极限的温度、电压或制造工艺的偏差情况下将导致错误的行为,并且调试困难、花销很大。 在设计PLD/FPGA时通常采用几种时钟类型。时钟可分为如下四种类型:全局时钟、门控时钟、多级逻辑时钟和波动式时钟。多时钟系统能够包括上述四种时钟类型的任意组合。

  对于一个设计项目来说,全局时钟(或同步时钟)是最简单和最可预测的时钟。在PLD/FPGA设计中最好的时钟方案是:由专用的全局时钟输入引脚驱动的单个主时钟去钟控设计项目中的每一个触发器。只要可能就应尽量在设计项目中采用全局时钟。PLD/FPGA都具有专门的全局时钟引脚,它直接连到器件中的每一个寄存器。这种全局时钟提供器件中最短的时钟到输出的延时。

  图1 示出全局时钟的实例。图1 定时波形示出触发器的数据输入D[1..3]应遵守建立时间和保持时间的约束条件。建立和保持时间的数值在PLD数据手册中给出,也可用软件的定时分析器计算出来。如果在应用中不能满足建立和保持时间的要求,则必须用时钟同步输入信号(参看下一章“异步输入”)。

  (最好的方法是用全局时钟引脚去钟控PLD内的每一个寄存器,于是数据只要遵守相对时钟的建立时间tsu和保持时间th)

  在许多应用中,整个设计项目都采用外部的全局时钟是不可能或不实际的。PLD具有乘积项逻辑阵列时钟(即时钟是由逻辑产生的),允许任意函数单独地钟控各个触发器。然而,当你用阵列时钟时,应仔细地分析时钟函数,以避免毛刺。

  通常用阵列时钟构成门控时钟。门控时钟常常同微处理器接口有关,用地址线去控制写脉冲。然而,每当用组合函数钟控触发器时,通常都存在着门控时钟。如果符合下述条件,门控时钟可以象全局时钟一样可靠地工作:

  1.驱动时钟的逻辑必须只包含一个“与”门或一个“或”门。如果采用任何附加逻在某些工作状态下,会出现竞争产生的毛刺。

  2.逻辑门的一个输入作为实际的时钟,而该逻辑门的所有其它输入必须当成地址或控制线,它们遵守相对于时钟的建立和保持时间的约束。

  图2和图3 是可靠的门控时钟的实例。在 图2 中,用一个“与”门产生门控时钟,在 图3 中,用一个“或”门产生门控时钟。在这两个实例中,引脚nWR和nWE考虑为时钟引脚,引脚ADD[o..3]是地址引脚,两个触发器的数据是信号D[1..n]经随机逻辑产生的。

  图2 “与”门门控时钟

  图3 “或”门门控时钟

  图2和图3 的波形图显示出有关的建立时间和保持时间的要求。这两个设计项目的地址线必须在时钟保持有效的整个期间内保持稳定(nWR和nWE是低电平有效)。如果地址线在规定的时间内未保持稳定,则在时钟上会出现毛刺,造成触发器发生错误的状态变化。另一方面,数据引脚D[1..n]只要求在nWR和nWE的有效边沿处满足标准的建立和保持时间的规定。

  我们往往可以将门控时钟转换成全局时钟以改善设计项目的可靠性。图4 示出如何用全局时钟重新设计 图2 的电路。地址线在控制D触发器的使能输入,许多PLD设计软件,如MAX+PLUSII软件都提供这种带使能端的D触发器。当ENA为高电平时,D输入端的值被钟控到触发器中:当ENA为低电平时,维持现在的状态。

  图4 “与”门门控时钟转化成全局时钟

  图4 中重新设计的电路的定时波形表明地址线不需要在nWR有效的整个期间内保持稳定;而只要求它们和数据引脚一样符合同样的建立和保持时间,这样对地址线的要求就少很多。

  图 给出一个不可靠的门控时钟的例子。3位同步加法计数器的RCO输出用来钟控触发器。然而,计数器给出的多个输入起到时钟的作用,这违反了可靠门控时钟所需的条件之一。在产生RCO信号的触发器中,没有一个能考虑为实际的时钟线,这是因为所有触发器在几乎相同的时刻发生翻转。而我们并不能保证在PLD/FPGA内部QA,QB,QC到D触发器的布线长短一致,因此,如 图5 的时间波形所示,在器从3计到4时,RCO线上会出现毛刺(假设QC到D触发器的路径较短,即QC的输出先翻转)。

  图5 不可靠的门控时钟

  (定时波形示出在计数器从3到4改变时,RCO信号如何出现毛刺的)

  图6 给出一种可靠的全局钟控的电路,它是图5不可靠计数器电路的改进,RCO控制D触发器的使能输入。这个改进不需要增加PLD的逻辑单元。

  图6 不可靠的门控时钟转换为全局时钟

  (这个电路等效于图5电路,但却可靠的多)

  当产生门控时钟的组合逻辑超过一级(即超过单个的“与”门或“或”门)时,证设计项目的可靠性变得很困难。即使样机或仿真结果没有显示出静态险象,但实际上仍然可能存在着危险。通常,我们不应该用多级组合逻辑去钟控PLD设计中的触发器。

  图7 给出一个含有险象的多级时钟的例子。时钟是由SEL引脚控制的多路选择器输出的。多路选择器的输入是时钟(CLK)和该时钟的2分频(DIV2)。由图7 的定时波形图看出,在两个时钟均为逻辑1的情况下,当SEL线的状态改变时,存在静态险象。险象的程度取决于工作的条件。 多级逻辑的险象是可以去除的。例如,你可以插入“冗余逻辑”到设计项目中。然而,PLD/FPGA编译器在逻辑综合时会去掉这些冗余逻辑,使得验证险象是否真正被去除变得困难了。为此,必须应寻求其它方法来实现电路的功能。

  图7 有静态险象的多级时钟

  图8 给出 图7 电路的一种单级时钟的替代方案。图中SEL引脚和DIV2信号用于使能D触发器的使能输入端,而不是用于该触发器的时钟引脚。采用这个电路并不需要附加PLD的逻辑单元,工作却可靠多了。 不同的系统需要采用不同的方法去除多级时钟,并没有固定的模式。

  图7 无静态险象的多级时钟

  (这个电路逻辑上等效于图7,但却可靠的多)

  4.行波时钟 另一种流行的时钟电路是采用行波时钟,即一个触发器的输出用作另一个触发器的时钟输入。如果仔细地设计,行波时钟可以象全局时钟一样地可靠工作。然而,行波时钟使得与电路有关的定时计算变得很复杂。行波时钟在行波链上各触发器的时钟之间产生较大的时间偏移,并且会超出最坏情况下的建立时间、保持时间和电路中时钟到输出的延时,使系统的实际速度下降。

  用计数翻转型触发器构成异步计数器时常采用行波时钟,一个触发器的输出钟控下一个触发器的输入,参看图9 同步计数器通常是代替异步计数器的更好方案,这是因为两者需要同样多的宏单元而同步计数器有较快的时钟到输出的时间。图10 给出具有全局时钟的同步计数器,它和 图9 功能相同,用了同样多的逻辑单元实现,却有较快的时钟到输出的时间。几乎所有PLD开发软件都提供多种多样的同步计数器。

  图10 行波时钟转换成全局时钟

  (这个3位计数器是图9异步计数器的替代电路,它用了同样的3个宏单元,但有更短的时钟到输出的延时)

  许多系统要求在同一个PLD内采用多时钟。最常见的例子是两个异步微处理器器之间的接口,或微处理器和异步通信通道的接口。由于两个时钟信号之间要求一定的建立和保持时间,所以,上述应用引进了附加的定时约束条件。它们也会要求将某些异步信号同步化。

给出一个多时钟系统的实例。CLK_A用以钟控REG_A,CLK_B用于钟控REG_B,由于REG_A驱动着进入REG_B的组合逻辑,故CLK_A的上升沿相对于CLK_B的上升沿有建立时间和保持时间的要求。由于REG_B不驱动馈到REG_A的逻辑,CLK_B的上升沿相对于CLK_A没有建立时间的要求。此外,由于时钟的下降沿不影响触发器的状态,所以CLK_A和CLK_B的下降沿之间没有时间上的要求。, 如图4,2.II所示,电路中有两个独立的时钟,可是,在它们之间的建立时间和保持时间的要求是不能保证的。在这种情况下,必须将电路同步化。图12 给出REG_A的值(如何在使用前)同CLK_B同步化。新的触发器REG_C由GLK_B触控,保证REG_G的输出符合REG_B的建立时间。然而,这个方法使输出延时了一个时钟周期。

  图ll 多时钟系统

  (定时波形示出CLK_A的上升沿相对于CLK_B的上升沿有建立时间和保持时间的约束条件)

  图12 具有同步寄存器输出的多时钟系统

  (如果CLK_A和CLK_B是相互独立的,则REG—A的输出必须在它馈送到1REG_B之前,用REG_C同步化)

  在许多应用中只将异步信号同步化还是不够的,当系统中有两个或两个以上非同源时钟的时候,数据的建立和保持时间很难得到保证,我们将面临复杂的时间问题。最好的方法是将所有非同源时钟同步化。使用PLD内部的锁项环(PLL或DLL)是一个效果很好的方法,但不是所有PLD都带有PLL、DLL,而且带有PLL功能的芯片大多价格昂贵,所以除非有特殊要求,一般场合可以不使用带PLL的PLD。 这时我们需要使用带使能端的D触发器,并引入一个高频时钟。

  图13 不同源时钟

  如图13所示,系统有两个不同源时钟,一个为3MHz,一个为5MHz,不同的触发器使用不同的时钟。为了系统稳定,我们引入一个20MHz时钟,将3M和5M时钟同步化,如图15所示。 20M的高频时钟将作为系统时钟,输入到所有触发器的的时钟端。3M_EN 和5M_EN将控制所有触发器的使能端。即原来接3M时钟的触发器,接20M时钟,同时3M_EN 将控制该触发器使能 ,原接5M时钟的触发器,也接20M时钟,同时5M_EN 将控制该触发器使能。 这样我们就可以将任何非同源时钟同步化。

  图13 同步化任意非同源时钟

  (一个DFF和后面非门,与门构成时钟上升沿检测电路)

  另外,异步信号输入总是无法满足数据的建立保持时间,容易使系统进入亚稳态,所以也建议设计者把所有异步输入都先经过双触发器进行同步化。

  通过双触发器接口,异步信号输入总是无法满足数据的建立保持时间,所以建议大家把所有异步输入都先经过双触发器进行同步化。如图所示,时钟域clk_s传给时钟域clk_d的数据经过了双触发器的同步处理,相同的,时钟域clk_d经双触发器传给时钟域clk_s的数据

  通过高频时钟同步化,当在单个系统中有两个或两个以上非同源时钟的时候,数据的建立和保持时间很难得到保证,我们将面临复杂的时间问题,最好的方法是将所有非同源时钟同步化:选用一个频率是它们的时钟频率公倍数的高频主时钟将他们进行同步。

  假设系统有两个不同源时钟,一个为3MHz,一个为5MHz,不同的触发器使用不同的时钟。为了系统稳定,假设我们引入一个20MHz时钟。

  用modelsim仿真后得到的时序图如图所示

  9、如何确定时序约束数值

  FPGA工程的功能框图如图所示。上电初始,FPGA需要通过IIC接口协议对摄像头模块进行寄存器初始化配置。这个初始化的基本参数,如初始化地址和数据存储在一个预先配置好的FPGA内嵌ROM中。在初始化配置完成后,摄像头就能够持续输出RGB标准的视频数据流,FPGA通过对其相应的时钟、行频和场频进行检测,从而一帧一帧的实时采集图像数据。

  采集到的视频数据先通过一个FIFO,将原本25MHz频率下同步的数据流转换到100MHz频率下。接着讲这个数据再送入写SDRAM缓存的FIFO中,最终这个FIFO每满160个数据就会将其写入SDRAM的相应地址中。在另一侧,使用另一个异步FIFO将SDRAM缓存的图像数据送个LCD驱动模块。LCD驱动模块不断的读出新的现实图像,并且驱动3.5寸液晶屏工作。

  由于这个工程是移植过来的,SDRAM的时序约束已经添加好并且很好的收敛了。但是,新增加的CMOS sensor的接口也需要做相应的时序约束。下面我们就来探讨下它的时序该如何做约束。

  先看看CMOS Sensor的datasheet中提供的时序波形和相应的建立、保持时间要求。波形如图所示。

  波形中出现的时间参数定义如下表所示。

  我们可以简单分析下这个datasheet中提供的时序波形和参数提供了一些什么样的有用信息。我们重点关注PCLK和D[7:0]的关系,HREF其实也可以归类到D[7:0]中一起分析,他们的时序关系基本是一致的(如果存在偏差,也可以忽略不计)。这个波形实际上表达的是从Sensor的芯片封装管脚上输出的PCLK和D[7:0]的关系。而在理想状况下,经过PCB走线将这组信号连接到其他的芯片上(如CPU或FPGA),若尽可能保持走线长度,在其他芯片的管脚上,PCLK和D[7:0]的关系基本还是不变的。那么,对于采集端来说,用PCLK的上升沿去锁存D[7:0]就变得理所当然了。而对于FPGA而言,从它的管脚到寄存器传输路径上总归是有延时存在的,那么PCLK和D[7:0]之间肯定不会是理想的对齐关系。而我们现在关心的是,相对于理想的对齐关系,PCLK和D[7:0]之间可以存在多大的相位偏差(最终可能会以一个延时时间范围来表示)。在时序图中,Tsu和Th虽然是PCLK和D[7:0]在Sensor内部必须保证的建立时间和保持时间关系,但它同样是Sensor的输出管脚上,必须得到保证的基本时序关系。因此,我们可以认为:理想相位关系情况下,PCLK上升沿之前的Tsu时间(即15ns)到上升沿后的Th时间(即8ns)内,D[7:0]是稳定不变的。同样的,理想情况下,PCLK的上升沿处于D[7:0]两次数据变化的中央。换句话说,在D[7:0]保持当前状态的情况下,PCLK上升沿实际上在理想位置的Tsu时间和Th时间内都是允许的。请大家记住这一点,下面我们需要利用这个信息对在FPGA内部的PCLK和D[7:0]信号进行时序约束。

  OK,明确了PCLK和D[7:0]之间应该保持的关系后,我们再来看看他们从CMOS Sensor的管脚输出后,到最终在FPGA内部的寄存器进行采样锁存,这整个路径上的各种“艰难险阻”(延时)。

  在这个路径分析中,我们不去考虑CMOS Sensor内部的时序关系,我们只关心它的输出管脚上的信号。先看时钟PCLK的路径延时,在PCB上的走线延时为Tcpcb,在FPGA内部,从进入FPGA的管脚到寄存器的时钟输入端口的延时为Tcl。再看数据D[7:0]的延时,在PCB上的走线延时为Tdpcb,在FPGA内部的管脚到寄存器输入端口延时为Tp2r。而FPGA的寄存器同样有建立时间Tsu和保持时间Th要求,也必须在整个路径的传输时序中予以考虑。

  另外,从前面的分析,我们得到了PCLK和D[7:0]之间应该满足的关系。那么,为了保证PCLK和D[7:0]稳定考虑的得到传输,我们可以得到这样一个基本的关系必须满足:

  对于建立时间,有:

  对于保持时间,有:

  关于launch edge和latch edge,对于我们当前的设计,如下图所示。

  在对这个FPGA的input接口的时序进行分析和约束之前,我们先来看看Altera官方是如何分析此类管脚的时序。

  具体问题具体分析,我们当前的工程,状况和理想模型略有区别。实际上在上面这个模型的源寄存器端的很多信息都不用详细分析,因为我们获得的波形是来自于Sensor芯片的管脚。同理,我们可以得到input delay的计算公式如下。

  在这两个公式中,参数Tco是前面我们还未曾提到的,下面我们就要分析下如何得到这个参数。Tco指的是理想情况下数据在源寄存器被源时钟锁存后,经过多长时间输入到管脚上。前面我们已经得到了PCLK和D[7:0]之间的关系,其实从已知的关系中,我们不难推断出Tco_max和Tco_min,如图所示。若PCLK的时钟周期为Tpclk,则:

  在我们采样的CMOS Sensor图像中,PCLK频率为12.5MHz,即80ns。因此,我们可以计算到:

  我们再看看PCB的走线情况,算算余下和PCB走线有关的延时。

  如图所示,这是PCLK和D[7:0]在SF-CY3核心板上的走线。

  如图所示,这是PCLK和D[7:0]在SF-SENSOR子板上的走线,在这个板子上的走线由匹配电阻分两个部分。

  将上面得到的具体数值都代入公式,得到:

  约束完成后,参照前面章节Update Timing Netlist并且Write SDC File…,接着就可以重新编译整个工程,再来看看这个时序分析的报告。在报告中,数据的建立时间有9-13ns的余量,而保持时间也都有7-11ns的余量,可谓余量充足。

  另外,我们也可以专门找一条路径出来,看看它的具体时序路径的分析。vd[0]这条数据线的建立时间报告中,66ns的input max delay出现在了Data Arrival Path中。

  关注《硬件十万个为什么》,发送“FPGA”获取全部内容。

  5)关于和乒乓操作的那点事

  经验告诉我,能使用开发工具自带的,就千万别去自己开发。往往自己开发已有的是吃力不讨好。我曾经做过一个eMMC控制器烧写外部eMMC芯片的案子。

  数据由上位机通过USB传给MCU,然后通过数据总线发到,在内部形成烧写eMMC芯片的时序,烧写外部芯片。框图如下:

  最初的算法是通过数据总线发一个字节,再向芯片打一个字节,一个页的512字节的CRC16需要事先用软件计算好,但是这种方式烧写速度太慢。后来我想到一种方案,先把512个字节传到内部存储起来,并且在FPGA内部计算好16个字节的CRC,然后用高速系统一次性把整页528个字节传给芯片,这种方式烧写速度能提高很多。一开始我想自己设计一个带CRC计算的RAM或者FIFO来存储528个字节的数据,可是无论怎么设计数据传输总是有问题,由于是一个人做,也没人指导,只得放弃这种方案,改用其他。因为我用的Xilinx器件有现成的FIFO核可以调用,于是我就把CRC16的计算和存储512字节数据分开设计,在最后输出到芯片端再选通。因为烧写eMMC一个页,需要有一定的等待POLLING时间,所以我想到了用两组FIFO,乒乓操作,A通道数据发送到芯片并且等待应答的时候,MCU端向B通道发送数据存储,B通道数据发送到芯片并且等待应答的时候,MCU端再向A通道发送数据存储,这样最大化的加速了烧写速度,当然最后的设计结果我也是相当满意的。

  我想通过此例告诉大家的是,尽量用系统的IP核吧,省事又省心,因为这些都是前辈专家们设计出的经典。还有就是利用一些设计技巧,比如乒乓操作,流水线操作可以让你的设计性能优化不少。

  最后简单说一下体会吧,归结起来就多实践、多思考、多问。实践出真知,看100遍别人的方案不如自己去实践一下。实践的动力一方面来自兴趣,一方面来自压力,我个人觉得后者更重要。有需求会容易形成压力,也就是说最好能在实际的项目开发中锻炼,而不是为了学习而学习。在实践的过程中要多思考,多想想问题出现的原因,问题解决后要多问几个为什么,这也是经验积累的过程,如果有写项目日志的习惯更好,把问题及原因、解决的办法都写进去。最后还要多问,遇到问题思索后还得不到解决就要问了,毕竟个人的力量是有限的,问同学同事,问搜索引擎,问网友,都可以,一篇文章、朋友们的点拨都可能帮助自己快速解决问题。


我要回帖

更多关于 fpga可以做什么产品 的文章

 

随机推荐