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
 
 
答案是代码 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 个)步骤来实现,每一步的延时变小,在各步间加入寄存器,以暂存中间结果,这样可大大提高整个系统的最高工作频率。 
 
 
设计综合到不同器件的最高工作频率
 
 
流水线设计的关键在于整个设计时序的合理安排,前后级接口间数据流速的匹配。如果前后级流量相等,前级输出直接可作为后级输入,前级流量大于后级时,则需要增加缓存,前级流量小于后级时,则需要通过逻辑复制,串并转换等方式将数据分流,或者前级存储后输出到后级进行处理。
 
流水线的思想:复制了处理模块,用面积换速度。