FPGA工作原理与简介
https://www.zhihu.com/column/c_1117750063287488512
https://github.com/darklife/darkriscv
https://github.com/YosysHQ/picorv32
1、查找表LUT和编程方式
第一部分: 查找表LUT
FPGA是在PAL、GAL、EPLD、CPLD等可编程器件的基础上进一步发展的产物。它是作为ASIC领域中的一种半定制电路而出现的,即解决了定制电路的不足,又克服了原有可编程器件门电路有限的缺点。
由于FPGA需要被反复烧写,它实现组合逻辑的基本结构不可能像ASIC那样通过固定的与非门来完成,而只能采用一种易于反复配置的结构。查找表可以很好 地满足这一要求,目前主流FPGA都采用了基于SRAM工艺的查找表结构,也有一些军品和宇航级FPGA采用Flash或者熔丝与反熔丝工艺的查找表结 构。通过烧写文件改变查找表内容的方法来实现对FPGA的重复配置。
根据数字电路的基本知识可以知道,对于一个n输入的逻辑运算,不管是与或非运算还是异或运算等等,最多只可能存在2n种结果。所以如果事先将相应的结果存放于一个存贮单元,就相当于实现了与非门电路的功能。FPGA的原理也是如此,它通过烧写文件去配置查找表的内容,从而在相同的电路情况下实现了不同的逻辑功能。
查找表(Look-Up-Table)简称为LUT,LUT本质上就是一个RAM。目前FPGA中多使用4输入的LUT,所以每一个LUT可以看成一个有 4位地址线的 的RAM。 当用户通过原理图或HDL语言描述了一个逻辑电路以后,PLD/FPGA开发软件会自动计算逻辑电路的所有可能结果,并把真值表(即结果)事先写入 RAM,这样,每输入一个信号进行逻辑运算就等于输入一个地址进行查表,找出地址对应的内容,然后输出即可。
下面给出一个4与门电路的例子来说明LUT实现逻辑功能的原理。
例1-1:给出一个使用LUT实现4输入与门电路的真值表。
从中可以看到,LUT具有和逻辑电路相同的功能。实际上,LUT具有更快的执行速度和更大的规模。
第二部分: 编程方式
由于基于LUT的FPGA具有很高的集成度,其器件密度从数万门到数千万门不等,可以完成极其复杂的时序与逻辑组合逻辑电路功能,所以适用于高速、高密度 的高端数字逻辑电路设计领域。其组成部分主要有可编程输入/输出单元、基本可编程逻辑单元、内嵌SRAM、丰富的布线资源、底层嵌入功能单元、内嵌专用单 元等,主要设计和生产厂家有Xilinx、Altera、Lattice、Actel、Atmel和QuickLogic等公司,其中最大的是 Xilinx、Altera、Lattice三家。
FPGA是由存放在片内的RAM来设置其工作状态的,因此工作时需要对片内RAM进行编程。用户可根据不同的配置模式,采用不同的编程方式。FPGA有如下几种配置模式:
1、并行模式:并行PROM、Flash配置FPGA;
2、主从模式:一片PROM配置多片FPGA;
3、串行模式:串行PROM配置FPGA;
4、外设模式:将FPGA作为微处理器的外设,由微处理器对其编程。
目前,FPGA市场占有率最高的两大公司Xilinx和Altera生产的FPGA都是基于SRAM工艺的,需要在使用 时外接一个片外存储器以保存程序。上电时,FPGA将外部存储器中的数据读入片内RAM,完成配置后,进入工作状态;掉电后FPGA恢复为白片,内部逻辑 消失。这样FPGA不仅能反复使用,还无需专门的FPGA编程器,只需通用的EPROM、PROM编程器即可。Actel、QuickLogic等公司还 提供反熔丝技术的FPGA,只能下载一次,具有抗辐射、耐高低温、低功耗和速度快等优点,在军品和航空航天领域中应用较多,但这种FPGA不能重复擦写, 开发初期比较麻烦,费用也比较昂贵。Lattice是ISP技术的发明者,在小规模PLD应用上有一定的特色。早期的Xilinx产品一般不涉及军品和宇航级市场,但目前已经有Q Pro-R等多款产品进入该类领域。
2、FPGA芯片结构
目前主流的FPGA仍是基于查找表技术的,已经远远超出了先前版本的基本性能,并且整合了常用功能(如RAM、时钟管理 和DSP)的硬核(ASIC型)模块。如图1-1所示(注:图1-1只是一个示意图,实际上每一个系列的FPGA都有其相应的内部结构),FPGA芯片主 要由6部分完成,分别为:可编程输入输出单元、基本可编程逻辑单元、完整的时钟管理、嵌入块式RAM、丰富的布线资源、内嵌的底层功能单元和内嵌专用硬件 模块。
每个模块的功能如下:
1. 可编程输入输出单元(IOB)
可编程输入/输出单元简称I/O单元,是芯片与外界电路的接口部分,完成不同电气特性下对输入/输出信号的驱动与匹配要求,其示意结构如图1-2所示。 FPGA内的I/O按组分类,每组都能够独立地支持不同的I/O标准。通过软件的灵活配置,可适配不同的电气标准与I/O物理特性,可以调整驱动电流的大 小,可以改变上、下拉电阻。目前,I/O口的频率也越来越高,一些高端的FPGA通过DDR寄存器技术可以支持高达2Gbps的数据速率。
外部输入信号可以通过IOB模块的存储单元输入到FPGA的内部,也可以直接输入FPGA 内部。当外部输入信号经过IOB模块的存储单元输入到FPGA内部时,其保持时间(Hold Time)的要求可以降低,通常默认为0。
为了便于管理和适应多种电器标准,FPGA的IOB被划分为若干个组(bank),每个bank的接口标准由其接口电压VCCO决定,一个bank只能有 一种VCCO,但不同bank的VCCO可以不同。只有相同电气标准的端口才能连接在一起,VCCO电压相同是接口标准的基本条件。
2. 可配置逻辑块(CLB)
CLB是FPGA内的基本逻辑单元。CLB的实际数量和特性会依器件的不同而不同,但是每个CLB都包含一个可配置开关矩阵,此矩阵由4或6个输入、一些 选型电路(多路复用器等)和触发器组成。 开关矩阵是高度灵活的,可以对其进行配置以便处理组合逻辑、移位寄存器或RAM。在Xilinx公司的FPGA器件中,CLB由多个(一般为4个或2个) 相同的Slice和附加逻辑构成,如图1-3所示。每个CLB模块不仅可以用于实现组合逻辑、时序逻辑,还可以配置为分布式RAM和分布式ROM。
Slice是Xilinx公司定义的基本逻辑单位,其内部结构如图1-4所示,一个Slice由两个4输入的函数、进位 逻辑、算术逻辑、存储逻辑和函数复用器组成。算术逻辑包括一个异或门(XORG)和一个专用与门(MULTAND),一个异或门可以使一个Slice实现 2bit全加操作,专用与门用于提高乘法器的效率;进位逻辑由专用进位信号和函数复用器(MUXC)组成,用于实现快速的算术加减法操作;4输入函数发生 器用于实现4输入LUT、分布式RAM或16比特移位寄存器(Virtex-5系列芯片的Slice中的两个输入函数为6输入,可以实现6输入LUT或 64比特移位寄存器);进位逻辑包括两条快速进位链,用于提高CLB模块的处理速度
3. 数字时钟管理模块(DCM)
业内大多数FPGA均提供数字时钟管理(Xilinx的全部FPGA均具有这种特性)。Xilinx推出最先进的FPGA提供数字时钟管理和相位环路锁定。相位环路锁定能够提供精确的时钟综合,且能够降低抖动,并实现过滤功能。
4. 嵌入式块RAM(BRAM)
大多数FPGA都具有内嵌的块RAM,这大大拓展了FPGA的应用范围和灵活性。块RAM可被配置为单端口RAM、双端口RAM、内容地址存储器 (CAM)以及FIFO等常用存储结构。RAM、FIFO是比较普及的概念,在此就不冗述。CAM存储器在其内部的每个存储单元中都有一个比较逻辑,写入 CAM中的数据会和内部的每一个数据进行比较,并返回与端口数据相同的所有数据的地址,因而在路由的地址交换器中有广泛的应用。除了块RAM,还可以将 FPGA中的LUT灵活地配置成RAM、ROM和FIFO等结构。在实际应用中,芯片内部块RAM的数量也是选择芯片的一个重要因素。
例如:单片块RAM的容量为18k比特,即位宽为18比特、深度为1024,可以根据需要改变其位宽和深度,但要满足两个原则:首先,修改后的容量(位宽 深度)不能大于18k比特;其次,位宽最大不能超过36比特。当然,可以将多片块RAM级联起来形成更大的RAM,此时只受限于芯片内块RAM的数量,而 不再受上面两条原则约束
5. 丰富的布线资源
布线资源连通FPGA内部的所有单元,而连线的长度和工艺决定着信号在连线上的驱动能力和传输速度。FPGA芯片内部有着丰富的布线资源,根据工艺、长 度、宽度和分布位置的不同而划分为4类不同的类别。第一类是全局布线资源,用于芯片内部全局时钟和全局复位/置位的布线;第二类是长线资源,用以完成芯片 Bank间的高速信号和第二全局时钟信号的布线;第三类是短线资源,用于完成基本逻辑单元之间的逻辑互连和布线;第四类是分布式的布线资源,用于专有时 钟、复位等控制信号线。
在实际中设计者不需要直接选择布线资源,布局布线器可自动地根据输入逻辑网表的拓扑结构和约束条件选择布线资源来连通各个模块单元。从本质上讲,布线资源的使用方法和设计的结果有密切、直接的关系。
6. 底层内嵌功能单元
内嵌功能模块主要指DLL(Delay Locked Loop)、PLL(Phase Locked Loop)、DSP和CPU等软处理核(Soft Core)。现在越来越丰富的内嵌功能单元,使得单片FPGA成为了系统级的设计工具,使其具备了软硬件联合设计的能力,逐步向SOC平台过渡。
DLL和PLL具有类似的功能,可以完成时钟高精度、低抖动的倍频和分频,以及占空比调整和移相等功能。Xilinx公司生产的芯片上集成了 DLL,Altera公司的芯片集成了PLL,Lattice公司的新型芯片上同时集成了PLL和DLL。PLL 和DLL可以通过IP核生成的工具方便地进行管理和配置。DLL的结构如图1-5所示。
7. 内嵌专用硬核
内嵌专用硬核是相对底层嵌入的软核而言的,指FPGA处理能力强大的硬核(Hard Core),等效于ASIC电路。为了提高FPGA性能,芯片生产商在芯片内部集成了一些专用的硬核。例如:为了提高FPGA的乘法速度,主流的FPGA 中都集成了专用乘法器;为了适用通信总线与接口标准,很多高端的FPGA内部都集成了串并收发器(SERDES),可以达到数十Gbps的收发速度。 Xilinx公司的高端产品不仅集成了Power PC系列CPU,还内嵌了DSP Core模块,其相应的系统级设计工具是EDK和Platform Studio,并依此提出了片上系统(System on Chip)的概念。通过PowerPC、Miroblaze、Picoblaze等平台,能够开发标准的DSP处理器及其相关应用,达到SOC的开发目 的。
(1) 软核
软核在EDA设计领域指的是综合之前的寄存器传输级(RTL)模型;具体在FPGA设计中指的是对电路的硬件语言描述,包括逻辑描述、网表和帮助文档等。 软核只经过功能仿真,需要经过综合以及布局布线才能使用。其优点是灵活性高、可移植性强,允许用户自配置;缺点是对模块的预测性较低,在后续设计中存在发 生错误的可能性,有一定的设计风险。软核是IP核应用最广泛的形式。
(2)固核
固核在EDA设计领域指的是带有平面规划信息的网表;具体在FPGA设计中可以看做带有布局规划的软核,通常以RTL代码和对应具体工艺网表的混合形式提 供。将RTL描述结合具体标准单元库进行综合优化设计,形成门级网表,再通过布局布线工具即可使用。和软核相比,固核的设计灵活性稍差,但在可靠性上有较 大提高。目前,固核也是IP核的主流形式之一。
(3)硬核
硬核在EDA设计领域指经过验证的设计版图;具体在FPGA设计中指布局和工艺固定、经过前端和后端验证的设计,设计人员不能对其修改。不能修改的原因有 两个:首先是系统设计对各个模块的时序要求很严格,不允许打乱已有的物理版图;其次是保护知识产权的要求,不允许设计人员对其有任何改动。IP硬核的不许 修改特点使其复用有一定的困难,因此只能用于某些特定应用,使用范围较窄。
3、比较CPLD和FPGA
一.基于乘积项(Product-Term)的PLD结构
采用这种结构的PLD芯片有:Altera的MAX7000,MAX3000系列(EEPROM工艺),Xilinx的XC9500系列(Flash工艺)和Lattice,Cypress的大部分产品(EEPROM工艺)
我们先看一下这种PLD的总体结构(以MAX7000为例,其他型号的结构与此都非常相似):
图1 基于乘积项的PLD内部结构
这种PLD可分为三块结构:宏单元(Marocell),可编程连线 (PIA)和I/O控制块。 宏单元是PLD的基本结构,由它来实现基本的逻辑功能。图1中兰色部分是多个宏单元的集合(因为宏单元较多,没有一一画出)。可编程连线负责信号传递,连 接所有的宏单元。I/O控制块负责输入输出的电气特性控制,比如可以设定集电极开路输出,摆率控制,三态输出等。 图1 左上的INPUT/GCLK1,INPUT/GCLRn,INPUT/OE1,INPUT/OE2 是全局时钟,清零和输出使能信号,这几个信号有专用连线与PLD中每个宏单元相连,信号到每个宏单元的延时相同并且延时最短。
宏单元的具体结构见下图:
图2 宏单元结构
左侧是乘积项阵列,实际就是一个与或阵列,每一个交叉点都是一个可编程 熔丝,如果导通就是实现“与”逻辑。后面的乘积项选择矩阵是一个“或”阵列。两者一起完成组合逻辑。图右侧是一个可编程D触发器,它的时钟,清零输入都可 以编程选择,可以使用专用的全局清零和全局时钟,也可以使用内部逻辑(乘积项阵列)产生的时钟和清零。如果不需要触发器,也可以将此触发器旁路,信号直接 输给PIA或输出到I/O脚。
二.乘积项结构PLD的逻辑实现原理
下面我们以一个简单的电路为例,具体说明PLD是如何利用以上结构实现逻辑的,电路如下图:
图3
假设组合逻辑的输出(AND3的输出)为f,则f=(A+B)*C*(!D)=A*C*!D + B*C*!D ( 我们以!D表示D的“非”)
PLD将以下面的方式来实现组合逻辑f:
图4
A,B,C,D由PLD芯片的管脚输入后进入可编程连线阵列 (PIA),在内部会产生A,A反,B,B反,C,C反,D,D反8个输出。图中每一个叉表示相连(可编程熔丝导通),所以得到:f= f1 + f2 = (A*C*!D) + (B*C*!D) 。这样组合逻辑就实现了。 图3电路中D触发器的实现比较简单,直接利用宏单元中的可编程D触发器来实现。时钟信号CLK由I/O脚输入后进入芯片内部的全局时钟专用通道,直接连接 到可编程触发器的时钟端。可编程触发器的输出与I/O脚相连,把结果输出到芯片管脚。这样PLD就完成了图3所示电路的功能。(以上这些步骤都是由软件自 动完成的,不需要人为干预)
图3的电路是一个很简单的例子,只需要一个宏单元就可以完成。但对于一个复杂的电路,一个宏单元是不能实现的,这时就需要通过并联扩展项和共享扩展项将多个宏单元相连,宏单元的输出也可以连接到可编程连线阵列,再做为另一个宏单元的输入。这样PLD就可以实现更复杂逻辑。
这种基于乘积项的PLD基本都是由EEPROM和Flash工艺制造的,一上电就可以工作,无需其他芯片配合。
PGA的基本工作原理
FPGA是在PAL、GAL、EPLD、CPLD等可编程器件的基础上进一步发展的产物。它是作为ASIC领域中的一种半定制电路而出现的,即解决了定制电路的不足,又克服了原有可编程器件门电路有限的缺点。
由于FPGA需要被反复烧写,它实现组合逻辑的基本结构不可能像ASIC那样通过固定的与非门来完成,而只能采用一种易于反复配置的结构。查找表可以很好地满足这一要求,目前主流FPGA都采用了基于SRAM工艺的查找表结构,也有一些军品和宇航级FPGA采用Flash或者熔丝与反熔丝工艺的查找表结构。通过烧写文件改变查找表内容的方法来实现对FPGA的重复配置。
根据数字电路的基本知识可以知道,对于一个n输入的逻辑运算,不管是与或非运算还是异或运算等等,最多只可能存在2n种结果。所以如果事先将相应的结果存放于一个存贮单元,就相当于实现了与非门电路的功能。FPGA的原理也是如此,它通过烧写文件去配置查找表的内容,从而在相同的电路情况下实现了不同的逻辑功能。
查找表的原理与结构
查找表(Look-Up-Table)简称为LUT,LUT本质上就是一个RAM。目前FPGA中多使用4输入的LUT,所以每一个LUT可以看成一个有4位地址线的的RAM。当用户通过原理图或HDL语言描述了一个逻辑电路以后,PLD/FPGA开发软件会自动计算逻辑电路的所有可能结果,并把真值表(即结果)事先写入RAM,这样,每输入一个信号进行逻辑运算就等于输入一个地址进行查表,找出地址对应的内容,然后输出即可。
下面给出一个四输入与非门电路的例子来说明LUT实现逻辑功能的原理。
表给出一个使用LUT实现四输入与门电路的真值表。
表 输入与门的真值表
从中可以看到,LUT具有和逻辑电路相同的功能。实际上,LUT具有更快的执行速度和更大的规模。
3.1.2查找表结构的FPGA逻辑实现原理
我们还是以这个电路的为例:
图 四输入与门电路图
A,B,C,D由FPGA芯片的管脚输入后进入可编程连线,然后作为地址线连到到LUT,LUT中已经事先写入了所有可能的逻辑结果,通过地址查找到相应的数据然后输出,这样组合逻辑就实现了。该电路中D触发器是直接利用LUT后面D触发器来实现。时钟信号CLK由I/O脚输入后进入芯片内部的时钟专用通道,直接连接到触发器的时钟端。触发器的输出与I/O脚相连,把结果输出到芯片管脚。这样PLD就完成了图所示电路的功能。(以上这些步骤都是由软件自动完成的,不需要人为干预)
这个电路是一个很简单的例子,只需要一个LUT加上一个触发器就可以完成。对于一个LUT无法完成的的电路,就需要通过进位逻辑将多个单元相连,这样FPGA就可以实现复杂的逻辑。
因为基于LUT的FPGA具有很高的集成度,其器件密度从数万门到数千万门不等,可以完成极其复杂的时序与逻辑组合逻辑电路功能,所以适用于高速、高密度的高端数字逻辑电路设计领域。其组成部分主要有可编程输入/输出单元、基本可编程逻辑单元、内嵌SRAM、丰富的布线资源、底层嵌入功能单元、内嵌专用单元等,主要设计和生产厂家有Xilinx、Altera、Lattice、Actel、Atmel和QuickLogic等公司,其中最大的是Xilinx、Altera、Lattice三家。
4、比较Xilinx和Altera
要比较Xilinx和Altera的FPGA,就要清楚两个大厂FPGA的结构,由于各自设计的不同,两家的FPGA结构各不相同,参数也各不相同,但可以统一到LUT(Look-Up-Table)查找表上。
下图就是A家的Cyclone IV系列片子的参数:
可以看到,A家的片子,用的是LE这个术语。
而下图是X家的Spartan-6 片子资料:
X家用的是CLB这个术语作为基本单元。
再看看两家的基本单元有何不同:
A家的LE如下图:
就是一个4输入LUT+FF构成
而X家的CLB如下:
一个CLB由2个SLICE构成,一个SLICE含有4个6输入LUT,所以LUT=8*CLB。
这样的话,可以较比一下。EP4CE6基本就和XC6SLX9一个级别。。。。当然A家的片子是4输入LUT远比不上X家的6输入LUT。而X家的S-6片子,一个Slice内部有4个lut,8个FF。简而言之,一个Slice=四个LE。要注意的是A家C5以下的片子是4输入LUT而X家的是6输入LUT,差别也较大。如果不考虑FF,那么一个X家的slice=4个A家的LE。例如XC6SLX16含有2278个slices=EP4CE10(9000LE)的样子。当然,S-6的FF多一倍,达到了18224个。
在Virtex-5中(我们的设计大部分是Virtex,V5V6V7),一个Slice包含了4个LUT和4个FF。所以单纯从逻辑资源来看,S-6一个Slice比V-5的Slice强。当然V5的GTPGTX等等还有IO数量是S-6赶不上的。当然,A家的Cyclone V系列的片子,内部和前几代完全不同,采用了从高端的Stratix系列下放的技术.
5、分布式RAM和Block ram
以下分析基于xilinx 7系列
CLB是xilinx基本逻辑单元,每个CLB包含两个slices,每个slices由4个(A,B,C,D)6输入LUT和8个寄存器组成。
同一CLB中的两片slices没有直接的线路连接,分属于两个不同的列。每列拥有独立的快速进位链资源。
slice分为两种类型 SLICEL, SLICEM . SLICEL可用于产生逻辑,算术,ROM。 SLICEM除以上作用外还可配置成分布式RAM或32位的移位寄存器。每个CLB可包含两个SLICEL或者一个SLICEL与一个SLICEM.
7系列的LUT包含6个输入 A1 -A6 , 两个输出 O5 , O6 .
可配置成6输入查找表,O6此时作为输出。或者两个5输入的查找表,A1-A5作为输入 A6拉高,O5,O6作为输出。
一个LUT包含6个输入,逻辑容量为2^6bit,为实现7输入逻辑需要2^7容量,对于更多输入也一样。每个SLICES有4个LUT,256bit容量能够实现最多8bit输入的逻辑。为了实现此功能,每个SLICES还包括3个MUX(多路选择器)
F7AMUX 用于产生7输入的逻辑功能,用于连接A,B两个LUT
F7BMUX 用于产生7输入的逻辑功能, 用于连接C,D两个LUT
F8MUX 用于产生8输入的逻辑功能, 用于连接4个LUT
对于大于8输入的逻辑需要使用多个SLICES, 会增加逻辑实现的延时。
一个SLICES中的4个寄存器可以连接LUT或者MUX的输出,或者被直接旁路不连接任何逻辑资源。寄存器的置位/复位端为高电平有效。只有CLK端能被设置为两个极性,其他输入若要改变电平需要插入逻辑资源。例如低电平复位需要额外的逻辑资源将rst端输入取反。但设为上升/下降沿触发寄存器不会带来额外消耗。
分布式RAM
SLICEM可以配置成分布式RAM,一个SLICEM可以配置成以下容量的RAM
多bit的情况需要增加相应倍数的LUT进行并联。
分布式RAM和 BLOCK RAM的选择遵循以下方法:
1. 小于或等于64bit容量的的都用分布式实现
2. 深度在64~128之间的,若无额外的block可用分布式RAM。 要求异步读取就使用分布式RAM。数据宽度大于16时用block ram.
3. 分布式RAM有比block ram更好的时序性能。 分布式RAM在逻辑资源CLB中。而BLOCK RAM则在专门的存储器列中,会产 生较大的布线延迟,布局也受制约。
移位寄存器(SLICEM)
SLICEM中的LUT能在不使用触发器的情况下设置成32bit的移位寄存器, 4个LUT可级联成128bit的移位寄存器。并且能够进行SLICEM间的级联形成更大规模的移位寄存器。
MUX
一个LUT可配置成4:1MUX.
两个LUT可配置成最多8:1 MUX
四个LUT可配置成16个MUX
同样可以通过连接多个SLICES达成更大规模设计,但是由于SLICE没有直接连线,需要使用布线资源,会增加较大延迟。
进位链
每个SLICE有4bit的进位链。每bit都由一个进位MUX(MUXCY)和一个异或门组成,可在实现加法/减法器时生成进位逻辑。该MUXCY与XOR也可用于产生一般逻辑。
6、FPGA设计方法概论
-
FPGA是可编程芯片,因此FPGA的设计方法包括硬件设计和软件设计两部分。硬件包括FPGA芯片电路、存储器、输入输出接口电路以及其他设备,软件即是相应的HDL程序以及最新才流行的嵌入式C程序。硬件设计是基础,但其方法比较固定,本书将在第4节对其进行详细介绍,本节主要介绍软件的设计方法。
目前微电子技术已经发展到SOC阶段,即集成系统(Integrated System)阶段,相对于集成电路(IC)的设计思想有着革命性的变化。SOC是一个复杂的系统,它将一个完整产品的功能集成在一个芯片上,包括核心处理器、存储单元、硬件加速单元以及众多的外部设备接口等,具有设计周期长、实现成本高等特点,因此其设计方法必然是自顶向下的从系统级到功能模块的软、硬件协同设计,达到软、硬件的无缝结合。
这么庞大的工作量显然超出了单个工程师的能力,因此需要按照层次化、结构化的设计方法来实施。首先由总设计师将整个软件开发任务划分为若干个可操作的模块,并对其接口和资源进行评估,编制出相应的行为或结构模型,再将其分配给下一层的设计师。这就允许多个设计者同时设计一个硬件系统中的不同模块,并为自己所设计的模块负责;然后由上层设计师对下层模块进行功能验证。
自顶向下的设计流程从系统级设计开始,划分为若干个二级单元,然后再把各个二级单元划分为下一层次的基本单元,一直下去,直到能够使用基本模块或者IP核直接实现为止,如图1-6所示。流行的FPGA开发工具都提供了层次化管理,可以有效地梳理错综复杂的层次,能够方便地查看某一层次模块的源代码以修改错误。
图1-6 自顶向下的FPGA设计开发流程
在工程实践中,还存在软件编译时长的问题。由于大型设计包含多个复杂的功能模块,其时序收敛与仿真验证复杂度很高,为了满足时序指标的要求,往往需要反复修改源文件,再对所修改的新版本进行重新编译,直到满足要求为止。这里面存在两个问题:首先,软件编译一次需要长达数小时甚至数周的时间,这是开发所不能容忍的;其次,重新编译和布局布线后结果差异很大,会将已满足时序的电路破坏。因此必须提出一种有效提高设计性能,继承已有结果,便于团队化设计的软件工具。FPGA厂商意识到这类需求,由此开发出了相应的逻辑锁定和增量设计的软件工具。例如,Xilinx公司的解决方案就是PlanAhead。
Planahead 允许高层设计者为不同的模块划分相应FPGA芯片区域,并允许底层设计者在在所给定的区域内独立地进行设计、实现和优化,等各个模块都正确后,再进行设计整合。如果在设计整合中出现错误,单独修改即可,不会影响到其它模块。Planahead将结构化设计方法、团队化合作设计方法以及重用继承设计方法三者完美地结合在一起,有效地提高了设计效率,缩短了设计周期。
不过从其描述可以看出,新型的设计方法对系统顶层设计师有很高的要求。在设计初期,他们不仅要评估每个子模块所消耗的资源,还需要给出相应的时序关系;在设计后期,需要根据底层模块的实现情况完成相应的修订。
典型FPGA开发流程
FPGA的设计流程就是利用EDA开发软件和编程工具对FPGA芯片进行开发的过程。FPGA的开发流程一般如图1-7所示,包括电路设计、设计输入、功能仿真、综合优化、综合后仿真、实现、布线后仿真、板级仿真以及芯片编程与调试等主要步骤。
图1-7 FPGA开发的一般流程
1. 电路设计
在系统设计之前,首先要进行的是方案论证、系统设计和FPGA芯片选择等准备工作。系统工程师根据任务要求,如系统的指标和复杂度,对工作速度和芯片本身的各种资源、成本等方面进行权衡,选择合理的设计方案和合适的器件类型。一般都采用自顶向下的设计方法,把系统分成若干个基本单元,然后再把每个基本单元划分为下一层次的基本单元,一直这样做下去,直到可以直接使用EDA元件库为止。
2. 设计输入
设计输入是将所设计的系统或电路以开发软件要求的某种形式表示出来,并输入给EDA工具的过程。常用的方法有硬件描述语言(HDL)和原理图输入方法等。原理图输入方式是一种最直接的描述方式,在可编程芯片发展的早期应用比较广泛,它将所需的器件从元件库中调出来,画出原理图。这种方法虽然直观并易于仿真,但效率很低,且不易维护,不利于模块构造和重用。更主要的缺点是可移植性差,当芯片升级后,所有的原理图都需要作一定的改动。目前,在实际开发中应用最广的就是HDL语言输入法,利用文本描述设计,可以分为普通HDL和行为HDL。普通HDL有ABEL、CUR等,支持逻辑方程、真值表和状态机等表达方式,主要用于简单的小型设计。而在中大型工程中,主要使用行为HDL,其主流语言是Verilog HDL和VHDL。这两种语言都是美国电气与电子工程师协会(IEEE)的标准,其共同的突出特点有:语言与芯片工艺无关,利于自顶向下设计,便于模块的划分与移植,可移植性好,具有很强的逻辑描述和仿真功能,而且输入效率很高。
3. 功能仿真
功能仿真,也称为前仿真,是在编译之前对用户所设计的电路进行逻辑功能验证,此时的仿真没有延迟信息,仅对初步的功能进行检测。仿真前,要先利用波形编辑器和HDL等建立波形文件和测试向量(即将所关心的输入信号组合成序列),仿真结果将会生成报告文件和输出信号波形,从中便可以观察各个节点信号的变化。如果发现错误,则返回设计修改逻辑设计。常用的工具有Model Tech公司的ModelSim、Sysnopsys公司的VCS和Cadence公司的NC-Verilog以及NC-VHDL等软件。
4. 综合优化
所谓综合就是将较高级抽象层次的描述转化成较低层次的描述。综合优化根据目标与要求优化所生成的逻辑连接,使层次设计平面化,供FPGA布局布线软件进行实现。就目前的层次来看,综合优化(Synthesis)是指将设计输入编译成由与门、或门、非门、RAM、触发器等基本逻辑单元组成的逻辑连接网表,而并非真实的门级电路。真实具体的门级电路需要利用FPGA制造商的布局布线功能,根据综合后生成的标准门级结构网表来产生。为了能转换成标准的门级结构网表,HDL程序的编写必须符合特定综合器所要求的风格。由于门级结构、RTL级的HDL程序的综合是很成熟的技术,所有的综合器都可以支持到这一级别的综合。常用的综合工具有Synplicity公司的Synplify/Synplify Pro软件以及各个FPGA厂家自己推出的综合开发工具。
5. 综合后仿真
综合后仿真检查综合结果是否和原设计一致。在仿真时,把综合生成的标准延时文件反标注到综合仿真模型中去,可估计门延时带来的影响。但这一步骤不能估计线延时,因此和布线后的实际情况还有一定的差距,并不十分准确。目前的综合工具较为成熟,对于一般的设计可以省略这一步,但如果在布局布线后发现电路结构和设计意图不符,则需要回溯到综合后仿真来确认问题之所在。在功能仿真中介绍的软件工具一般都支持综合后仿真。
6. 实现与布局布线
实现是将综合生成的逻辑网表配置到具体的FPGA芯片上,布局布线是其中最重要的过程。布局将逻辑网表中的硬件原语和底层单元合理地配置到芯片内部的固有硬件结构上,并且往往需要在速度最优和面积最优之间作出选择。布线根据布局的拓扑结构,利用芯片内部的各种连线资源,合理正确地连接各个元件。目前,FPGA的结构非常复杂,特别是在有时序约束条件时,需要利用时序驱动的引擎进行布局布线。布线结束后,软件工具会自动生成报告,提供有关设计中各部分资源的使用情况。由于只有FPGA芯片生产商对芯片结构最为了解,所以布局布线必须选择芯片开发商提供的工具。
7. 实现与布局布线
时序仿真,也称为后仿真,是指将布局布线的延时信息反标注到设计网表中来检测有无时序违规(即不满足时序约束条件或器件固有的时序规则,如建立时间、保持时间等)现象。时序仿真包含的延迟信息最全,也最精确,能较好地反映芯片的实际工作情况。由于不同芯片的内部延时不一样,不同的布局布线方案也给延时带来不同的影响。因此在布局布线后,通过对系统和各个模块进行时序仿真,分析其时序关系,估计系统性能,以及检查和消除竞争冒险是非常有必要的。在功能仿真中介绍的软件工具一般都支持综合后仿真。
8. 板级仿真与验证
板级仿真主要应用于高速电路设计中,对高速系统的信号完整性、电磁干扰等特征进行分析,一般都以第三方工具进行仿真和验证。
9. 芯片编程与调试
设计的最后一步就是芯片编程与调试。芯片编程是指产生使用的数据文件(位数据流文件,Bitstream Generation),然后将编程数据下载到FPGA芯片中。其中,芯片编程需要满足一定的条件,如编程电压、编程时序和编程算法等方面。逻辑分析仪(Logic Analyzer,LA)是FPGA设计的主要调试工具,但需要引出大量的测试管脚,且LA价格昂贵。目前,主流的FPGA芯片生产商都提供了内嵌的在线逻辑分析仪(如Xilinx ISE中的ChipScope、Altera QuartusII中的SignalTapII以及SignalProb)来解决上述矛盾,它们只需要占用芯片少量的逻辑资源,具有很高的实用价值。
1.3.3 基于FPGA的SOC设计方法
基于FPGA的SOC设计理念将FPGA可编程的优点带到了SOC领域,其系统由嵌入式处理器内核、DSP单元、大容量处理器、吉比特收发器、混合逻辑、IP以及原有的设计部分组成。相应的FPGA规模大都在百万门以上,适合于许多领域,如电信、计算机等行业。
系统设计方法是SOC常用的方法学,其优势在于,可进行反复修改并对系统架构实现进行验证,??? 包括SOC集成硬件和软件组件之间的接口。不过,目前仍存在很多问题,最大的问题就是没有通用的系统描述语言和系统级综合工具。随着FPGA平台的融入,将 SOC逐步地推向了实用。SOC平台的核心部分是内嵌的处理内核,其硬件是固定的,软件则是可编程的;外围电路则由FPGA的逻辑资源组成,大都以IP 的形式提供,例如存储器接口、USB接口以及以太网MAC层接口等,用户根据自己需要在内核总线上添加,并能自己订制相应的接口IP和外围设备。
基于FPGA的典型SOC开发流程为:
1.芯片内的考虑
从设计生成开始,设计人员需要从硬件/软件协同验证的思路入手,以找出只能在系统集成阶段才会被发现的软、硬件缺陷。然后选择合适的芯片以及开发工具,在综合过程得到优化,随后进行精确的实现,以满足实际需求。由于设计规模越来越大,工作频率也到了数百兆赫兹,布局布线的延迟将变得非常重要。为了确保满足时序,需要在布局布线后进行静态时序分析,对设计进行验证。
2.板级验证
在芯片设计完毕后,需要再进行板级验证,以便在印刷电路板(PCB)上保证与最初设计功能一致。因此,PCB布局以及信号完整性测试应被纳入设计流程。由于芯片内设计所做的任何改变都将反映在下游的设计流程中,各个过程之间的数据接口和管理也必须是无误的。预计SOC系统以及所必须的额外过程将使数据的大小成指数增长,因此,管理各种数据集本身是急剧挑战性的任务
7、DCM时钟管理单元
看Xilinx的Datasheet会注意到Xilinx的FPGA没有PLL,其实DCM就是时钟管理单元。
1、DCM概述
DCM内部是DLL(Delay Lock Loop结构,对时钟偏移量的调节是通过长的延时线形成的。DCM的参数里有一个PHASESHIFT(相移),可以从0变到255。所以我们可以假设内部结构里从输入引脚clkin到输出引脚clk_1x之间应该有256根延时线(实际上,由于对不同频率的时钟都可以从0变到255,延时线的真正数目应该比这个大得多)。DCM总会把输入时钟clkin和反馈时钟CLKFB相比较,如果它们的延时差不等于所设置的PHASESHIFT,DCM就会改变在clkin和clk_1x之间的延时线数目,直到相等为止,输出和输入形成闭环,动态调整到设定值再退出。这个从不等到相等所花的时间,就是输出时钟锁定的时间,相等以后,lock_flag标识才会升高。
当DCM发现clkin和clkfb位相差不等于PHASESHIFT的时候,就去调节clk_1x和clkin之间延时,所以如果clk_1x和clkfb不相关的话,那就永远也不能锁定了。
图一、DCM和BUFG配合使用示意图
2、如何使用DCM
DCM一般和BUFG配合使用,要加上BUFG,应该是为了增强时钟的驱动能力。DCM的一般使用方法是,将其输出clk_1x接在BUFG的输入引脚上,BUFG的输出引脚反馈回来接在DCM的反馈时钟脚CLKFB上。另外,在FPGA里,只有BUFG的输出引脚接在时钟网络上,所以一般来说你可以不使用DCM,但你一定会使用BUFG。有些兄弟总喜欢直接将外部输入的时钟驱动内部的寄存器,其实这个时候虽然你没有明显地例化BUFG,但工具会自动给你加上的。
3、使用DCM可以消除时钟skew
使用DCM可以消除时钟skew。这个东西一直是我以前所没有想清楚的,时钟从DCM输出开始走线到寄存器,这段skew的时间总是存在的,为什么用DCM就可以消除呢?直到有一天忽然豁然开朗,才明白其原委。对高手来说,也许是极为easy的事情,但也许有些朋友并不一定了解,所以写出来和大家共享。
为说明方便起见,我们将BUFG的输出引脚叫做clk_o,从clk_o走全局时钟布线到寄存器时叫做clk_o_reg,从clk_o走线到DCM的反馈引脚CLKFB上时叫clkfb,如图所示。实际上clk_o, clk_o_reg, clkfb全部是用导线连在一起的。
所谓时钟skew,指的就是clk_o到clk_o_reg之间的延时。如果打开FPGA_Editor看底层的结构,就可以发现虽然DCM和BUFG离得很近,但是从clk_o到clkfb却绕了很长一段才走回来,从而导致从clk_o到clk_o_reg和clkfb的延时大致相等。
总之就是clk_o_reg和clkfb的相位应该相等。所以当DCM调节clkin和clkfb的相位相等时,实际上就调节了clkin和clk_o_reg相等。而至于clk_1x和clk_o的相位必然是超前于clkin, clkfb, clk_o_reg的,而clk_1x和clk_o之间的延时就很明显,就是经过那个BUFG的延迟时间。
4、对时钟skew的进一步讨论
最后,说一说时钟skew的概念。时钟skew实际上指的是时钟驱动不同的寄存器时,由于寄存器之间可能会隔得比较远,所以时钟到达不同的寄存器的时间可能会不一样,这个时间差称为时钟skew。这种时钟skew可以通过时钟树来解决,也就是使时钟布线形成一种树状结构,使得时钟到每一个寄存器的距离是一样的。很多FPGA芯片里就布了这样的时钟树结构。也就是说,在这种芯片里,时钟skew基本上是不存在的。
说到这里,似乎有了一个矛盾,既然时钟skew的问题用时钟树就解决了,那么为什么还需要DCM+BUFG来解决这个问题?另外,既然时钟skew指的是时钟驱动不同寄存器之间的延时,那么上面所说的clk_o到clk_o_reg岂非不能称为时钟skew?
先说后一个问题。在一块FPGA内部,时钟skew问题确实已经被FPGA的时钟方案树解决,在这个前提下clk_o到clk_o_reg充其量只能叫做时钟延时,而不能称之为时钟skew。可惜的是FPGA的设计不可能永远只在内部做事情,它必然和外部交换数据。例如从外部传过来一个32位的数据以及随路时钟,数据和随路时钟之间满足建立保持时间关系(Setup Hold time),你如何将这32位的数据接收进来?如果你不使用DCM,直接将clkin接在BUFG的输入引脚上,那么从你的clk_o_reg就必然和clkin之间有个延时,那么你的clk_o_reg还能保持和进来的数据之间的建立保持关系吗?显然不能。相反,如果你采用了DCM,接上反馈时钟,那么clk_o_reg和clkin同相,就可以利用它去锁存进来的数据。可见,DCM+BUFG的方案就是为了解决这个问题。而这个时候clk_o到clk_o_reg的延时,我们可以看到做内部寄存器和其他芯片传过来的数据之间的时钟skew。
由此,我们可以得出一个推论,从晶振出来的时钟作为FPGA的系统时钟时,我们可以不经过DCM,而直接接到BUFG上就可以,因为我们并不在意从clkin到clk_o_reg的这段延时。
8、FPGA时钟系统
1. FPGA的全局时钟是什么?
FPGA的全局时钟应该是从晶振分出来的,最原始的频率。其他需要的各种频率都是在这个基础上利用PLL或者其他分频手段得到的。
2. 全局时钟和BUFG:
BUFG,输入为固定管脚,输出为H型全铜全局高速网络,这样抖动和到任意触发器的延时差最小,这个也就是FPGA做同步设计可以不需要做后仿真的原因。
全局时钟:今天我们从另一个角度来看一下时钟的概念:时钟是D触发器的重要组成部分,一个有效边沿使得D触发器进行一次工作。而更多的时候,D触发器保持住上次的值。对于D触发器来说,可以将输入信号和时钟作比较。也许你会问,这么比较有什么意义。首先看我们比较得出什么东西:
翻转率:R=Dr/Crx100%
就是D触发器改变一次值与时钟有效沿个数的比值。
举例:你写了一个来一个时钟有效沿就取一次反的电路,那么他的翻转率就是100%,翻转率和你的FPGA的功率有很大关系,翻转率越高,FPGA功率越高。
3. 全局时钟不够用是什么意思?
因为全局时钟需要驱动很多模块,所以全局时钟引脚需要有很大的驱动能力,FPGA一般都有一些专门的引脚用于作为全局时钟用,他们的驱动能力比较强。但是如果这些引脚用完了,就只能用一般的引脚了,而他们的驱动能力不强,有可能不能满足你的时序要求。(驱动能力小的,产生的延迟会大一些)
理论上,FPGA的任意一个管脚都可以作为时钟输入端口,但是FPGA专门设计了全局时钟,全局时钟总线是一条专用总线,到达片内各部分触发器的时间最短,所以用全局时钟芯片工作最可靠,但是如果你设计的时候时钟太多,FPGA上的全局时钟管脚用完了就出现不够用的情况。
4. 什么是第二全局时钟?
比如我有一个同步使能信号,连接到FPGA内部80%的资源(但不是时钟),这个时候,你的信号走线到达各个D触发器的延迟差很大,或者翻转率比较大的时候(>40%),这个时候你就需要使用第二全局时钟资源。
第二全局时钟资源的驱动能力和时钟抖动延迟等指标仅次于全局时钟信号。第二全局时钟资源其实是通过片内的高速行列总线来实现的,而不像全局时钟总线是一条专用总线。第二全局时钟总线是通过软件布线得到的,所以硬指标肯定是拼不过全局时钟总线。特别是当你在已经有80%以上的布线率的情况下,可能会出现约束第二全局时钟资源失败的情况。
5. CCLK:
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时通常采用几种时钟类型。时钟可分为如下四种类型:全局时钟、门控时钟、多级逻辑时钟和波动式时钟。多时钟系统能够包括上述四种时钟类型的任意组合。
1.全局时钟
对于一个设计项目来说,全局时钟(或同步时钟)是最简单和最可预测的时钟。在PLD/FPGA设计中最好的时钟方案是:由专用的全局时钟输入引脚驱动的单个主时钟去钟控设计项目中的每一个触发器。只要可能就应尽量在设计项目中采用全局时钟。PLD/FPGA都具有专门的全局时钟引脚,它直接连到器件中的每一个寄存器。这种全局时钟提供器件中最短的时钟到输出的延时。
图1 示出全局时钟的实例。图1 定时波形示出触发器的数据输入D[1..3]应遵守建立时间和保持时间的约束条件。建立和保持时间的数值在PLD数据手册中给出,也可用软件的定时分析器计算出来。如果在应用中不能满足建立和保持时间的要求,则必须用时钟同步输入信号(参看下一章“异步输入”)。
图1 全局时钟
(最好的方法是用全局时钟引脚去钟控PLD内的每一个寄存器,于是数据只要遵守相对时钟的建立时间tsu和保持时间th)
2.门控时钟
在许多应用中,整个设计项目都采用外部的全局时钟是不可能或不实际的。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电路,但却可靠的多)
3.多级逻辑时钟
当产生门控时钟的组合逻辑超过一级(即超过单个的“与”门或“或”门)时,证设计项目的可靠性变得很困难。即使样机或仿真结果没有显示出静态险象,但实际上仍然可能存在着危险。通常,我们不应该用多级组合逻辑去钟控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开发软件都提供多种多样的同步计数器。
图9 行波时钟
图10 行波时钟转换成全局时钟
(这个3位计数器是图9异步计数器的替代电路,它用了同样的3个宏单元,但有更短的时钟到输出的延时)
5. 多时钟系统
许多系统要求在同一个PLD内采用多时钟。最常见的例子是两个异步微处理器器之间的接口,或微处理器和异步通信通道的接口。由于两个时钟信号之间要求一定的建立和保持时间,所以,上述应用引进了附加的定时约束条件。它们也会要求将某些异步信号同步化。
图11 给出一个多时钟系统的实例。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时钟。
-
module orignal(clk,clk5m,clk3m,clk3men,clk5men);
-
input clk;
-
input clk3m;
-
input clk5m;
-
output clk3men;
-
output clk5men;
-
reg clk3mreg1;
-
reg clk5mreg1;
-
reg clk3mreg2;
-
reg clk5mreg2;
-
always @(posedge clk)
-
begin
-
clk3mreg1<=clk3m;
-
clk3mreg2<=clk3mreg1;
-
clk5mreg1<=clk5m;
-
clk5mreg2<=clk5mreg1;
-
end
-
assign clk3men=clk3mreg1&(~clk3mreg2);
-
assign clk5men=clk5mreg1&(~clk5mreg2);
-
endmodule
用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 + Tdpcb + Tp2r + Tsu < latch edge + Tcpcb + Tcl
对于保持时间,有:
Launch edge + Tdpcb + Tr2p < latch edge + Tcpcb + Tcl – Th
关于launch edge和latch edge,对于我们当前的设计,如下图所示。
在对这个FPGA的input接口的时序进行分析和约束之前,我们先来看看Altera官方是如何分析此类管脚的时序。
具体问题具体分析,我们当前的工程,状况和理想模型略有区别。实际上在上面这个模型的源寄存器端的很多信息都不用详细分析,因为我们获得的波形是来自于Sensor芯片的管脚。同理,我们可以得到input delay的计算公式如下。
Input max delay = (0 – Tcpcb_min) + Tco_max + Tdpcb_max
Input min delay = (0 – Tcpcb_max) + Tco_min + Tdpcb_min
在这两个公式中,参数Tco是前面我们还未曾提到的,下面我们就要分析下如何得到这个参数。Tco指的是理想情况下数据在源寄存器被源时钟锁存后,经过多长时间输入到管脚上。前面我们已经得到了PCLK和D[7:0]之间的关系,其实从已知的关系中,我们不难推断出Tco_max和Tco_min,如图所示。若PCLK的时钟周期为Tpclk,则:
Tco_max = Tpclk – Tsu
Tco_min = Th
在我们采样的CMOS Sensor图像中,PCLK频率为12.5MHz,即80ns。因此,我们可以计算到:
Tco_max = 80ns – 15ns = 65ns
Tco_min = 8ns
我们再看看PCB的走线情况,算算余下和PCB走线有关的延时。
如图所示,这是PCLK和D[7:0]在SF-CY3核心板上的走线。
如图所示,这是PCLK和D[7:0]在SF-SENSOR子板上的走线,在这个板子上的走线由匹配电阻分两个部分。
根据前面的走线长度,我们可以换算一下相应的走线延时,如下表所示。因此,我们可以得到,Tcpcb_max = 0.35ns,Tcpcb_min = 0.35ns,Tdpcb_max = 0.36ns,Tdpcb_min = 0.31ns。
信号名 |
SF-CY3走线长度 |
SF-SENSOR走线长度1 |
SF-SENSOR走线长度2 |
总长度(mm) |
延时(ns) |
PCLK |
18 |
27.7 |
6 |
51.7 |
0.346023622 |
VD0 |
16.8 |
24.9 |
9.1 |
50.8 |
0.34 |
VD1 |
19.5 |
26.8 |
6 |
52.3 |
0.35003937 |
VD2 |
16.2 |
25 |
9.1 |
50.3 |
0.336653543 |
VD3 |
18.9 |
27.8 |
6 |
52.7 |
0.352716535 |
VD4 |
15.9 |
24.8 |
9.1 |
49.8 |
0.333307087 |
VD5 |
18.7 |
28.5 |
6 |
53.2 |
0.356062992 |
VD6 |
15.3 |
24.8 |
9.1 |
49.2 |
0.329291339 |
VD7 |
18.7 |
27.8 |
6 |
52.5 |
0.351377953 |
HREF |
14.6 |
23.8 |
9.1 |
47.5 |
0.317913386 |
将上面得到的具体数值都代入公式,得到:
Input max delay = (0 – 0.35ns) + 65ns + 0.36ns = 65.01ns
Input min delay = (0 – 0.35ns) + 8ns + 0.31ns = 7.96ns
加上一些余量,我们可以去input max delay = 66ns,input min delay = 7ns。
下面我们来添加时序约束,打开TimeQuest,点击菜单栏的ContraintsàCreat Clock,做如下设置。
点击ContraintsàSet Maximum Delay,对vdb[0] vdb[1] vdb[2] vdb[3] vdb[4] vdb[5] vdb[6] vdb[7] vhref的set_max_delay做如下设置。
点击ContraintsàSet Minimum Delay,对vdb[0] vdb[1] vdb[2] vdb[3] vdb[4] vdb[5] vdb[6] vdb[7] vhref的set_min_delay做如下设置。
约束完成后,参照前面章节Update Timing Netlist并且Write SDC File…,接着就可以重新编译整个工程,再来看看这个时序分析的报告。在报告中,数据的建立时间有9-13ns的余量,而保持时间也都有7-11ns的余量,可谓余量充足。
另外,我们也可以专门找一条路径出来,看看它的具体时序路径的分析。vd[0]这条数据线的建立时间报告中,66ns的input max delay出现在了Data Arrival Path中。
而在vd[0]的保持时间报告中,7ns的input min delay则出现在了Data Arrival Path中。
10、FPGA的时序基础理论
我们的分析从下图开始,下图是常用的静态分析结构图,一开始看不懂公式不要紧,因为我会在后面给以非常简单的解释:
这两个公式是一个非常全面的,准确的关于建立时间和保持时间的公式。其中Tperiod为时钟周期;Tcko为D触发器开始采样瞬间到D触发器采样的数据开始输出的时间;Tlogic为中间的组合逻辑的延时;Tnet为走线的延时;Tsetup为D触发器的建立时间;Tclk_skew为时钟偏移,偏移的原因是因为时钟到达前后两个D触发器的路线不是一样长。
这里我们来做如下转化:
因为对于有意义的时序约束,建立时间余量Tslack,setup和保持时间余量Thold都要大于0才行,所以对于时序约束的要求其实等价于:
Tperiod>Tcko+Tlogic+Tnet+Tsetup-Tclk_skew (1)
Tcko+Tlogic+Tnet>Thold+Tclk_skew (2)
之前说了,这两个公式是最全面的,而实际上,大部分教材没讲这么深,他们对于一些不那么重要的延时没有考虑,所以就导致不同的教材说法不一。这里,为了得到更加简单的理解,我们按照常规,忽略两项Tnet和Tclk_skew。原因在于Tnet通常太小,而Tclk_skew比较不那么初级。简化后如下:
Tperiod>Tcko+Tlogic+Tsetup (3)
Tcko+Tlogic>Thold (4)
简单多了吧!但是你能看出这两个公式的含义吗?其实(3)式比较好理解,意思是数据从第一个触发器采样时刻传到第二个触发器采样时刻,不能超过一个时钟周期啊!假如数据传输超过一个时钟周期,那么就会导致第二个触发器开始采样的时候,想要的数据还没有传过来呢!那么(4)式又如何理解呢?老实说,一般人一眼看不出来。
我们对于(4)式两边同时加上Tsetup,得到(5):
Tcko+Tlogic+Tsetup>Thold+Tsetup (5)
结合(3)式和(5)式,我们得到如下的式子:
Thold+Tsetup <Tcko+Tlogic+Tsetup< Tperiod (6)
这个式子就是那个可以让我们看出规律的式子。也是可以看出静态时序分析本质的式子。
Tcko+Tlogic+Tsetup是指数据从第一级触发器采样瞬间开始,传输到第二级触发器并被采样的传输延时。我们简称为数据传输延时。下面讲述(6)式两端的含义。
Tcko+Tlogic+Tsetup< Tperiod :约定数据传输延时不能太大,如果太大(超过一个时钟周期),那么第二级触发器就会在采样的时刻发现数据还没有到来。
Thold+Tsetup <Tcko+Tlogic+Tsetup:约定数据传输延时不能太小。这就奇怪了,数据传得太慢大家都知道不好,难道传得太快也不行吗?是的,不行!Thold+Tsetup是一个触发器的采样窗口时间,我们知道,D触发器并不是绝对的瞬间采样,它不可能那么理想。在D触发器采样的瞬间,在这瞬间之前Tsetup时间之内,或者这瞬间之后Thold时间之内,如果输入端口发生变化,那么D触发器就会处于亚稳态。所以采样是有窗口的,我们把Thold+Tsetup的时间宽度叫做触发器的采样窗口,在窗口期内,D触发器是脆弱的,对毛刺没有免疫力的。假如数据传输延时特别小,那么就会发现,当第二级触发器开始采样的时候,第一级触发器的窗口期还没有结束!也就是说,如果这个时候输入端数据有变化,那么不仅第一级触发器处于亚稳态,第二级触发器也将处于亚稳态!
综上,我们就可以知道,数据传输延时既不能太大以至于超过一个时钟周期,也不能太小以至于小于触发器采样窗口的宽度。这就是静态时序分析的终极内涵。有了这个,就不需要再记任何公式了。
11、CPLD、FPGA加载原理
LD一般用JTAG接口进行加载,内部有FLASH和SRAM,CPLD的配置文件可存在在内置的FLASH中,因此下电不会丢失,不需要每次上电的时候,额外对CPLD进行配置结构如下:
方式一:当SRAM为空时(CPLD一次都未加载过或者CPLD内部FLASH存储的配置文件有问题,不能加载到SRAM中),Flash编程进入直接模式,此时CPLD的IO管脚状态由BSCAN registers(边界扫描寄存器)决定,BSCAN registers可以将IO设置成high, low, tristate (default), or current value四种。
方式2:
方式二:当SRAM不为空的时候,Flash 可进行background编程模式.在此模式下,在加载on-chipFlash时,允许CPLD器件仍然维持在用户操作模式下(即CPLD可以正常工作)。
IEEE 1532标准简介IEEE 1532标准是一个基于IEEE 1149.1的在板编程的新标准,标准的名字为IEEE Standard for In-System Configuration of ProgrammableDevices。 在1993年,出现ISP(In-System Programming)的概念和应用。随之产生了应用IEEE1149.1进行ISP的需求。各个厂商提供了类似的不相同的基于JTAG的ISP工具。1996年4月,半导体厂商、ISP工具开发者、ATE开发商正式提出了IEEE 1532标准,旨在为JTAG器件的在板编程提供一系列标准的专门的寄存器和操作指令从而使得在板编程更为容易和高效。IEEE1532完全建立在IEEE1149.1标准之上,在IEEE 1532标准上可以开发通用的编程工具,为测试、编程和系统开发提供规范的接口和器件支持、促进了编程革新,开辟了边界扫描技术新的应用领域。IEEE1532 主要应用在CPLD、FPGA、PROM以及任意的支持IEEE 1532的可编程器件的在板编程。
早期的可编程逻辑器件只有可编程只读存贮器(PROM)、紫外线可按除只读存贮器(EPROM)和电可擦除只读存贮器(EEPROM)三种。由于结构的限制,它们只能完成简单的数字逻辑功能。
其后,出现了一类结构上稍复杂的可编程芯片,即可编程逻辑器件(PLD),它能够完成各种数字逻辑功能。典型的PLD由一个“与”门和一个“或”门阵列组成,而任意一个组合逻辑都可以用“与一或”表达式来描述,所以,PLD能以乘积和的形式完成大量的组合逻辑功能,可以实现速度特性较好的逻辑功能,但其过于简单的结构也使它们只能实现规模较小的电路。
为了弥补这一缺陷,20世纪80年代中期。 Altera和Xilinx分别推出了类似于PAL(可编程阵列逻辑)结构的扩展型 CPLD(ComplexProgrammab1e Logic Dvice)和与标准门阵列类似的FPGA(FieldProgrammable Gate Array),它们都具有体系结构和逻辑单元灵活、集成度高以及适用范围宽等特点。这两种器件兼容了PLD和通用门阵列GAL(Generic Array Logic)的优点,可实现较大规模的电路,编程也很灵活。与门阵列等其它ASIC(ApplicationSpecific IC)相比,它们又具有设计开发周期短、设计制造成本低、开发工具先进、标准产品无需测试、质量稳定以及可实时在线检验等优点,因此被广泛应用于产品的原型设计和产品生产(一般在10,000件以下)之中。几乎所有应用门阵列、PLD和中小规模通用数字集成电路的场合均可应用FPGA和CPLD器件。
12、锁存器、触发器、寄存器和缓冲器的区别
一、锁存器 锁存器(latch)---对脉冲电平敏感,在时钟脉冲的电平作用下改变状态
锁存器是电平触发的存储单元,数据存储的动作取决于输入时钟(或者使能)信号的电平值,仅当锁存器处于使能状态时,输出才会随着数据输入发生变化。
锁存器不同于触发器,它不在锁存数据时,输出端的信号随输入信号变化,就像信号通过一个缓冲器一样;一旦锁存信号起锁存作用,则数据被锁住,输入信号不起作用。锁存器也称为透明锁存器,指的是不锁存时输出对于输入是透明的。
锁存器(latch):我听过的最多的就是它是电平触发的,呵呵。锁存器是电平触发的存储单元,数据存储的动作取决于输入时钟(或者使能)信号的电平值,当锁存器处于使能状态时,输出才会随着数据输入发生变化。(简单地说,它有两个输入,分别是一个有效信号EN,一个输入数据信号DATA_IN,它有一个输出Q,它的功能就是在EN有效的时候把DATA_IN的值传给Q,也就是锁存的过程)。
应用场合:数据有效迟后于时钟信号有效。这意味着时钟信号先到,数据信号后到。在某些运算器电路中有时采用锁存器作为数据暂存器。
缺点:时序分析较困难。
不要锁存器的原因有二:1、锁存器容易产生毛刺,2、锁存器在ASIC设计中应该说比ff要简单,但是在FPGA的资源中,大部分器件没有锁存器这个东西,所以需要用一个逻辑门和ff来组成锁存器,这样就浪费了资源。
优点:面积小。锁存器比FF快,所以用在地址锁存是很合适的,不过一定要保证所有的latch信号源的质量,锁存器在CPU设计中很常见,正是由于它的应用使得CPU的速度比外部IO部件逻辑快许多。latch完成同一个功能所需要的门较触发器要少,所以在asic中用的较多。
二、触发器
触发器(Flip-Flop,简写为 FF),也叫双稳态门,又称双稳态触发器。是一种可以在两种状态下运行的数字逻辑电路。触发器一直保持它们的状态,直到它们收到输入脉冲,又称为触发。当收到输入脉冲时,触发器输出就会根据规则改变状态,然后保持这种状态直到收到另一个触发。
触发器(flip-flops)电路相互关联,从而为使用内存芯片和微处理器的数字集成电路(IC)形成逻辑门。它们可用来存储一比特的数据。该数据可表示音序器的状态、计数器的价值、在计算机内存的ASCII字符或任何其他的信息。
有几种不同类型的触发器(flip-flops)电路具有指示器,如T(切换)、S-R(设置/重置)J-K(也可能称为Jack Kilby)和D(延迟)。典型的触发器包括零个、一个或两个输入信号,以及时钟信号和输出信号。一些触发器还包括一个重置当前输出的明确输入信号。第一个电子触发器是在1919年由W.H.Eccles和F.W.Jordan发明的。
触发器(flip-flop)---对脉冲边沿敏感,其状态只在时钟脉冲的上升沿或下降沿的瞬间改变。
T触发器(Toggle Flip-Flop,or Trigger Flip-Flop)设有一个输入和输出,当时钟频率由0转为1时,如果T和Q不相同时,其输出值会是1。输入端T为1的时候,输出端的状态Q发生反转;输入端T为0的时候,输出端的状态Q保持不变。把JK触发器的J和K输入点连接在一起,即构成一个T触发器。
应用场合:时钟有效迟后于数据有效。这意味着数据信号先建立,时钟信号后建立。在CP上升沿时刻打入到寄存器。
三、寄存器
寄存器(register):用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果,它被广泛的用于各类数字系统和计算机中。其实寄存器就是一种常用的时序逻辑电路,但这种时序逻辑电路只包含存储电路。寄存器的存储电路是由锁存器或触发器构成的,因为一个锁存器或触发器能存储1位二进制数,所以由N个锁存器或触发器可以构成N位寄存器。 工程中的寄存器一般按计算机中字节的位数设计,所以一般有8位寄存器、16位寄存器等。
对寄存器中的触发器只要求它们具有置1、置0的功能即可,因而无论是用同步RS结构触发器,还是用主从结构或边沿触发结构的触发器,都可以组成寄存器。一般由D触发器组成,有公共输入/输出使能控制端和时钟,一般把使能控制端作为寄存器电路的选择信号,把时钟控制端作为数据输入控制信号。
寄存器的应用
1. 可以完成数据的并串、串并转换;
2.可以用做显示数据锁存器:许多设备需要显示计数器的记数值,以8421BCD码记数,以七段显示器显示,如果记数速度较高,人眼则无法辨认迅速变化的显示字符。在计数器和译码器之间加入一个锁存器,控制数据的显示时间是常用的方法。
3.用作缓冲器;
4. 组成计数器:移位寄存器可以组成移位型计数器,如环形或扭环形计数器。
四、移位寄存器
移位寄存器:具有移位功能的寄存器称为移位寄存器。
寄存器只有寄存数据或代码的功能。有时为了处理数据,需要将寄存器中的各位数据在移位控制信号作用下,依次向高位或向低位移动1位。移位寄存器按数码移动方向分类有左移,右移,可控制双向(可逆)移位寄存器;按数据输入端、输出方式分类有串行和并行之分。除了D边沿触发器构成移位寄存器外,还可以用诸如JK等触发器构成移位寄存器。
五、总线收发器/缓冲器
缓冲寄存器:又称缓冲器缓冲器(buffer):多用在总线上,提高驱动能力、隔离前后级,缓冲器多半有三态输出功能。当负载不具有非选通输出为高阻特性时,将起到隔离作用;当总线的驱动能力不够驱动负载时,将起到驱动作用。由于缓冲器接在数据总线上,故必须具有三态输出功能。
它分输入缓冲器和输出缓冲器两种。前者的作用是将外设送来的数据暂时存放,以便处理器将它取走;后者的作用是用来暂时存放处理器送往外设的数据。有了数控缓冲器,就可以使高速工作的CPU与慢速工作的外设起协调和缓冲作用,实现数据传送的同步。
Buffer:缓冲区,一个用于在初速度不同步的设备或者优先级不同的设备之间传输数据的区域。通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据时,速度快的设备的操作进程不发生间断。
缓冲器主要是计算机领域的称呼。具体实现上,缓冲器有用锁存器结构的电路来实现,也有用不带锁存结构的电路来实现。一般来说,当收发数据双方的工作速度匹配时,这里的缓冲器可以用不带锁存结构的电路来实现;而当收发数据双方的工作速度不匹配时,就要用带锁存结构的电路来实现了(否则会出现数据丢失)。
缓冲器在数字系统中用途很多:
(1)如果器件带负载能力有限,可加一级带驱动器的缓冲器;
(2)前后级间逻辑电平不同,可用电平转换器加以匹配;
(3)逻辑极性不同或需要将单性变量转换为互补变量时,加带反相缓冲器;(4)需要将缓变信号变为边沿陡峭信号时,加带施密特电路的缓冲器
(5)数据传输和处理中不同装置间温度和时间不同时,加一级缓冲器进行弥补等等。
六、锁存器与触发器的区别
锁存器和触发器是具有记忆功能的二进制存贮器件,是组成各种时序逻辑电路的基本器件之一。区别为:latch同其所有的输入信号相关,当输入信号变化时latch就变化,没有时钟端;flip-flop受时钟控制,只有在时钟触发时才采样当前的输入,产生输出。当然因为latch和flip-flop二者都是时序逻辑,所以输出不但同当前的输入相关还同上一时间的输出相关。
1、latch由电平触发,非同步控制。在使能信号有效时latch相当于通路,在使能信号无效时latch保持输出状态。DFF由时钟沿触发,同步控制。
2、latch对输入电平敏感,受布线延迟影响较大,很难保证输出没有毛刺产生;DFF则不易产生毛刺。
3、如果使用门电路来搭建latch和DFF,则latch消耗的门资源比DFF要少,这是latch比DFF优越的地方。所以,在ASIC中使用 latch的集成度比DFF高,但在FPGA中正好相反,因为FPGA中没有标准的latch单元,但有DFF单元,一个LATCH需要多个LE才能实现。latch是电平触发,相当于有一个使能端,且在激活之后(在使能电平的时候)相当于导线了,随输出而变化。在非使能状态下是保持原来的信号,这就可以看出和flip-flop的差别,其实很多时候latch是不能代替ff的。
4、latch将静态时序分析变得极为复杂。
5、目前latch只在极高端的电路中使用,如intel 的P4等CPU。 FPGA中有latch单元,寄存器单元就可以配置成latch单元,在xilinx v2p的手册将该单元配置成为register/latch单元,附件是xilinx半个slice的结构图。其它型号和厂家的FPGA没有去查证。——个人认为xilinx是能直接配的而altera或许比较麻烦,要几个LE才行,然而也非xilinx的器件每个slice都可以这样配置,altera的只有DDR接口中有专门的latch单元,一般也只有高速电路中会采用latch的设计。altera的LE是没有latch的结构的,又查了sp3和sp2e,别的不查了,手册上说支持这种配置。有关altera的表述wangdian说的对,altera的ff不能配置成latch,它使用查找表来实现latch。
一般的设计规则是:在绝大多数设计中避免产生latch。它会让您设计的时序完蛋,并且它的隐蔽性很强,非老手不能查出。latch最大的危害在于不能过滤毛刺。这对于下一级电路是极其危险的。所以,只要能用D触发器的地方,就不用latch。
有些地方没有时钟,也只能用latch了。比如现在用一个clk接到latch的使能端(假设是高电平使能),这样需要的setup时间,就是数据在时钟的下降沿之前需要的时间,但是如果是一个DFF,那么setup时间就是在时钟的上升沿需要的时间。这就说明如果数据晚于控制信号的情况下,只能用latch,这种情况就是,前面所提到的latch timing borrow。基本上相当于借了一个高电平时间。也就是说,latch借的时间也是有限的。
在if语句和case不全很容易产生latch,需要注意。VIA题目这两个代码哪个综合更容易产生latch:
代码1
-
always@(enable or ina or inb)
-
if(enable) begin
-
data_out = ina;
-
end
-
else begin
-
data_out = inb;
-
end
-
代码2
-
input[3:0] data_in;
-
always@(data_in)
-
case(data_in)
-
0 : out1 = 1'b1;
-
1,3 : out2 = 1'b1;
-
2,4,5,6,7 : out3 = 1'b1;
-
default: out4 = 1'b1;
-
endcase
答案是代码2在综合时更容易产生latch。
对latch进行STA的分析其实也是可以,但是要对工具相当熟悉才行,不过很容易出错。当前PrimeTime是支持进行latch分析的,现在一些综合工具内置的STA分析功能也支持,比如RTL compiler, Design Compiler。除了ASIC里可以节省资源以外,latch在同步设计里出现的可能还是挺小的,现在处理过程中大都放在ff里打一下。
锁存器电平触发会把输入端的毛刺带入输出;而触发器由于边沿作用可以有效抑制输入端干扰。
在 CMOS 芯片内部经常使用锁存器, 但是在PCB板级结构上, 建议用触发器在时钟边沿上锁存数据。这是因为在锁存器闸门开启期间数据的变化会直接反映到输出端, 所以要注意控制闸门信号的脉冲宽度,而对于触发器,只考虑时钟的边沿。
门电路是构建组合逻辑电路的基础,而锁存器和触发器是构建时序逻辑电路的基础。门电路是由晶体管构成的,锁存器是由门电路构成的,而触发器是由锁存器构成的。也就是晶体管->门电路->锁存器->触发器,前一级是后一级的基础。锁存器和触发器它们的输出都不仅仅取决于目前的输入,而且和之前的输入和输出都有关系。
它们之间的不同在于:锁存器没有时钟信号,而触发器常常有时钟触发信号。
锁存器是异步的,就是说在输入信号改变后,输出信号也随之很快做出改变非常快。而另外一方面,今天许多计算机是同步的,这就意味着所有的时序电路的输出信号随着全局的时钟信号同时做出改变。触发器是一个同步版锁存器。
触发器泛指一类电路结构,它可以由触发信号 (如: 时钟、置位、复位等) 改变输出状态, 并保持这个状态直到下一个或另一个触发信号来到时。触发信号可以用电平或边沿操作,锁存器是触发器的一种应用类型。
七、D触发器和D锁存器的区别
钟控D触发器其实就是D锁存器,边沿D触发器才是真正的D触发器,钟控D触发器在使能情况下输出随输入变化,边沿触发器只有在边沿跳变的情况下输出才变化。
两个锁存器可以构成一个触发器,归根到底还是dff是边沿触发的,而latch是电平触发的。锁存器的输出对输入透明的,输入是什么,输出就是什么,这就是锁存器不稳定的原因,而触发器是由两个锁存器构成的一个主从触发器,输出对输入是不透明的,必须在时钟的上升/下降沿才会将输入体现到输出,所以能够消除输入的毛刺信号。
八、寄存器与锁存器的区别
寄存器与锁存器的功能是提供数据寄存和锁存。
寄存功能是指把数据暂时保存,需要时取出。锁存功能是指总线电路中,锁定数据输出,使输出端不随输入端变化。
13、流水线
流水线设计是经常用于提高所设计系统运行速度的一种有效的方法。
为了保障数据的快速传输,必须使系统运行在尽可能高的频率上,但如果某些复杂逻辑功能的完成需要较长的延时,就会使系统难以运行在高的频率上,在这种情况下,可使用流水线技术,即在长延时的逻辑功能块中插入触发器,使复杂的逻辑操作分步完成,减小每个部分的延时,从而使系统的运行频率得以提高。流水线设计的代价是增加了寄存器逻辑,增加了芯片资源的耗用。
如某个复杂逻辑功能的实现需较长的延时,可将其分解为几个(如3个)步骤来实现,每一步的延时变小,在各步间加入寄存器,以暂存中间结果,这样可大大提高整个系统的最高工作频率。
设计综合到不同器件的最高工作频率
流水线设计的关键在于整个设计时序的合理安排,前后级接口间数据流速的匹配。如果前后级流量相等,前级输出直接可作为后级输入,前级流量大于后级时,则需要增加缓存,前级流量小于后级时,则需要通过逻辑复制,串并转换等方式将数据分流,或者前级存储后输出到后级进行处理。
流水线的思想:复制了处理模块,用面积换速度。
============ End
标签:触发器,FPGA,简介,逻辑,设计,原理,输入,时钟 From: https://www.cnblogs.com/lsgxeva/p/16622730.html