目录

一、双稳态器件

二、常见的锁存器

2.1 SR锁存器

2.1.1 输入R=0,S=0(保持)

2.1.2 输入S=1,R=0(置位,set)

2.1.3 S=0,R=1(复位,reset)

2.1.4 S=1,R=1(无意义)

2.1.5 SR锁存器 总结

2.2 D锁存器

2.2.1 clk=0(保持)

2.2.2 clk=1(输出=输入)

2.2.3 D锁存器 总结

2.2.4 D锁存器的应用(不懂,待恶补)

三、(D)触发器

3.1 D触发器功能分析

四、锁存器、触发器的异同

4.1 锁存器(latch):

4.2 触发器(FF,flip-flop)

4.3 寄存器(register)

4.4 究竟优劣

4.5 设计原则

4.6 最后一个问题



一、双稳态器件

  双稳态器件是指稳定状态有两种(0 和 1)的器件;双稳态器件是存储器件的基本模块,双稳器件的一种电路结构是:交叉耦合反相器 结构,如图所示:

观察上图,两个反相器连在一起,这就构成了一个双稳态器件;

为什么叫“双稳态”呢?以上图(b)举例分析如下:

  a)由于没有输入,于是我们就假设I1的输出先为1,即Q=1;

b)那么I2的输入为1,Q’就为0,于是反馈给Q的输入,导致Q的输出为1,也就是使得Q的状态稳定为1,因此这个器件有一个稳定的状态为1。如下图所示:

c)我们再假设I1的输出先为0,即Q=0;

d)那么I2的输入为0,Q’就为1,于是反馈给Q的输入,导致Q的输出为0,也就是使得Q的状态稳定为0,因此这个器件还有一个稳定的状态为0。如下图所示:

由此可见,这种交叉耦合反相器的器件是双稳态器件。

  注:为什么介绍双稳态器件呢?那是因为锁存器、寄存器都是双稳态器件,它们都有两个稳定状态1和0。正是因为它们有两个稳定的状态,因此才可以拿它们来存储数据,也就是说双稳态电路(比如交叉耦合反相器、锁存器和寄存器)可以存储数据。下面我们就来看看锁存器和寄存器吧。

二、常见的锁存器

  很显然,上面的那种交叉耦合反相器没有输入,存储不了输入的数据,因此就需要带输入的类似“交叉耦合反相器”结构的双稳态电路,锁存器应运而生了,最常见最基本的锁存器是S-R锁存器,然后常见常用的锁存器是D锁存器,下面看看他们的结构和工作原理。

2.1 SR锁存器

  在数字电路里面,SR锁存器是最简单的时序单元,它由一对交叉耦合的或非门构成,主要功能是通过输入的S、R端分别控制Q进行置位(set)和复位(reset),如下所示:

  SR锁存电路在正常情况下,输入RS的组合有4种可能,即00、01、10和11(注:二输入或非门的功能是,只要有一个输入为1,输出就为了0),下面看看这4种输入对输出Q的影响:

2.1.1 输入R=0,S=0(保持)

  1. 对于或非门N1,输入是0和Q’,由于Q’不知道是0还是1,因此Q的输出不能确定;

  2. 对于或非门N2,输入是0和Q,由于不知道Q的值,因此Q’也不能确定...这就无限循环下去了。

于是我们像交叉耦合反相器那样进行输出假设:

  A.假设原来的状态Q=0,对应的Q’=1;

  • 那么N2的输入就是0和0,输出Q’=1,这样子就巩固了原来的状态Q’=1;
  • Q’=1,对于N1,输入就是0和1,输出Q=0,也巩固了原来的状态,也就是与原来的假设(Q=0,Q’=1)一致。
  • 所以这个状态可以稳定下来,也就是当输入SR=00时,输出Q=1,Q’=0是可以存在的,如下图所示:

B,假设原来的状态Q=1,对应的Q’=0;

  • 那么N2的输入就是0和1,输出Q’=0,这样子就巩固了原来的状态Q’=0;
  • Q’=0,对于N1,输入就是0和0,输出Q=1,也巩固了原来的状态,也就是与原来的假设(Q=1,Q’=0)一致。
  • 所以这个状态可以稳定下来,也就是当输入SR=00时,输出Q=0,Q’=1也是可以存在的,如下图所示:

由此可见,输入SR=00时,只要原来的状态一定了,输出也就是原来的状态。

即SR=00时,保持原状态。

2.1.2 输入S=1,R=0(置位,set)

  • 根据或非门的功能,由于S=1,N2的输出Q’= 0;
  • 于是N1的输入就是00,输出Q就等于1;
  • 然后Q=1反馈回N2的输入,让N2的输出稳定为0,从而让Q的输出稳定为1;

即SR=10时,输出Q=1,称为置位(set)功能。

(这里我们看一下,在SR=10时,S的信号稳定多久输出Q和Q’才稳定下来:S=1到来,首先经过N2的门延时t1,然后是Q’反馈回N1的线延时t2,接着是N1的门延时t3,再然后是Q反馈回N2的门延时t4,也就是有2个门延时和两个线延时,这是对于Q’的;对于Q还有增加一个N2门延时和一个Q’反馈回N1输入的线延时)。

2.1.3 S=0,R=1(复位,reset)

这种情况分析方法跟2.1.2类似;即SR=01时,输出Q=0,称为复位(reset)功能。

2.1.4 S=1,R=1(无意义)

根据或非门的功能知道,输出Q=0,Q’=0。很显然这时候Q=Q’了,这跟我们给输出取值的字面意义是相反的,我们把这种状态称为错误输出,这是要注意的。这里需要说明的是,S和R都有效是没有意义的,锁存器不能同时被复位和置位,这样会引起输出都是0的混乱电路反应。

2.1.5 SR锁存器 总结

通过上面的分析,我们知道,SR锁存器可以具有锁存数据的功能:

  • 在S有效时,复位输出Q=1;
  • 在R有效时,输出复位Q=0;
  • 当S和R都无效时,就会保持前一个状态的输出。

2.2 D锁存器

虽然SR锁存器可以锁存数据,电路结构也简单,但是有一个毛病就是S和R同时有效时,输出错误,使用不够方便;还有一个问题就是某个时候存某个数据分不开,相当于时间和内容不够清晰。因此就因此了D锁存器,D锁存的功能是在时钟高/低电平的时候通过数据,在时钟低/高电平的时候锁存数据(这样就明确地说明了什么时候锁存什么数据,而不是像SR锁存器一样,不知道锁存什么数据),具体的结构图和分析如下所示:

D锁存器常见结构和电路符号图如下所示:

         

可以看到,D锁存器可以分为前级门电路(两个与门和一个非门)和后级SR锁存器组成,(PS:反相器2个晶体管,两个与门共12个晶体管,两个或非门共8个晶体管,D锁存器一个22个晶体管)下面我们就来分析一下它的功能:

输入是Clk和D,也就是输入有四种可能:

2.2.1 clk=0(保持)

  • 红S红R都为0,也就是SR锁存器的输入为00,根据SR锁存器的功能,输出Q和Q’将保持原来的状态;
  • 因此clk=0时,不管D是什么,输出Q和Q’都不随D变化,只与原来的状态有关,也就是保持

2.2.2 clk=1(输出=输入)

R=(1·D’)=D’;S=(1·D)=D。

也就是说,当clk=1的时候,SR锁存的输入是互补的,不会出现S和R同时有效的情况。

  • 当D=1时,S=1,置位有效,输出Q=1;
  • 当D=0时,R=1,复位有效,输出Q=0;

因此就可以知道,在clk=1时,输出Q=D,也就是输出等于输入。

2.2.3 D锁存器 总结

通过上面的分析,上面的D锁存器结构功能为:

  • 在clk=1时,数据通过D锁存器流到了Q;
  • 在Clk=0时,Q保持原来的值不变。

这样的锁存器也称为透明锁存器或者电平敏感锁存器(这里需要注意的是,上面结构中电平敏感锁存器是高电平敏感也是就是高电平有效,这里的有效不是指“锁存”的这个功能有效,而是指输出发生变化即输入信号得以传送到输出,方便后面的锁存操作)。然后低电平敏感的D锁存器的电路结构这里就不介绍了。

2.2.4 D锁存器的应用(不懂,待恶补)

锁存器用来锁存数据,这是初始的功能应用,这里来聊聊锁存的其他的简单应用吧。

①锁存器的常用应用就是用来防电路毛刺了,具体的应用就是门控时钟了,这里请查看我的另外一篇博文,那里有较为详细的关于门控电路的描述。

②此外,锁存器可以用来构造触发器,这个我们在后面的触发器中进行介绍。

③锁存器的一种叫做锁定锁存器( lockup latch)的玩意用于修复扫描链插入时引起的时钟偏移问题,帮助修复保持时间违规,具体情况可以查看下面链接:

http://vlsiuniverse.blogspot.com/2013/06/lockup-latches-soul-mate-of-scan-based.html  (貌似需要fan墙才能查看...)

④类似通过修复保持时间来增强性能、锁存器流水线的应用,这些应用很难三言两语的说明,有些我也不是完全掌握,以后有时间再进行撰写。

三、(D)触发器

触发器有很多类型,比如J-K触发器、T触发器、D触发。前面我们也说了,锁存器的应用之一就是构成触发器,这里我们只聊最简单的触发器——D触发器,D触发器的结构和电路符号图如下所示:

            

    D触发器可以由两个D锁存器构成,驱动时钟的相位相反(也就是),前面的D锁存器称为主锁存器,后面的D锁存器称为从锁存器,因此D触发器也可以称为主从触发器(PS:两个D锁存器共44个晶体管,非门2个晶体管,因此D触发器46个晶体管)。

3.1 D触发器功能分析

假设要传输的数据D=D1:

  1. 开始clk=0:主锁存打开进行传输数据,把输入传送到从锁存器的输入端,即Qm = D1。

  2. 然后clk从0→1:主锁存器准备关闭,保持原来的值D1,与此同时从锁存器准备打开,把Qm的值传输到输出Qs,也就是Qs=Qm=D1。在clk=1的时候,主锁存器是关闭的,Qm保持D1不变,即Qm=D1;从锁存器是打开的,Qs=Qm=D1。
  3. 接着clk从1→0:主锁存器准备打开,准备传输数据;而从锁存器准备关闭。在clk=0的时候,主锁存打开进行传输数据,把输入传送到从到从锁存器的输入端,即Qm *= D2;与此同时,从锁存器关闭,由于新的Qm即Qm*还没有到达从锁存器的D端,因此在从锁存器关闭的时候,从锁存器锁存的是原来的值即D1,因此输出Qs =D1。然后接下来上升沿就传输D2....

  从上面的分析可以找到,D触发器在时钟上升沿的时候锁存在时钟上升沿采到的值,并且保持一个时钟周期。这种在时钟上升沿锁存数据的触发器称为正边沿触发器,与此对应的还有负边沿触发的触发器,这里就不进行介绍了。

  由D触发器延伸出去的知识点还有很多,比如寄存器,寄存器由多个D触发器构成(一个D触发器可以看做1位的寄存器);比如带使能的触发器:

                  

带复位的触发器:

                     

四、锁存器、触发器的异同

锁存器、触发器是具有记忆功能的二进制存贮器件,是组成各种时序逻辑电路的基本器件之一。因二者都是时序逻辑,所以输出不但同当前的输入相关,还同上一时刻的输出相关。

4.1 锁存器(latch)

时序逻辑器件电平触发的存储单元(无时钟端,非同步控制)。

  • 锁存器(D型)的数据存储动作取决于输入使能信号的电平值,仅当使能端有效时,输出端随着输入发生变化(输出=输入),否则处于锁存状态(输出保持)。
  • latch对输入电平敏感,受布线延迟影响较大,很难保证输出没有毛刺产生;(严重危害)
  • latch将静态时序分析(STA)变得极为复杂。(可以理解为不能分析)

4.2 触发器(FF,flip-flop)

时序逻辑器件时钟沿触发的存储单元(需要时钟,同步控制)。

触发器flip-flop受时钟控制,只有在时钟触发时才采样当前的输入,产生输出。

  • 当收到输入时钟脉冲时,便会根据规则改变状态,然后保持这种状态直到收到下一个触发脉冲信号到来。
  • DFF不易产生毛刺。

4.3 寄存器(register)

寄存器(register)的存储电路通常是由触发器构成的,因为一个触发器能存储一位二进制数,所以N个触发器就可以构成N位寄存器,可以将寄存器理解成多个触发器构成的暂存单元。

4.4 究竟优劣

在绝大多数设计中避免产生latch,理由如下:

  1. latch最大的危害在于不能过滤毛刺,这对于下一级电路是极其危险的。
  2. 如果使用门电路来搭建latch和DFF,则latch消耗的门资源比DFF要少,这是latch比DFF优越的地方。所以,在ASIC中使用 latch的集成度比DFF高,但在FPGA中正好相反,因为FPGA中没有标准的latch单元,但有DFF单元,一个LATCH需要多个LE才能实现。(后续有反对文献,见下文)

赛灵思社区 demi 在2020-01文章中,观点很有意思,详述了锁存器不好的原因(1.毛刺 2.非时钟同步,不好STA),且用实例反对“因FPGA内latch更消耗资源才不好”的观点。
文章链接 http://xilinx.eetrend.com/content/2020/100047135.html

引用1_[4]

先看锁存器的工作过程

我们以最简单的D锁存器为例来说明锁存器的工作过程,D锁存器有3个接口,也可以认为是4个,因为输出的两个Q和Q只是单纯的反向关系。

其中D为输入信号,当E为高时,输出Q即为输入的D;当E为低时,Q保持E为高时的最后一次状态,也就是锁存过程。

从上面的图中可以看出,锁存器对毛刺不敏感,很容易在信号上产生毛刺;而且也没有时钟信号,不容易进行静态时序分析。正是因为这两个原因,我们在FPGA设计时,尽量不用锁存器。

引用2_[4]

为什么锁存器依然存在于FPGA中?

我们在前面说过网上有一种说法是:FPGA中只有LUT和FF的资源,没有现成的Latch,所以如果要用Latch,需要更多的资源来搭出来。这种说法是错误的,因为在Xilinx的FPGA中,6 系列之前的器件中都有Latch;6系列和7系列的FPGA中,一个Slice中有50%的storage element可以被配置为Latch或者Flip-Flop,另外一半只能被配置为Flip-Flop。比如7系列FPGA中,一个Slice中有8个Flip-Flop,如果被配置成了Latch,该Slice的另外4个Flip-Flop就不能用了。这样确实造成了资源的浪费。

在UltraScale的FPGA中,所有的storage element都可以被配置成Flip-Flop和Latch。

我们以下面的代码来说明Flip-Flop和Latch在Ultrascale的FPGA中Implementation后的结果。

Flip-Flop代码:

module FF_top(input              clk,input [3:0]        data_i,input              data_ie,  //enableoutput reg [3:0]   o_latch);always @ ( posedge clk )
beginif(data_ie)o_latch <= data_i;
end  endmodule

Latch代码:

module latch_top(input [7:0]        data_i,input              data_ie,  //enableoutput reg [7:0]   o_latch);always @ *
beginif(data_ie)o_latch[3:0] <= data_i[3:0];
end  endmodule

Flip-Flop实现后的Schematic和Device如下:

Latch实现后的Schematic和Device如下:

可以看出,在使用Flip-Flop时,storage element被综合成了FDRE,也就是触发器;当使用Latch电路时,storage element被综合成了LDCE。

所以,FPGA中没有Latch的说法在Xilinx的FPGA中是不对的。

4.5 设计原则

Verilog编程时如何避免锁存器:在组合逻辑中,如果条件描述不全就会容易产生Latch:
  •   if语句中缺少了else语句
  •   case语句中没有给出全部的情况。

4.6 最后一个问题

既然Latch有这么多的问题,那为什么FPGA中还要保留?

引用3_[4]

① 首先就是因为FPGA电路的灵活性,保留Latch并不影响FPGA的资源,因为storage element可以直接被配置为Flip-Flop。

② 其次就是有些功能是必须要使用Latch的,比如很多处理器的接口就需要一个Latch来缓存数据或地址。

最后要说明的一点是:锁存器虽然在FPGA中不怎么被使用,但在CPU中却很常见,因为锁存器比Flip-Flop快很多。

参考文章:

[1] 《从CMOS到触发器(二)》http://www.cnblogs.com/IClearner/

[2]《触发器(寄存器)与锁存器的异同》CSDN博主「宇宙小那边」 https://blog.csdn.net/weixin_40877615/article/details/93857999

[3]《锁存器和触发器的区别 》CSDN博主「上进的蠢猪」https://blog.csdn.net/weixin_39565666/article/details/79700237

[4]赛灵思社区文章 http://xilinx.eetrend.com/content/2020/100047135.html

【FPGA - 基础知识(二)】锁存器、触发器相关推荐

  1. 初学者必须要知道的FPGA基础知识

    初学者必须要知道的FPGA基础知识 一.FPGA是什么? 在<FPGA至简设计原理与应用>一书里是这样描述的:『FPGA的全称为Field-Programmable Gate Array, ...

  2. FPGA基础知识|芯片设计基础知识

    FPGA 基础知识 可查看原文:FPGA基础知识 1.查找表 LUT 和编程方式第一部分: 查找表 LUT FPGA 是在 PAL.GAL.EPLD.CPLD 等可编程器件的基础上进一步发展的产物.它 ...

  3. FPGA基础知识极简教程(10)二进制到BCD转换算法

    文章目录 写在前面 正文 快速认识 实现方式一 实现方式二 写在最后 写在前面 FPGA基础知识极简教程(9)讲到了七段数码管的显示Verilog设计,我们都知道,要在数码管上显示的数字,使用BCD编 ...

  4. FPGA基础知识极简教程(7)详解亚稳态与跨时钟域传输

    博文目录 写在前面 正文 FPGA或ASIC中的传播延迟 建立和保持时间是什么? 建立和保持时间与传播延迟和时钟频率有何关系? 如果违反建立和保持时间会发生什么? FPGA中的亚稳定是什么? 亚稳态何 ...

  5. CV:计算机视觉技术之图像基础知识(二)—图像内核的可视化解释

    CV:计算机视觉技术之图像基础知识(二)-图像内核的可视化解释 目录 图像内核的可视化解释 测试九种卷积核 官方Demo DIY图片测试 DIY实时视频测试 相关文章 CV:计算机视觉技术之图像基础知 ...

  6. CV:计算机视觉技术之图像基础知识(二)—以python的skimage和numpy库来了解计算机视觉图像基础(图像存储原理-模糊核-锐化核-边缘检测核,进阶卷积神经网络(CNN)的必备基础)

    CV:计算机视觉技术之图像基础知识(二)-以python的skimage和numpy库来了解计算机视觉图像基础(图像存储原理-模糊核-锐化核-边缘检测核,进阶卷积神经网络(CNN)的必备基础) 目录 ...

  7. (五)JS基础知识二(通过图理解原型和原型链)【三座大山之一,必考!!!】

    JS基础知识二(原型和原型链) 提问 class 继承 类型判断(instanceof) 原型 原型关系 基于原型的执行规则 原型链 说明 提问 如何准确判断一个变量是不是数组 class的原型本质 ...

  8. oracle:oracle基础知识(二)

    oracle基础知识(二)笔记:高级查询 文章目录 分组查询 多属性分组语法: 过滤查询 group by 语句增强 sqlplus报表功能 多表查询 等值连接 外连接 自连接 子查询 子查询中的空值 ...

  9. 网络基础知识(二) HTTP

    网络基础知识(二) HTTP 黑发不知勤学早,白首方悔读书迟. 内容参考:https://www.runoob.com/http/http-content-type.html HTTP协议是Hyper ...

  10. CV:计算机视觉技术之图像基础知识(二)—图像内核的九种卷积核可视化解释(blur/bottom sobel /emboss/identity /sobel /outline/sharpen)

    CV:计算机视觉技术之图像基础知识(二)-图像内核的九种卷积核可视化解释(blur/bottom sobel /emboss/identity /left sobel /outline/right s ...

最新文章

  1. JSONUtil,POJO实体类和JSON互转,
  2. 使用 Tye 辅助开发 k8s 应用竟如此简单(六)
  3. js-cookie 无法设置cookie_php操作 cookie
  4. LeetCode 398. 随机数索引(概率)
  5. java和vb.net des加密_vb.net DES加密与解密
  6. 最简单的基于FFmpeg的移动端例子:Windows Phone HelloWorld
  7. 有关Lattice Diamond的若干bug
  8. 微软 android 输入法下载官网下载地址,微软五笔输入法官网下载_微软王码五笔输入法8689版官方下载-华军软件园...
  9. 百旺开票清单导入模板_半年来最爱的高效率工具滴答清单不为人知的使用技巧...
  10. 对话框不响应WM_KEYDOWN消息,可以通过重载BOOL PreTranslateMessage(MSG * pMsg)来实现
  11. 基于张量的多元多阶马尔科夫多模态预测方法
  12. NOIP2016·洛谷·天天爱跑步
  13. No.01统计学之数据的描述性统计
  14. Your project path contains non-ASCII characters. 解决办法
  15. soap-ws 获取wsdl中所有方法 (一)
  16. Hypermesh-laminate复合材料案例学习笔记
  17. java获取指定日期所在的周一至周日的日期号数
  18. 成功解决NotFoundError (see above for traceback): Failed to create a directory: ; No such file or directo
  19. [Android]自定义垂直滚动的广告区
  20. 安其拉开门最快的服务器,魔兽世界:怀旧服安其拉开门压力测试周四开放,位面已成最大问题...

热门文章

  1. ffmpeg获取设备支持的分辨率_短视频字幕提取合成超简单,掌握ffmpeg这个小技巧
  2. [cocos2dx_Lua]quick中的组件Component
  3. 联合概率、边缘概率、条件概率之间的关系贝叶斯公式
  4. 不知道波动率为何起起落落?这里是波动率飙升的五大因素
  5. python编写人工智能-用Python写一个中国象棋AI?
  6. CMMI流程规范-图解测试流程
  7. KEIL5兼容KEIL4方法
  8. 20171207_MATLAB求概率
  9. 同惠TH2810DLCR测试仪电感的测量方法
  10. 3531交叉编译htop