精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

設計Verilog時為什么要避免Latch的產生呢?

冬至子 ? 來源:數字IC與好好生活的兩居室 ? 作者:除夕之夜啊 ? 2023-06-02 11:32 ? 次閱讀

Latch 的含義

◆鎖存器(Latch),是電平觸發的存儲單元,數據存儲的動作取決于輸入時鐘(或者使能)信號的電平值。僅當鎖存器處于使能狀態時,輸出才會隨著數據輸入發生變化。

當電平信號無效時,輸出信號隨輸入信號變化,就像通過了緩沖器;當電平有效時,輸出信號被鎖存。激勵信號的任何變化,都將直接引起鎖存器輸出狀態的改變,很有可能會因為瞬態特性不穩定而產生振蕩現象。

鎖存器示意圖如下:

圖片

◆觸發器(flip-flop),是邊沿敏感的存儲單元,數據存儲的動作(狀態轉換)由某一信號的上升沿或者下降沿進行同步的(限制存儲單元狀態轉換在一個很短的時間內)。

觸發器示意圖如下:

圖片

寄存器(register),在 Verilog 中用來暫時存放參與運算的數據和運算結果的變量。一個變量聲明為寄存器時,它既可以被綜合成觸發器,也可能被綜合成 Latch,甚至是 wire 型變量。

但是大多數情況下我們希望它被綜合成觸發器,但是有時候由于代碼書寫問題,它會被綜合成不期望的 Latch 結構。

◆Latch 的主要危害有:1)輸入狀態可能多次變化,容易產生毛刺,增加了下一級電路的不確定性;2)在大部分 FPGA 的資源中,可能需要比觸發器更多的資源去實現 Latch 結構;3)鎖存器的出現使得靜態時序分析變得更加復雜。

Latch 多用于門控時鐘(clock gating)的控制,設計時一般應當避免 Latch 的產生。

if 結構不完整

◆組合邏輯中,不完整的 if - else 結構,會產生 Latch。

例如下面的模型,if 語句中缺少 else 結構,系統默認 else 的分支下寄存器 q 的值保持不變,即具有存儲數據的功能,所以寄存器 q 會被綜合成 Latch 結構。

module module1_Latch1(
    input       data, 
    input       en ,
    output reg  q) ;

    always @(*) begin
        if (en) q = data ;
    end


endmodule

◆避免此類 Latch 的方法主要有 2 種,一種是補全 if-else 結構,或者對信號賦初值。

例如,上面模型中的 always 語句,可以改為以下兩種形式:

// 補全條件分支結構   
    always @(*) begin
        if (en)  q = data ;
        else     q = 1'b0 ;
    end
//賦初值
    always @(*) begin
        q = 1'b0 ;
        if (en) q = data ; //如果en有效,改寫q的值,否則q會保持為0
    end

◆但是在時序邏輯中,不完整的 if - else 結構,不會產生 Latch,例如下面模型。

這是因為,q 寄存器具有存儲功能,且其值在時鐘的邊沿下才會改變,這正是觸發器的特性。

module module1_ff(
    input       clk ,
    input       data, 
    input       en ,
    output reg  q) ;

    always @(posedge clk) begin
        if (en) q <= data ;
    end


endmodule

◆在組合邏輯中,當條件語句中有很多條賦值語句時,每個分支條件下賦值語句的不完整也是會產生 Latch。

其實對每個信號的邏輯拆分來看,這也相當于是 if-else 結構不完整,相關寄存器信號缺少在其他條件下的賦值行為。例如:

module module1_Latch11(
    input       data1, 
    input       data2, 
    input       en ,
    output reg  q1 ,
    output reg  q2) ;

    always @(*) begin
        if (en)   q1 = data1 ;
        else      q2 = data2 ;
    end


endmodule

這種情況也可以通過補充完整賦值語句或賦初值來避免 Latch。例如:

always @(*) begin
        //q1 = 0; q2 = 0 ; //或在這里對 q1/q2 賦初值
        if (en)  begin
            q1 = data1 ;
            q2 = 1'b0 ;
        end
        else begin
            q1 = 1'b0 ;
            q2 = data2 ;
        end
    end

case 結構不完整

case 語句產生 Latch 的原理幾乎和 if 語句一致。在組合邏輯中,當 case 選項列表不全且沒有加 default 關鍵字,或有多個賦值語句不完整時,也會產生 Latch。例如:

module module1_Latch2(
    input       data1, 
    input       data2, 
    input [1:0] sel ,
    output reg  q ) ;

    always @(*) begin
        case(sel)
            2'b00:  q = data1 ;
            2'b01:  q = data2 ;  //缺少 default 選項
        endcase
    end


endmodule

消除此種 Latch 的方法也是 2 種,將 case 選項列表補充完整,或對信號賦初值。

補充完整 case 選項列表時,可以羅列所有的選項結果,也可以用 default 關鍵字來代替其他選項結果。

例如,上述 always 語句有以下 2 種修改方式。

always @(*) begin
        case(sel)
            2'b00:    q = data1 ;
            2'b01:    q = data2 ;
            default:  q = 1'b0 ;
        endcase
    end
always @(*) begin
        case(sel)
            2'b00:  q = data1 ;
            2'b01:  q = data2 ;
            2'b10, 2'b11 : 
                    q = 1'b0 ;
        endcase
    end

原信號賦值或判斷

在組合邏輯中,如果一個信號的賦值源頭有其信號本身,或者判斷條件中有其信號本身的邏輯,則也會產生 Latch。因為此時信號也需要具有存儲功能,但是沒有時鐘驅動。此類問題在 if 語句、case 語句、問號表達式中都可能出現,例如:

//signal itself as a part of condition
    reg a, b ;
    always @(*) begin
        if (a & b)  a = 1'b1 ;   //a - > Latch
        else a = 1'b0 ;
    end
//signal itself are the assigment source
    reg        c;
    wire [1:0] sel ;
    always @(*) begin
        case(sel)
            2'b00:    c = c ;    //c - > Latch
            2'b01:    c = 1'b1 ;
            default:  c = 1'b0 ;
        endcase
    end
//signal itself as a part of condition in “? expression”
    wire      d, sel2;
    assign    d =  (sel2 && d) ? 1'b0 : 1'b1 ;  //d - > Latch

避免此類 Latch 的方法,就只有一種,即在組合邏輯中避免這種寫法,信號不要給信號自己賦值,且不要用賦值信號本身參與判斷條件邏輯。

例如,如果不要求立刻輸出,可以將信號進行一個時鐘周期的延時再進行相關邏輯的組合。上述第一個產生 Latch 的代碼可以描述為:

reg   a, b ;
    reg   a_r ;

    always (@posedge clk)
        a_r  <= a ;

    always @(*) begin
        if (a_r & b)  a = 1'b1 ;   //there is no Latch
        else a = 1'b0 ;
    end

敏感信號列表不完整

如果組合邏輯中 always@() 塊內敏感列表沒有列全,該觸發的時候沒有觸發,那么相關寄存器還是會保存之前的輸出結果,因而會生成鎖存器。

這種情況,把敏感信號補全或者直接用 always@(*) 即可消除 Latch。

小結

總之,為避免 Latch 的產生,在組合邏輯中,需要注意以下幾點:

1)if-else 或 case 語句,結構一定要完整

2)不要將賦值信號放在賦值源頭,或條件判斷中

3)敏感信號列表建議多用 always@(*)

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • FPGA設計
    +關注

    關注

    9

    文章

    428

    瀏覽量

    26489
  • 寄存器
    +關注

    關注

    31

    文章

    5325

    瀏覽量

    120045
  • Verilog
    +關注

    關注

    28

    文章

    1345

    瀏覽量

    109994
  • 鎖存器
    +關注

    關注

    8

    文章

    905

    瀏覽量

    41448
  • 觸發器
    +關注

    關注

    14

    文章

    1996

    瀏覽量

    61056
收藏 人收藏

    評論

    相關推薦

    CMOS的閂鎖效應:Latch up的原理分析

    電路無法正常工作,甚至燒毀電路。 Latch up是指CMOS晶片中,在電源VDD和地線GND(VSS)之間由于寄生的PNP和NPN雙極性BJT相互影響而產生的一低阻抗通路,它的存在會使VDD和GND之間產生大電流; 隨著IC制
    的頭像 發表于 12-23 16:06 ?5.6w次閱讀
    CMOS的閂鎖效應:<b class='flag-5'>Latch</b> up的原理分析

    芯片設計都不可避免的考慮要素—閂鎖效應latch up

    閂鎖效應,latch up,是個非常重要的問題。現在的芯片設計都不可避免考慮它。我今天就簡單地梳理一下LUP的一些問題。
    的頭像 發表于 12-01 17:11 ?2814次閱讀
    芯片設計都不可<b class='flag-5'>避免</b>的考慮要素—閂鎖效應<b class='flag-5'>latch</b> up

    #硬聲創作季 【4.2】——D-LatchVerilog表述

    fpgaVerilog
    Mr_haohao
    發布于 :2022年09月08日 09:11:17

    [4.2.1]--4-2D-LatchVerilog表述

    Verilog
    李開鴻
    發布于 :2022年11月12日 14:49:30

    Latch UP

    的PNP和NPN雙極性BJT相互影響而產生的一低阻抗通路, 它的存在會使VDD和GND之間產生大電流隨著IC制造工藝的發展, 封裝密度和集成度越來越高,產生Latch up的可能性會越
    發表于 12-16 16:37

    GSM教你理解verilog HDL語言的一些概念

    表:Always過程中,所有被讀取的數據,即等號右邊的變量都要應放在敏感表中,不然,綜合時不能正確地映射到所用的門。12、IF:如果變量沒有在IF語句的每個分支中進行賦值,將會產生latch。如果
    發表于 02-24 10:37

    Verilog綜合遇到的這樣的警告如何處理

    大家好:請教個問題 我是個初學者 對Verilog運用不是很熟悉。我定義了一個輸出寄存器output reg[15:0] INT_PWM_BLOCK,當條件滿足,把這個寄存器的第0位置0,否則為1
    發表于 03-05 15:29

    【鋯石科技】關于 Verilog HDL 語言的一些關鍵問題解惑【免費下載】

    設計③ 如何給端口選擇正確的數據類型④ Verilog語言中latch產生⑤ 組合邏輯反饋環⑥ 阻塞賦值與非阻塞賦值的不同⑦ FPGA的靈魂狀態機⑧ 代碼風格的重要性[hide][/hide]
    發表于 08-17 05:56

    寄生電路的效應:Latch-Up(鎖定)

    了解電路設計技巧之后,這種效應已經可以被控制了。CMOS電路之所以會產生Latch-Up效應,我們可以用圖2.29來表示。在圖中我們以剖面圖來看一個CMOS反相器如何發生此效應,而且它是用P型阱制造
    發表于 08-23 06:06

    請問Latch到底是什么

    (Address Latch Enable)。描述是這樣的,ALE是一個脈沖信號,用來鎖住(Latch)AD0~AD7的地址。這里Latch又是動詞。請問Latch到底是什么意思
    發表于 12-06 10:35

    Verilog基本功--flipflop和latch以及register的區別

    消耗的門資源比ff少。但是你用的如果是 fpga,那么內部一般帶DFF單元,反而用觸發器更好。3、latch與register的區別,為什么現在多用register.行為級描述中latch如何
    發表于 08-27 08:30

    怎么知道產生的PWM波形對不對

    前言在做嵌入式開發的過程中,不可避免的會用到PWM的功能,但是我們怎么知道產生的PWM波形對不對,這個時候可能就需要一臺示波器來測量一下了,但是這始終有點麻煩。于是我嘗試著使用STM32的定時器
    發表于 08-16 09:06

    為什么C語言避免使用Null指針

    為什么C語言避免使用Null指針?指針作為數組的應用有哪些
    發表于 12-20 07:19

    verilog中if與case語句不完整產生鎖存器的原因分析

      在很多地方都能看到,verilog中if與case語句必須完整,即if加上else,case后加上default語句,以防止鎖存器的發生,下載內容中就談到了其中原因。
    發表于 09-16 09:29 ?24次下載

    安全光幕避免在哪些環境下使用

    安全光幕避免在哪些環境下使用
    的頭像 發表于 06-28 14:38 ?418次閱讀
    安全光幕<b class='flag-5'>要</b><b class='flag-5'>避免</b>在哪些環境下使用