精华内容
下载资源
问答
  • latch电路
    千次阅读
    2019-03-21 19:36:10

    Latch的产生和避免

    designer

    designer

    FPGA

    1 人赞同了该文章

    在FPGA设计或者IC设计中,latch是一种对脉冲电平敏感的存储单元路径,可以在特定输入脉冲作用下改变电平。但由于往往设计为同步设计,Latch不可避免的毛刺是不愿意看到的;这种毛刺对下一级电路及时序收敛很不利,因而在设计中需要避免。

    关于latch的产生,大多说人首先想到的是由于verilog代码中在if-else结构中缺少else或case结构中缺少default所导致,因此也往往在设计中要求if-else结构和case结构要写完整。但完整的if-else结构或case结构就能完全避免latch的产生么?我们看下列两段代码:

        always @(*)
        begin
        	if(enable)
        		data_out1=ina;
        	else
        		data_out2=ina;
        end
    

    在vivado中进行Synthesis后显示warning:

    同样,下述代码综合后也会提示有latch生成:

    always @(*)
        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
    

    上述代码之所以产生latch,个人观点:待赋值变量在个别分支条件下缺少相应赋值,即代码风格的问题。故为避免latch的产生,个人认为应做到如下几点:

    1. if-else 和case-default必须配套,也就是出现if 必须出现else与之配套;有case必须在后面写一个default,针对case语句也可以增加综合指令 //synopsys full_case指令省略default语句。

    2.在所有条件下,对信号都进行赋值,同时单个always模块尽量只对单一变量进行赋值。

    最后就SIRF 2008年面试题为例进行说明

    下面哪种写法会产生latch?为什么?

    (1)
    always @(*)
    begin
       if(d)
       a = b;
    end
    (2)
    always @(*)begin
       if(d)
          a = b;
       else
          a = a;
    end
    (3)
    always @ (b or d)
        case(d)
           2’b00: a=b>>1;
           2’b11: c=b>>1;
           default:
           begin
              a=b;
              c=b;
           end
       endcase
    (4)
    always @(b or d)
     begin
        a = b;
        c = b;
        case (d)
            2’b00: a = b >> 1;
            2’b11: c = b >> 1;
        endcase
     end
    (5)
    always@(b or d)
     begin
        case (d) //synopsys full_case
            2’b00: a = b >> 1;
            2’b11: c = b >> 1;
        endcase
     end
    

    代码(1)中由于缺少else分支,故而会产生锁存器

    代码(2)if-else结构完整但由于为组合逻辑,而组合逻辑要想产生记忆功能,只能综合成锁存器

    代码(3)中由于并未在所有情况下对所有信号值赋值故会产生latch

    代码(4)中由于在选择语句之前给信号赋一个初值,故不会产生latch。但该种代码风格是按照软件的思维方式书写,故而不推荐使用,针对这种代码风格,针对时序电路也可以应用,下列两种代码综合出的电路没有差别,但不推荐第一种风格

    (1)
    always @(posedge clk or negedge reset_n)
        begin
            begin
            out1 <= 'd0;
            out2 <= 'd0;
            end
        if (!reset_n)
            begin
            out1 <= 'd0;
            out2 <= 'd0;
            end else if (enable)
            out1 <= in1;
        else
            out2 <= in1;
        end
    (2)
    always @(posedge clk or negedge reset_n)
        begin
        if (!reset_n)
            begin
            out1 <= 'd0;
            out2 <= 'd0;
            end else if (enable)
            begin
            out1 <= in1;
            out2 <= 'd0;
            end else
            begin
            out1 <= 0;
            out2 <= in1;
            end
        end
    

    综合电路图

    代码(5)中虽然有 //synopsys full_case但是依旧并未在所有情况下对所有信号值赋值故会产生latch( //synopsys full_case只能省掉default)。

    更多相关内容
  • TRIBUFFER+电阻+LATCH电路仿真Proteus仿真电路.rar
  • 锁存器(latch):是电平触发的存储单元,数据存储的动作(状态转换)取决于输入时钟(或者使能)信号的电平值,尽当锁存器处于使能状态时,输出才会随着数据输入发生变化。   分为普通锁存器和门控锁存...

    锁存器、触发器和寄存器的比较

    锁存器(latch):是电平触发的存储单元,数据存储的动作(状态转换)取决于输入时钟(或者使能)信号的电平值,尽当锁存器处于使能状态时,输出才会随着数据输入发生变化。
      分为普通锁存器门控锁存器,普通锁存器无控制信号,输出状态始终直接由输入决定。在实际的数字系统中,为了协调各部分的工作,往往需要有一个特定的控制信号去控制锁存器状态转换的时间,在控制信号无效时,输出保持不变,不随输入变换;当控制信号有效时,输出由输入决定,跟随输入变化。
    ①正是因为门控锁存器在控制信号有效的期间内,都可以接收输入信号,所以,激励信号的任何变化,都将直接引起锁存器输出状态的改变。这时输入信号若发生多次变化,输出状态也可能发生多次变化,这一现象称为锁存器的空翻。
    ②其次,当门控锁存器的控制信号有效时,锁存器就变成了一个组合电路,时序逻辑电路的模型就等效为两个各组合电路互为反馈的反馈系统,因此,系统有可能会因为瞬态特性不稳定而产生振荡现象。

     触发器(flip-flop)是边沿敏感的存储单元,数据存储的动作(状态转换)由某一信号 的上升或者下降沿进行同步的(限制存储单元状态转换在一个很短的时间内)。(钟控D触 发器其实就是 D 锁存器,边沿 D 触发器才是真正的 D 触发器)
    触发器分为两种,一种是主从触发器和边沿触发器。主从触发器在时钟有效期内(主触 发器)接收数据,在时钟边沿输出状态转换。 边沿触发器在时钟边沿期间, 触发器才接收数 据并使输出状态转换。 目前,主从触发器基本上已经很少见了,实际使用的大都是边沿触发器。

    寄存器(register):用来暂时存放参与运算的数据和运算结果。在实际的数字系统中, 通常把能够用来存储一组二进制代码的同步时序逻辑电路称为寄存器。 区别与联系:由于触发器内有记忆功能,因此利用触发器可以方便地构成寄存器。由于 一个触发器能够存储一位二进制码,所以把 n 个触发器的时钟端口连接起来就能构成一个存 储 n 位二进制码的寄存器。
       从寄存数据的角度来讲,寄存器和锁存器的功能是相同的;它们的区别在于寄存器是同 步时钟控制,而锁存器是电位信号控制。 一般的设计规则是:在绝大多数设计中避免产生锁存器。它会让您设计的时序完蛋,并 且它的隐蔽性很强,非老手不能查出。

    锁存器具备下列特点:
    (1)对毛刺敏感(使能信号有效时,输出状态可能随输入多次变化,产生空翻,对下一级电路很危险),不能异步复位,因此在上电后处于不确定的 状态。
    (2)锁存器会使静态时序分析变得非常复杂,不具备可重用性。 (首先, 锁存器没有时 钟参与信号传递,无法做 STA;其次,综合工具会将 latch 优化掉,造成前后仿真结果不一 致)
    (3)在FPGA中基本的单元是由查找表和触发器组成的,若生成锁存器反而需要 更多的资源。根据锁存器的特点可以看出,在电路设计中,要对锁存器特别谨慎,如果设计 经过综合后产生出和设计意图不一致的锁存器,则将导致设计错误,包括仿真和综合。因此, 在设计中需要避免产生意想不到的锁存器。 如果组合逻辑的语句完全不使用 always  语句块,就可以保证综合器不会综合出锁存器。
    (4)但如果锁存器和触发器两者都由与非门搭建的话,锁存器耗用的逻辑资源要比D触发器少(D触发器需要12个MOS管,锁存器只需6个MOS管),锁存器的集成度更高。所以在的ASIC设计中会用到锁存器。但锁存器对毛刺敏感,无异步复位端,不能让芯片在上电时处在确定的状态;另外,锁存器会使静态时序分析变得很复杂,不利于设计的可重用,所以,在ASIC设计中,除了CPU这高速电路,或者RAM这种对面积很敏感的电路,一般不提倡用锁存器。 


    锁存器的出现以及解决办法
    在基于always的组合逻辑描述语句中容易综合出锁存器的地方:1:if 语句的使用中缺 少else语句(前提是不是始终边沿触发);2:case 语句中没有给出全部的情况。
    (1)时序电路中if ....else 不完整不会生成锁存器,组合逻辑中会产生锁存器:

    DC综合结果如下:

    上 边的电路是时序逻辑,生成触发器,而触发器是有使能端(enable)的,使能端无效时就可以保存数据,无需锁存器
    下 边的电路是组合逻辑,在en为低电平时,输出q1要保持不变,而组合逻辑没有存储元件,只能生成锁存器来保持数据。所以 在时序逻辑中,不完整的 if…else… 结构并不会生成锁存器,而组合逻辑中不完整的 if…else… 结构就会生成锁存器 。为了避免我们设计的组合逻辑中出现不想要的锁存器,在使用 if…else… 结构时一定要写完整。
    (2)c中enable为1位,未形成锁存器,d中enaable为2位,形成锁存器



    (3)形成锁存器,如果给q赋初值,不会形成锁存器
    module a0(
    input  clk     ,
    input  [3:0] data,
    input   [1:0] enable  ,
    output reg q
    );
    always @(*)begin
           if(enable==0) q = data[3];
           else if(enable==1) q = data[2];
    //       else if(enable==2) q = data[1];
    //       else if(enable==3) q = data[0];
    end
    endmodule

    (4)其他的情况(摘自他人博客,我均用DC综合过,结果正确)

    case1(有锁存器):

    module mux_latch
    (
        input   [3:0] data,
        input   [1:0] valid,
        input   flag,
        output reg valid_data
    );

    always @ (*)
        begin
            if(valid==2'd0) valid_data = data[3];
            if(valid==2'd1) valid_data = data[2];
            if(valid==2'd2) valid_data = data[1];
            if(valid==2'd3) valid_data = data[0];
        end

    endmodule

    //---------------------------------------------------------

    case 2解决办法1:加else与if配对

    always @ (*)
        begin
            if(valid==2'd0) valid_data = data[3];else
            if(valid==2'd1) valid_data = data[2];else
            if(valid==2'd2) valid_data = data[1];else
            if(valid==2'd3) valid_data = data[0];else
                         valid_data = 1'b0;
        end

    //-----------------------------------------------------------

    case3解决办法2:赋初始值

    always @ (*)
        begin

       valid_data = 1'b0
            if(valid==2'd0) valid_data = data[3];
            if(valid==2'd1) valid_data = data[2];
            if(valid==2'd2) valid_data = data[1];
            if(valid==2'd3) valid_data = data[0];
        end

    //----------------------------------------------------------

    case 4(有锁存器)

    always @ (*)
    begin
        case(valid)
            2'b00 : begin if(flag) valid_data = data[0];end
            2'b01 : begin if(flag) valid_data = data[1];end
            2'b10 : begin if(flag) valid_data = data[2];end
            2'b11 : begin if(flag) valid_data = data[3];end
        endcase

    //-------------------------------------------------------------

    case 5(有锁存器)

    always @ (*)
    begin
        case(valid)
            2'b00 : begin if(flag) valid_data = data[0];end
            2'b01 : begin if(flag) valid_data = data[1];end
            2'b10 : begin if(flag) valid_data = data[2];end
            2'b11 : begin if(flag) valid_data = data[3];end
            default:valid_data=1'b0;
        endcase
    end

    //--------------------------------------------------------------

    case 6解决办法---赋初始值

    always @ (*)
    begin
       valid_data=1'b0;
        case(valid)
            2'b00 : begin if(flag) valid_data = data[0];end
            2'b01 : begin if(flag) valid_data = data[1];end
            2'b10 : begin if(flag) valid_data = data[2];end
            2'b11 : begin if(flag) valid_data = data[3];end
        endcase
    end

    //----------------------------------------------------------------

    case7解决办法-- 加else

    always @ (*)
    begin
        case(valid)
            2'b00 : begin if(flag) valid_data = data[0];else valid_data = 1'b0;end
            2'b01 : begin if(flag) valid_data = data[1];else valid_data = 1'b0;end
            2'b10 : begin if(flag) valid_data = data[2];else valid_data = 1'b0;end
            2'b11 : begin if(flag) valid_data = data[3];else valid_data = 1'b0;end
        endcase
    end

    展开全文
  • 数字电路基础:关于锁存器latch

    万次阅读 多人点赞 2019-09-05 12:14:21
    锁存器是一种在异步时序电路系统中,对输入信号电平敏感的单元,用来存储信息。一个锁存器可以存储1bit的信息,通常,锁存器会多个一起出现,如4位锁存器,8位锁存器。锁存器在数据未锁存时,输出端的信号随输入信号...

            锁存器是电平触发的控制器件,这与边沿触发的触发器是有着本质的区别的。锁存器是一种在异步时序电路系统中,对输入信号电平敏感的单元,用来存储信息。一个锁存器可以存储1bit的信息通常,锁存器会多个一起出现,如4位锁存器,8位锁存器。锁存器在数据未锁存时,输出端的信号随输入信号变化,就像信号通过一个缓冲器,一旦锁存信号有效,则数据被锁存,输入信号不起作用。因此,锁存器也被称为透明锁存器,指的是不锁存时输出对于输入是透明的。与触发器的区别:两者都是基本存储单元,单锁存器是电平触发的存储器,触发器是边沿触发的存储器。本质是,两者的基本功能是。一样的,都可以存储数据。意思是说一个是组合逻辑的,一个是在时序电路中用的,时钟触发的

    verilog对锁存器的描述(建模):

                  常见的锁存器包括三个端口:数据输入口、数据输出

    always@(E or D)
    begin
         if(E)
            Q = D ;
    end
    

    1. 什么情况下会生成锁存器?

                 在组合逻辑中,若是存在某个信号需要保持不变的时候,就会生成锁存器。

    看几个Verilog描述:

    描述方式1:

    always@(*)
    begin
        if(sl)
           begin
               q = a ;
           end
    end

     根据组合逻辑的描述,假设生成如下的选择器,即sl =1 时候,q = a,如下所示:

    描述方式2:

    这里需要注意一点,以上的verilog描述中其实隐含了 else 即若sl =0时,q保持不变即 q=q,也就是上述的verilog描述与下面的verilog描述是一样的:

    always@(*)
    begin
        if(sl) 
           begin
              q = a ;
           end
        else 
           begin
              q = q ;
           end
    end

    如何实现呢?最直接的想法似乎是如下的电路实现:

    这是不可以的,组合逻辑中是不能有回路的,要求都是正向的。严格说来,Verilog描述组合逻辑“有反馈 ”时,这段代码可以被编译和实现 出组合路,但是编译器肯定给出警告 ,因为这段代码的结果没有实际意义 根本不知道结果是多少。

    CAUSE: The TimeQuest Timing Analyzer found latches implemented using non-optimal resources (look-up tables (LUTs) with combinational feedback).  The TimeQuest analyzer replaces the combinational loop with an equivalent latch. The TimeQuest analyzer treats this logic as asynchronous endpoint, and will not analyze the path through the node. 
    ACTION: You must implement these latches with registers using asynchronous load and 
    data signals, or remove them from your design. For more information, run the check_timing tcl command in the TimeQuest analyzer. 

    原因:TimeQuest时序分析器发现使用非最佳资源(具有组合反馈的查找表(LUT))实现锁存器。 TimeQuest分析器用等效的锁存器替换组合循环。 TimeQuest分析器将此逻辑视为异步端点,并且不会分析通过该节点的路径。
    操作:您必须使用异步加载数据信号的寄存器来实现这些锁存器,或者从设计中删除它们。 有关更多信息,请在TimeQuest分析器中运行check_timing tcl命令

    以加法为例,那生成的加法电路会执行几次呢?还是一直在加?怎么控制呢?

    描述方式3:

    always@(*)
    begin
        a = a + 1;
    end

    我在尝试综合时,综合工具会将Latch优化掉,这将会造成前、后仿真结果不一致。

    描述方式4:

    always @ (A,B)
        C = A & B;

    只要A或B有变化就会触发对C的赋值。

    描述方式5:

    always@(*)
    begin
         case(d)
          2'b00: a=b>>1; //这里没有对C描述,因此c保持不变,会生成锁存器
          2'b11: c=b>>1;//a保持不变
         default:
            begin
               a = b ;
               c = b;
            end
    end

    看到一篇博文中有一个问题,感觉挺值得注意的:

          如下的设计中,采用了时序逻辑设计,却生成了锁存器

    module Decode(
    input A,
    input B,
    input C,
    output reg[31:0] edata,
    output reg[31:0] eCapData,
    input bCap,
    output reg CapSt,
    input n_rst,
    input [31:0] rstVal,
    input clk);
    
    reg[1:0] state;
    
    always@(posedge clk or negedge n_rst)
    begin
        if(!n_rst)
        begin
            edata <= rstVal;
            state <= {A,C};
        end
        else
        begin
            state <= {A,B};
            edata <= {31'd0,A};
        *****此处省略一万*****
        end
    ————————————————
    版权声明:本文为CSDN博主「江东风又起」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/ysgjiangsu/article/details/82718462

    他分析后得出原因:表面上是按照触发器的方式在写代码,实则不然。在异步复位代码段,我的输出依然由外界输入决定,因此综合之后产生了锁存器。
    将代码作如下修改,问题解决:

    module Decode(
    input A,
    input B,
    input C,
    output reg[31:0] edata,
    output reg[31:0] eCapData,
    input bCap,
    output reg CapSt,
    input n_rst,
    input [31:0] rstVal,
    input clk);
    
    reg[1:0] state;
    
    always@(posedge clk or negedge n_rst)
    begin
        if(!n_rst)
        begin
            edata <= 32'd0;
            state <= 2'd0;
        end
        else
        begin
            state <= {A,B};
            edata <= {31'd0,A};
        *****此处省略一万*****
        end
    ————————————————
    版权声明:本文为CSDN博主「江东风又起」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/ysgjiangsu/article/details/82718462

     

     

    2. 锁存器的危害?

    首先声明,latch并非完全有害,不然FPGA中也不会既有latch和flip-flop,在支持DDR的IOB中,利用latch实现DDIO。那为什么明明锁存器比触发器节省面积却还要去避免使用latch而采用触发器呢?

    对时序分析的影响:

           我们尽可能的避免使用或者生成锁存器,主要还是因为锁存器的存在不利于时序的分析。下图中,做时序分析时候,若组合逻辑不生成latch,那么在分析该时序是否符合时候,就可以根据分析原理去分析寄存器输出延迟Tco,组合逻辑延迟Tcomb,触发器的建立时间Ts,要求延迟的综合不超过时钟周期,这都是可预知的。假如在下图两个触发器间的组合逻辑中生成了latch,那么该路径的时序就很难分析,因为latch是电平触发,而不是时钟的边沿去触发,latch很可能在时钟的有效沿之间被触发,这就导致无法确定latch的输出什么时候为低,什么时候为高(与时钟不同步了),这是锁存器的特性所导致的。而采用D触发器,分析的时候只需考虑触发器之间的路径即可。

    还有种说法:

     锁存器为电平触发,无效电平则锁存,有效电平输入即反应到输出,由于延时不同容易产生毛刺。组合逻辑中数据不需要锁存,需要避免产生锁存器。FPGA资源中木有锁存器,需要触发器加逻辑门构成,消耗逻辑资源较多,但有时为了需要满足一些规范协议,会用到锁存器,总之FPGA用的很少。 而ASIC设计中,由于锁存器构成较简单,传输速度快,用锁存器可以有效提高集成度,所以用的比较多!

    总结:

    •   对毛刺敏感,不能异步复位,所以上电以后处于不确定的状态;

    •        Latch会使静态时序分析变得非常复杂;

    •        在PLD芯片中,基本的单元是由查找表和触发器组成的,若生成锁存器反而需要更多的资源。

    •        第三条也是最基本的原因。

     

    3. 如何避免生成锁存器

         组合逻辑生成锁存器的原因是逻辑中有信号需要保持不变,组合逻辑不能有环路(即反馈),因而通过生成锁存器达到保持不变的目的。

    这样的话,可以从两个角度入手:(1)采用时序逻辑,即在组合逻辑中插入触发器,多用触发器来实现信号的寄存;(2)尽可能避免在组合逻辑中某个信号需要保持不变,或者说避免组合逻辑存在环路。

    【注】:

    经常看到说组合逻辑中,if-else语句不要省略else,而case语句中条件分支也不要缺省,否则容易产生锁存器。其本质上说的是不要出现保持不变的信号,因为缺省后就默认会保持不变。组合逻辑的if语句缺省else导致描述变为else时候信号保持不变,因而生成锁存器,但如果组合逻辑中if-else语句的else中还描述的还是信号保持不变,那就算有else依旧会生成锁存器。

    贴一个其他博主的总结:链接

    简述组合逻辑的注意事项:

    (1)避免组合逻辑反馈环路(容易毛刺、振荡、时序违规等)。

         解决:A. 牢记任何反馈回路必须包含寄存器 ; B.检查综合、实现报告的warning信息,发现反馈回路(combinaTIonal loops)后进行相应修改。

    (2) 替换延迟链。

         解决:用倍频、分频或者同步计数器完成。

    (3)替换异步脉冲产生单元(毛刺生成器)。

         解决:用同步时序设计脉冲电路。

    (4)慎用锁存器。

         解决方式:

    A、使用完备的if…else语句;

    B、检查设计中是否含有组合逻辑反馈环路;

    C、对每个输入条件,设计输出操作,对case语句设置default 操作。特别是在状态机设计中,最好有一个default的状态转移,而且每个状态最好也有一个default的操作。

    D、如果使用case语句时,特别是在设计状态机时,尽量附加综合约束属性,综合为完全条件case语句

    小技巧:仔细检查综合器的综合报告,目前大多数的综合器对所综合出的latch都会报“warning”,通过综合报告可以较为方便地找出无意中生成的latch。

    展开全文
  • 一、SR 锁存器(保持电路状态,具备记忆功能) SR 锁存器是各种触发器电路的基本构成部分。与触发器的区别之一是输出是由输入的置1或置0信号直接完成的,而不需要触发信号的触发。 1、SR 锁存器工作原理 用或非门....

    目录

    一、SR 锁存器(保持电路状态,具备记忆功能)

    1、SR 锁存器工作原理

    2、SR锁存器的真值表

    3、SR 触发器的特性方程

    二、触发器

    1、电平触发的触发器

    2、 电平触发的D触发器——D型锁存器

    3、边沿触发的触发器

    3.1 电路结构和工作原理

    3.2 边沿触发器的特性表

    3.3 边沿触发方式的动作特点

    4、脉冲触发的触发器

    4.1 电路结构和工作原理


    • 电平敏感的存储器件称为锁存器。可分为高电平锁存器和低电平锁存器,用于不同时钟之间的信号同步。

    • 有交叉耦合的门构成的双稳态的存储原件称为触发器。分为上升沿触发和下降沿触发,可以认为是两个不同电平敏感的锁存器串连而成。前一个锁存器决定了触发器的建立时间,后一个锁存器则决定了保持时间。

    一、SR 锁存器(保持电路状态,具备记忆功能)

    SR 锁存器是各种触发器电路的基本构成部分。与触发器的区别之一是输出是由输入的置1或置0信号直接完成的,而不需要触发信号的触发。

    1、SR 锁存器工作原理

    用或非门组成的锁存器
    • \small S_D=1、\small R_D=0时,Q=1、Q'=0。在\small S_D=1信号消失以后(即\small S_D回到0),由于有Q端的高电平接回到 G2 的另一个输入端,因而电路的1状态得以保持
    • \small S_D=0、\small R_D=1时,Q=0、Q'=1。在 \small R_D=1信号消失以后,电路保持0状态不变。
    • \small S_D=\small R_D=0时,电路维持原来的状态不变。
    • \small S_D=\small R_D=1时,Q=Q'=0,这既不是定义的 1状态,也不是定义的0状态。而且,在\small S_D\small R_D同时回到0 以后无法断定锁存器将回到1状态还是0状态。
    • 因此,在正常工作时输入信号应遵守\small S_DR_D=0的约束条件,亦即不允许输入\small S_D=R_D=1的信号。

    SR 锁存器也可以用与非门构成,如下图所示。这个电路是以低电平作为输入信号的,所以用\small {S}'_D\small {R}'_D,分别表示置1输入端和置0输入端。在右下图所示的图形符号上,用输入端的小圆圈表示用低电平作输入信号,或者称低电平有效。

    用与非门组成的锁存器

    2、SR锁存器的真值表

    两种SR触发器的特性表

    \small Q表示输入变化之前的输出,\small Q^*表示输入变化之后的输出

    3、SR 触发器的特性方程

    二、触发器

    • 触发器与锁存器的不同在于,它除了置 1、置0输入端以外,又增加了一个触发信号输人端。只有当触发信号到来时,触发器才能按照输入的置 1、置0信号置成相应的状态,并保持下去。我们将这个触发信号称为时钟信号(CLOCK),记作 CLK。当系统中有多个触发器需要同时动作时,就可以用同一个时钟信号作为同步控制信号了。
    • 触发信号的工作方式可以分为电平触发、边沿触发和脉冲触发三种。下面将会看到,在不同的触发方式下,触发器的动作过程各具有不同的动作特点。掌握这些动作特点,对于正确使用触发器是十分必要的。

    1、电平触发的触发器

    电路结构:

    由两部分组成:SR 锁存器(与非门G1、G2构成)+ 输入控制电路(两个与非门G3、G4构成)

    电平触发SR触发器(门控SR锁存器)

    工作原理:

    • 由图可知,当 CLK=0时,门 G3、G4的输出始终停留在1状态,S、R 端的信号无法通过 G3、G4而影响输出状态,故输出保持原来的状态不变
    • 只有当触发信号 CLK 变成高电平以后,S、R 信号才能通过门G3、G4加到由门G1、G2组成的锁存器上,"触发"电路发生变化,使 Q 和 Q'根据 S、 R 信号而改变状态。因此,将 CLK 的这种控制方式称为电平触发方式

    2、 电平触发的D触发器——D型锁存器

    将上左图改接成下左图的形式,得到电平触发的D触发器(D型锁存器)

    电平触发的D触发器
    • 由图可见,若 D=1,则 CLK变为高电平以后触发器被置成 Q=1CLK 回到低电平以后触发器保持1状态不变
    • D=0,则 CLK 变为高电平以后触发器被置成 Q=0CLK 回到低电平以后触发器保持0状态不变。因为它仍然工作在电平触发方式下,所以同样具有电平触发的动作特点。

            它的特性表如下表所示。

    因为在 CLK 的有效电平期间输出状态始终跟随输入状态变化,输出与输入的状态保持相同,所以又将这个电路称为"透明的 D 型锁存器"(Transparent D-Latch)

    3、边沿触发的触发器

    3.1 电路结构和工作原理

    • 为了提高触发器的可靠性,增强抗干扰能力,希望触发器的次态仅仅取决于 CLK 信号下降沿(或上升沿)到达时刻输入信号的状态。而在此之前和之后输入状态的变化对触发器的次态没有影响。
    • 为实现这一设想,人们相继研制成了各种边沿触发(edge-triggered)的触发器电路。目前已用于数字集成电路产品中的边沿触发器电路有:
      • 用两个电平触发 D 触发器构成的边沿触发器、维持阻塞触发器、利用门电路传输延迟时间的边沿触发器等几种较为常见的电路结构形式。

    下图是用两个电平触发 D 触发器组成边沿触发 D 触发器的原理性框图,图中的 FF1和 FF2是两个电平触发的 D触发器(也称为D型锁存器)

    用两个D锁存器组成的边沿触发器
    • 由图可见,当 CLK 处于低电平时:
      •  CLK1为高电平,因而 FF1的输出 Q1跟随输入端 D的状态变化,始终保持 Q1=D
      • 与此同时, CLK2为低电平,FF2的输出 Q2(也就是整个电路最后的输出 Q)保持原来的状态不变
    • CLK由低电平跳变至高电平
      • CLK1随之变成了低电平,于是 Q1保持为 CLK 上升沿到达前瞬间输入端 D的状态此后不再跟随 D的状态而改变
      • 与此同时,CLK2跳变为高电平,使 Q2与它的输入状态相同。由于 FF2的输入就是FF1的输出 Q1,所以输出端 Q便被置成了与CLK 上升沿到达前瞬时 D 端相同的状态,而与以前和以后 D 端的状态无关。

    3.2 边沿触发器的特性表

    在图形符号中,用 CLK输入端处框内的">"表示触发器为边沿触发方式。在特性表中,则用 CLK 一栏里的"↑"表示边沿触发方式,而且是上升沿触发,如下表所示。

    边沿触发器的特性表

    3.3 边沿触发方式的动作特点

    通过对上述边沿触发器工作过程的分析可以看出,边沿触发方式的动作特点,这就是触发器的次态仅取决于时钟信号的上升沿(也称为正边沿)或下降沿(也称为负边沿)到达时输入的逻辑状态,而在这以前或以后,输入信号的变化对触发器输出的状态没有影响。

    4、脉冲触发的触发器

    4.1 电路结构和工作原理

    将边沿触发器里的两个电平触发D触发器(D型锁存器)换成电平触发的SR触发器,如下图所示,来讨论一下它的触发过程。

    脉冲触发的SR触发器

    图(a)的电路是脉冲触发 SR 触发器的典型电路(以前也把这个电路称作主从 SR触发器)。FF1和 FF2分别称为主触发器和从触发器。

    • CLK=0 时,FF1保持原状态不变。
    • CLK变为高电平后,CLK=1、CLK'=0,主触发器的输出 Q1按照 S 和 R 输入端信号被置成相应的状态,而从触发器保持原来的状态不变。
    • CLK 回到低电平,亦即下降沿到来时,从触发器的输出 Q2被置成与此刻 Q1相同的状态,而主触发器开始保持状态不变

    由此可见,在一个时钟周期里,输出端的状态只可能改变一次,而且发生在 CLK的下降沿。这—点和边沿触发器类似。

    但需要注意的是,现在输入端的主触发器 FF1是一个电平触发的 SR 触发器,而不是电平触发的 D 触发器了。

    • 由于在 CLK 高电平期间主触发器输出的状态可能随 S和 R 状态的变化而发生多次翻转输出端的状态不可能始终与输入状态保持一致
    • 因此,在脉冲触发 SR 触发器中,不能像边沿触发器那样,仅仅根据 CLK 下降沿到来时刻输入端 S 和 R 状态确定输出端 Q 的状态,而必须考察全部 CLK=1期间主触发器状态的变化情况。这一点就是脉冲触发方式和边沿触发方式的区别所在。(主触发器的输出≠最后的输出)
      • 例如,在图(a)的电路中,当 CLK=1期间输入信号先是 S=0、R=1,主触发器被置成 Q1=0;随后又变为 S=1、R=0,于是主触发器被置成了 Q1=1。而在 CLK 下降沿到来之前输入又变成了S=0、R=0,这时主触发器将保持 Q1=1不变。这样在 CLK下降沿到来时,输出便被置成 Q=Q1=1。
      • 显然,如果只根据 CLK下降沿到来时的输入状态,是无法正确地确定输出状态的
      • CLK高电平期间输入 S、R 不变的情况下,可以列出脉冲触发 SR 触发器的特性表,如表所示。表中用 CLK一行里的""符号表示脉冲触发方式,而且 CLK 以高电平为有效电平(即 CLK 高电平时接受输入信号),输出端状态的变化则发生在 CLK下降沿。这种情况也称为正脉冲触发
    脉冲触发的SR触发器的特性表

     因为需要等到CLK的有效电平消失后(即回到低电平),输出状态才改变,故也把这种触发方式称为延迟触发

    展开全文
  • Lockup latch的用法,看这个就够了

    千次阅读 2021-05-10 10:04:30
    Lockup latch的用法,看这个就够了! 本公众号秉承 “越分享越有价值,越分享越幸运” 的理念,致力于数字 IC 后端实现方面(涉及逻辑综合,布局布线,静态时序分析,物理验证等)的技术经验交流和分享。目前短期...
  • D latch和D 触发器

    千次阅读 2021-08-06 15:07:57
    D latch和D 触发器 文章目录D latch和D 触发器D latch(电平触发)D触发器(边缘触发)建立时间保持时间分析 D latch(电平触发) 如下图所示,用四个与非门搭建一个经典的锁存器电路。G1,G2形成双稳态电路;G3,G4...
  • 由于latch在使能信号有效时相当于通路,此时,若电路中存在毛刺(glach),则这个毛刺会经过latch传给下一级。而dff触发器,由时钟控制为边沿触发,则有可能将毛刺去除。 2、防止出现latch的方法:使用完整的if-else...
  • 在进行FPGA设计的过程中,经常会在编译程序时发现有一些warning提示生成了一些latch,而且一般FPGA的设计规则也不建议有latch生成。那么,latch究竟是什么东西呢?如果在FPGA设计中不允许latch中现,又如何避免呢? 1...
  • 关于latch的门控时钟

    2020-03-16 12:50:11
    https://www.cnblogs.com/poiu-elab/archive/2012/05/25/2518521.html
  • 对ic设计技术人员来说,latch up是必备的看家本领。不懂这个,可以说,你还得努力学习。
  • latch up 分析

    2020-12-09 11:08:29
    latch up(闩锁反应) 我们无可逃避,只能坚强应对。首先来看一下latch up时拍到的照片 screen.width-430)this.width=screen.width-430" ... 在CMOS制程里,这种情况就是由于npn或pnp结构形成的放大电路造成的。 所
  • 从上面的综合电路可以看出,赋完初值之后,latch消失了。 (3)最后再介绍一种会产生锁存器的情况,如果组合逻辑中always@()块内敏感列表没有列全,该触发的时候没有触发,那么还不是保存了之前的输出结果,因而会...
  • Latch-Up(锁定)是CMOS存在一种寄生电路的效应,它会导致VDD和VSS短路,使得晶片损毁,或者至少系统因电源关闭而停摆。这种效应是早期CMOS技术不能被接受的重要原因之一。在制造更新和充分了解电路设计技巧之后,这种...
  • verilog中latch问题

    2020-08-05 00:04:53
    在很多地方都能看到,verilog中if与case语句必须完整,即if要加上else,case后要加上default语句,以防止锁存器的发生,接下来就来说说其中原因。
  • 芯片latchup原理总结

    2014-11-05 17:09:56
    自己总结的芯片latchup原理,初学者必看。
  • 输入过压保护电路OVP原理和仿真

    千次阅读 2021-03-14 12:13:16
    OVP电路电路设计的时候还是经常遇到的,今天把这块原理和仿真和大家分享一下: 原理图如下所示: 简单的原理:通过P-MOS导通,三极管负责过压保护截止MOS管的导通,停止输出电压的原理。 主要器件和作用: 1,R1和...
  • 目录 前言 一、基本信息 二、基本电气特性 1. PIN定义 2. 电气特性 3. OVP值的设置 4. 时序 5. 其他 三、实际设计案例 1.... 2、OVP的设置电路或采集电路很重要,分压电阻需并联电容,满足电压快速变化时稳压滤波。
  • 在弱信号放大的情况下,尤其是对弱电流放大的情况下,有可能需要在运放的输入端加一个保护环(guard ring,或称屏蔽环),目的是抑制漏电流对运放输入端造成影响
  • OVP 过压保护电路

    万次阅读 多人点赞 2019-02-28 08:49:48
    过压保护电路(OVP)为下游电路提供保护,使其免受过高电压的损坏。OVP电路监测外部电源(如:离线电源或电池)的直流电压,通过下述两种方式中的一种保护后续电路:撬棍钳位电路或串联开关。 撬棍电路对电源进行短路...
  • 过压保护电路(OVP)

    万次阅读 2020-02-04 17:16:37
    作者:AirCity 2020.2.4 ...1 示例一 当VBUS=5V时,各点电压电流如图所示,Q1接近截止,输出信号是5V。...下面是实测波形,这个电路,输出信号的电压不会超过5.4V,这个输出信号可用于电源的控制信号。 2 ...
  • latch-up闩锁效应.pdf

    2021-12-22 10:34:02
    LATCH -UP 定义,产生原因,解决方法,天线效应。对芯片模拟设计,IC 版本有较大帮助
  • 补充说明:latch是电平触发,相当于有一个使能端,且在激活之后(在使能电平的时候)相当于导线了,随输出而变化,在非使能状态下是保持原来的信号,这就可以看出和flip-flop的差别,其实很多时候latch是不能代替ff...
  • Latch与触发器

    2022-04-03 10:17:42
    latch的产生与避免
  • 所有在集成电路(IC)设备上进行的、符合AEC Q100标准的闩锁测试,应符合JEDEC EIA/JESD78规范的最新版本,并有以下澄清和要求(所列章节编号与JEDEC规范相对应)。自本文件的最后一次修订以来,文本的改进和差异...
  • 闩锁效应latch_up

    2015-11-29 13:01:51
    CMOS电路锁定原理及措施 闩锁效应(latch up)是CMOS必须注意的现象,latch解释为回路更合适,大家以后看到latch up就联想到在NMOS与PMOS里面的回路。 为什么它这么重要?因为它会导致整个芯片的失效,所以latch up...
  • D 触发器,是时序逻辑电路是必备的一个基本单元,学好 D 触发器,是学好时序逻辑电路的前提条件,其重要性不亚于加法器,二者共同构成数字组合、时序逻辑电路的基础。  触发器(Flip - Flop): 即能够存储 1位二...
  • verilog latch

    2020-10-21 20:20:26
    1)输入状态可能多次变化,容易产生毛刺,增加了下一级电路的不确定性; 2)在大部分 FPGA 的资源中,可能需要比触发器更多的资源去实现 Latch 结构; 3)锁存器的出现使得静态时序分析变得更
  • FPGA中latch

    2022-03-10 14:25:51
    关于latchlatch简介异步电路与同步电路latch的危害几种产生latch的情况 latch简介 Latch 即锁存器,是一种存在异步电路系统中,对输入信号电平敏感的单元,用来存储信息。 锁存器在数据未锁存时,输出端的信号随输入...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,167
精华内容 1,666
关键字:

latch电路