概述
目录
一、双稳态器件
二、常见的锁存器
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(保持)
-
对于或非门N1,输入是0和Q’,由于Q’不知道是0还是1,因此Q的输出不能确定;
-
对于或非门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:
-
开始clk=0:主锁存打开进行传输数据,把输入传送到从锁存器的输入端,即Qm = D1。
- 然后clk从0→1:主锁存器准备关闭,保持原来的值D1,与此同时从锁存器准备打开,把Qm的值传输到输出Qs,也就是Qs=Qm=D1。在clk=1的时候,主锁存器是关闭的,Qm保持D1不变,即Qm=D1;从锁存器是打开的,Qs=Qm=D1。
- 接着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,理由如下:
- latch最大的危害在于不能过滤毛刺,这对于下一级电路是极其危险的。
- 如果使用门电路来搭建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, //enable
output reg [3:0] o_latch
);
always @ ( posedge clk )
begin
if(data_ie)
o_latch <= data_i;
end
endmodule
Latch代码:
module latch_top(
input [7:0] data_i,
input data_ie, //enable
output reg [7:0] o_latch
);
always @ *
begin
if(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 - 基础知识(二)】锁存器、触发器一、双稳态器件二、常见的锁存器三、(D)触发器四、锁存器、触发器的异同的全部内容,希望文章能够帮你解决【FPGA - 基础知识(二)】锁存器、触发器一、双稳态器件二、常见的锁存器三、(D)触发器四、锁存器、触发器的异同所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复