作者:景圣南_863 | 来源:互联网 | 2023-10-16 14:11
触发器:flipflop锁存器:latch寄存器:register锁存器是电平触发的存储单元,数据存储的动作取决于输入时钟(或者使能)信号的电平值,尽当锁存器处于使能状态时输出才会
触发器:flipflop
锁存器:latch
寄存器:register
锁存器是电平触发的存储单元,数据存储的动作取决于输入时钟(或者使能)信号的电平值,尽当锁存器处于使能状态时输出才会随着数据输入发生变化。
触发器是边沿敏感的存储单元,数据存储的动作有某一信号的上升或者下降沿进行同步的。
寄存器用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。其实寄存器就是一种常用的时序逻辑电路,但这种时序逻辑电路只包含存储电路。寄存器的存储电路是由锁存器或触发器构成的,因为一个锁存器或触发器能存储>1>位二进制数,所以由>N>个锁存器或触发器可以构成>N>位寄存器。 触发器是在时钟的沿进行数据的锁存的,而锁存器是用电平使能来锁存数据的。所以触发器的>Q>输出端在每一个时钟沿都会被更新,而锁存器只能在使能电平有效器件才会被更新。 有一些教科书里的触发器实际是锁存器。在>FPGA>设计中建议如果不是必须那么应该尽量使用触发器而不是锁存器。
钟控D触发器其实就是>D>锁存器,边沿>D>触发器才是真正的>D>触发器,钟控>D>触发器在使能情况下输出随输入变化,边沿触发器只有在边沿跳变的情况下输出才变化。
20、D >触发器和>D >锁存器的区别。
两个锁存器可以构成一个触发器,>归根到底还是>dff>是边沿触发的,而>latch>是电平触发的。锁存器的输出对输入透明的,输入是什么,输出就是什么,这就是锁存器不稳定的原因,而触发器是由两个锁存器构成的一个主从触发器,输出对输入是不透明的,必须在时钟的上升>/>下降沿才会将输入体现到输出,所以能够消除输入的毛刺信号。
21、latch>和>filp-flop>的异同
都是时序逻辑,但latch>受所有的输入信号控制,只要输入信号变化,latch>就变化。也正因为如此,>latch>很容易出毛刺。>flip-flop>是触发器,只有在被时钟触发时才采样当前的输入,产生输出。如果使用门电路来搭建>latch>和>ff>,则>latch>消耗的门资源比>ff>要少。但是你用的如果是 fpga>,那么内部一般带>DFF>单元,反而用触发器更好。
22、latch>与>register>的区别>,
为什么现在多用register.>行为级描述中>latch>如何产生的行为级描述中>latch>一般是由于>if>货>case>逻辑表述不完全产生的。
异同:
1、 latch>由电平触发,非同步控制。在使能信号有效时latch>相当于通路,在使能信号无效时>latch>保持输出状态。>DFF>由时钟沿触发,同步控制。
2、 latch容易产生毛刺(>glitch>),>DFF>则不易产生毛刺。
3、 如果使用门电路来搭建>latch>和>DFF>,则>latch>消耗的门资源比>DFF>要少,这是>latch>比>DFF>优越的地方。所以,在>ASIC>中使用 >latch>的集成度比>DFF>高,但在>FPGA>中正好相反,因为>FPGA>中没有标准的>latch>单元,但有>DFF>单元,一个>LATCH>需要多个>LE>才能实现。
4、 latch>将静态时序分析变得极为复杂。
一般的设计规则是:在绝大多数设计中避免产生>latch>。它会让您设计的时序完蛋,并且它的隐蔽性很强,非老手不能查出。latch>最大的危害在于不能过滤毛刺。这对于下一级电路是极其危险的。所以,只要能用D>触发器的地方,就不用>latch>。有些地方没有时钟,也只能用>latch>了。比如现在用一个>clk>接到>latch>的使能端>(>假设是高电平使能>),>这样需要的>setup>时间,就是数据在时钟的下降沿之前需要的时间,但是如果是一个DFF>,那么>setup>时间就是在时钟的上升沿需要的时间。这就说明如果数据晚于控制信号的情况下,只能用 >latch,>这种情况就是,前面所提到的>latch timing borrow。基本上相当于借了一个高电平时间。也就是说,>latch>借的时间也是有限的。
关 于latch>的讨论 >latch>和>flip-flop>都是时序逻辑,区别为:>latch>同其所有的输入信号相关,当输入信号变化时latch>就变化,没有时钟端;>flip- flop>受时钟控制,只有在时钟触发时才采样当前的输入,产生输出。当然因为二者都是时序逻辑,所以输出不但同当前的输入相关还同上一时间的输出相关。
1>、没有时钟端,不受系统同步时钟的控制,无法实现同步操作;
2>、对输入电平敏感,受布线延迟影响较大,很难保证输出没有毛刺产生;
在 >xilinx>和>altera>器件的>slice>和>LE>中都能够同时支持生产>d-latch>和>d-ff>,在这一层面上二者有什么区别暂时没有想到。如果使用门电路来搭建latch>和>ff>,则>latch>消耗的门资源比>ff>要少,这是>latch>比>ff>优越的地方。 >latch>的最大缺点就是没有时钟端,和当前我们尽可能采用时序电路的设计思路不符。 >latch>是电平触发,相当于有一个使能端,且在激活之后(在使能电平的时候)相当于导线了,随输出而变化,在非使能状态下是保持原来的信号,这就可以看出和>flip-flop>的差别,其实很多时候>latch>是不能代替>ff>的
1.latch对毛刺敏感
2.>在>ASIC>中使用>latch>的集成度比>DFF>高,但在>FPGA>中正好相反,因为>FPGA>中没有标准的>latch>单元,但有>DFF>单元,一个>LATCH>需要多个>LE>才能实现
3.latch>将静态时序分析变得极为复杂
4. 目前>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>了。
对>latch>进行>STA>的分析其实也是可以>,>但是要对工具相当熟悉才行>.>不过很容易出错>.>当前>PrimeTime,>是支持进行>latch>分析的>.>现在一些综合工具内置的>STA>分析功能也支持比如>RTL compiler, Design Compiler. >除了>ASIC>里可以节省资源以外。我感觉>latch>这个东西在同步设计里出现的可能还是挺小的吧,现在处理过程中大都放在ff>里打一下,影响不太大吧
标签: 无标签latch>与>DFF>的区别收集了一下网上资源,总结如下:
1、latch>由电平触发,非同步控制。在使能信号有效时latch>相当于通路,在使能信号无效时>latch>保持输出状态。>DFF>由时钟沿触发,同步控制。
2、latch>容易产生毛刺(>glitch>),>DFF>则不易产生毛刺。
3、如果使用门电路来搭建latch>和>DFF>,则>latch>消耗的门资源比>DFF>要少,这是>latch>比>DFF>优越的地方。所以,在>ASIC>中使用>latch>的集成度比>DFF>高,但在>FPGA>中正好相反,因为>FPGA>中没有标准的>latch>单元,但有>DFF>单元,一个>LATCH>需要多个>LE>才能实现。
4、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)
begin
if(enable) begin
data_out = ina;
end
else begin
data_out = inb;
end
end
代码>2
input[3:0] data_in;
always@(data_in)
begin
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
end
答案是代码>2>在综合时更容易产生>latch>。
使用条件语句不当在设计中生成了原本没有想到的锁存器:、
例1:在一个>always>语句中不正确使用>if>语句
Always @ (al or d) always @ (al or d)
begin
begin
if(al) q<= d;
if(al) q <= d;
end
else q <= 0;
end
在这个always>块中,>if>语句只保证了当>al=1>时q>才取>d>的值。这段程序并没有给出当>al=0>时q>的取值,那么当>al=0>时q>取何值?在>always>块中在给定的条件下变量没有被赋值,那么变量将保持原值,也就是说将会生成一个锁存器。
如果当设计人员希望当al=0>时,>q>的值为>0>,则>else>项就必不可少了。请注意看右边的>always>块,整个>verilog>程序模块综合出来后,>always>块对应的部分不会生成锁存器。
Verilog HDL>程序的另一种偶然生成锁存器是在使用case>语句时缺少>default>项的情况下发生的。
Case>语句的功能是:在某个信号取不同的值时,给另一个信号赋不同的值。如下,如果sel=00>,q>取a>值,而>sel=11>,q>取b>值。这个例子不清楚的是:如果>sel>取>00>和>11>以外的值时>q>将赋予什么值?在这个例子中,默认q>保持原值,这就会自动生成锁存器。
always @ (sel[1:0] or a or b) always @ (sel[1:0] or a or b)
case(sel[1:0]) case(sel[1:0])
2’b00: q <= a; 2’b00: q <= a;
2’b11: q <= b; 2’b11: q <= b;
endcase
default: q <= ‘b0;
endcase
有锁存器 无锁存器
避免生成锁存器的方法:如果用到if>语句,最好写上>sles>项;如果用>case>语句,最好写上>default>项。遵循上面两条原则,就可以避免发生这种错误,使设计者更加明确设计目标,同时也增强了>verilog>程序的可读性。