色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

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

3天內(nèi)不再提示

Verilog競爭與冒險的產(chǎn)生原因與判斷方法

冬至子 ? 來源:數(shù)字IC與好好生活的兩居室 ? 作者:除夕之夜啊 ? 2023-06-01 15:19 ? 次閱讀

產(chǎn)生原因

數(shù)字電路中,信號傳輸與狀態(tài)變換時都會有一定的延時。

◆在組合邏輯電路中,不同路徑的輸入信號變化傳輸?shù)酵稽c門級電路時,在時間上有先有后,這種先后所形成的時間差稱為競爭(Competition)。

◆由于競爭的存在,輸出信號需要經(jīng)過一段時間才能達到期望狀態(tài),過渡時間內(nèi)可能產(chǎn)生瞬間的錯誤輸出,例如尖峰脈沖。這種現(xiàn)象被稱為冒險(Hazard)。

◆競爭不一定有冒險,但冒險一定會有競爭。

例如,對于給定邏輯 F = A & A',電路如左下圖所示。

由于反相器電路的存在,信號 A' 傳遞到與門輸入端的時間相對于信號 A 會滯后,這就可能導(dǎo)致與門最后的輸出結(jié)果 F 會出現(xiàn)干擾脈沖。如右下圖所示。

圖片

圖片

其實實際硬件電路中,只要門電路各個輸入端延時不同,就有可能產(chǎn)生競爭與冒險。

例如一個簡單的與門,輸入信號源不一定是同一個信號變換所來,由于硬件工藝、其他延遲電路的存在,也可能產(chǎn)生競爭與冒險,如下圖所示。

圖片

判斷方法

◆代數(shù)法

在邏輯表達式,保持一個變量固定不動,將剩余其他變量用 0 或 1 代替,如果最后邏輯表達式能化簡成

Y = A + A' 或 Y = A · A'

的形式,則可判定此邏輯存在競爭與冒險。

例如邏輯表達式 Y = AB + A'C,在 B=C=1 的情況下,可化簡為 Y = A + A'。顯然,A 狀態(tài)的改變,勢必會造成電路存在競爭冒險。

◆卡諾圖法

有兩個相切的卡諾圈,并且相切處沒有其他卡諾圈包圍,可能會出現(xiàn)競爭與冒險現(xiàn)象。

例如左下圖所存在競爭與冒險,右下圖則沒有。

圖片

其實,卡諾圖本質(zhì)上還是對邏輯表達式的一個分析,只是可以進行直觀的判斷。

例如,左上圖邏輯表達式可以簡化為 Y = A'B' + AC,當 B=0 且 C=1 時,此邏輯表達式又可以表示為 Y = A' + A。所以肯定會存在競爭與冒險。

右上圖邏輯表達式可以簡化為 Y = A'B' + AB,顯然 B 無論等于 1 還是 0,此式都不會化簡成 Y = A' + A。所以此邏輯不存在競爭與冒險。

需要注意的是,卡諾圖是首尾相臨的。如下圖所示,雖然看起來兩個卡諾圈并沒有相切,但實際上,m6 與 m4 也是相鄰的,所以下面卡諾圖所代表的數(shù)字邏輯也會產(chǎn)生競爭與冒險。

圖片

◆其他較為復(fù)雜的情況,可能需要采用 “計算機輔助分析 + 實驗” 的方法。

消除方法

對數(shù)字電路來說,常見的避免競爭與冒險的方法主要有4種。

1)增加濾波電容,濾除窄脈沖

此種方法需要在輸出端并聯(lián)一個小電容,將尖峰脈沖的幅度削弱至門電路閾值以下。

此方法雖然簡單,但是會增加輸出電壓的翻轉(zhuǎn)時間,易破壞波形。

2)修改邏輯,增加冗余項

利用卡諾圖,在兩個相切的圓之間,增加一個卡諾圈,并加在邏輯表達式之中。

如下圖所示,對數(shù)字邏輯 Y = A'B' + AC 增加冗余項 B'C,則此電路邏輯可以表示為 Y = A'B' + AC + B'C。此時電路就不會再存在競爭與冒險。

圖片

3)使用時鐘同步電路,利用觸發(fā)器進行打拍延遲

同步電路信號的變化都發(fā)生在時鐘邊沿。對于觸發(fā)器的 D 輸入端,只要毛刺不出現(xiàn)在時鐘的上升沿并且不滿足數(shù)據(jù)的建立和保持時間,就不會對系統(tǒng)造成危害,因此可認為 D 觸發(fā)器的 D 輸入端對毛刺不敏感。

利用此特性,在時鐘邊沿驅(qū)動下,對一個組合邏輯信號進行延遲打拍,可消除競爭冒險。

延遲一拍時鐘時,會一定概率的減少競爭冒險的出現(xiàn)。實驗表明,最安全的打拍延遲周期是 3 拍,可有效減少競爭冒險的出現(xiàn)。

當然,最終還是需要根據(jù)自己的設(shè)計需求,對信號進行合理的打拍延遲。

◆為說明對信號進行打拍延遲可以消除競爭冒險,我們建立下面的代碼模型。

module competition_hazard
    (
      input             clk ,
      input             rstn ,
      input             en ,
      input             din_rvs ,
      output reg        flag
    );


    wire    condition = din_rvs & en ;  //combination logic
    always @(posedge clk or negedge !rstn) begin
        if (!rstn) begin
            flag   <= 1'b0 ;
        end
        else begin
            flag   <= condition ;
        end
    end 


endmodule

testbench 描述如下:

`timescale 1ns/1ns


module test ;
    reg          clk, rstn ;
    reg          en ;
    reg          din_rvs ;
    wire         flag_safe, flag_dgs ;


    //clock and rstn generating 
    initial begin
        rstn              = 1'b0 ;
        clk               = 1'b0 ;
        #5 rstn           = 1'b1 ;
        forever begin
            #5 clk = ~clk ;
        end
    end


    initial begin
        en        = 1'b0 ;
        din_rvs   = 1'b1 ;
        #19 ;      en        = 1'b1 ;
        #1 ;       din_rvs   = 1'b0 ;
    end


    competition_hazard         u_dgs
     (
      .clk              (clk           ),
      .rstn             (rstn          ),
      .en               (en            ),
      .din_rvs          (din_rvs       ),
      .flag             (flag_dgs      ));


    initial begin
        forever begin
            #100;
            if ($time >= 1000)  $finish ;
        end
    end
endmodule

仿真結(jié)果如下。

由圖可知,信號 condition 出現(xiàn)了一個尖峰脈沖,這是由于信號 din_rvs 與信號 en 相對于模塊內(nèi)部時鐘都是異步的,所以到達內(nèi)部門電路時的延時是不同的,就有可能造成競爭冒險。

雖然最后的仿真結(jié)果 flag 一直為 0,似乎是我們想要的結(jié)果。但是實際電路中,這個尖峰脈沖在時間上非常靠近時鐘邊沿,就有可能被時鐘采集到而產(chǎn)生錯誤結(jié)果。

圖片

◆下面我們對模型進行改進,增加打拍延時的邏輯,如下:

module clap_delay
    (
      input             clk ,
      input             rstn ,
      input             en ,
      input             din_rvs ,
      output reg        flag
    );


    reg                  din_rvs_r ;
    reg                  en_r ;
    always @(posedge clk or !rstn) begin
        if (!rstn) begin
            din_rvs_r      <= 1'b0 ;
            en_r           <= 1'b0 ;
        end
        else begin
            din_rvs_r      <= din_rvs ;
            en_r           <= en ;
        end
    end


    wire                 condition = din_rvs_r & en_r ;
    always @(posedge clk or negedge !rstn) begin
        if (!rstn) begin
            flag   <= 1'b0 ;
        end
        else begin
            flag   <= condition ;
        end
    end // always @ (posedge clk or negedge !rstn)

endmodule

◆將此模塊例化到上述 testbench 中,得到如下仿真結(jié)果。

由圖可知,信號 condition 沒有尖峰脈沖的干擾了,仿真結(jié)果中 flag 為 0 也如預(yù)期。

其實,輸入信號與時鐘邊沿非常接近的情況下,時鐘對輸入信號的采樣也存在不確定性,但是不會出現(xiàn)尖峰脈沖的現(xiàn)象。對輸入信號多打 2 拍,是更好的處理方式,對競爭與冒險有更好的抑制作用。

圖片

4)采用格雷碼計數(shù)器

遞加的多 bit 位計數(shù)器,計數(shù)值有時候會發(fā)生多個 bit 位的跳變。

例如計數(shù)器變量 counter 從 5 計數(shù)到 6 時, 對應(yīng)二進制數(shù)字為 4'b101 到 4'b110 的轉(zhuǎn)換。因為各 bit 數(shù)據(jù)位的延時,counter 的變換過程可能是:4'b101 -> 4'b111 -> 4'b110。

如果有以下邏輯描述,則信號 cout 可能出現(xiàn)短暫的尖峰脈沖,這顯然是與設(shè)計相悖的。

cout = counter[3:0] == 4'd7 ;

而格雷碼計數(shù)器,計數(shù)時相鄰的數(shù)之間只有一個數(shù)據(jù) bit 發(fā)生了變化,所以能有效的避免競爭冒險。

好在 Verilog 設(shè)計時,計數(shù)器大多都是同步設(shè)計。即便計數(shù)時存在多個 bit 同時翻轉(zhuǎn)的可能性,但在時鐘驅(qū)動的觸發(fā)器作用下,只要信號間滿足時序要求,就能消除掉 100% 的競爭與冒險。

◆小結(jié)

一般來說,為消除競爭冒險,增加濾波電容和邏輯冗余,都不是 Verilog 設(shè)計所考慮的。

計數(shù)采用格雷碼計數(shù)器,也大多應(yīng)用在高速時鐘下減少信號翻轉(zhuǎn)率來降低功耗的場合。

利用觸發(fā)器在時鐘同步電路下對異步信號進行打拍延時,是 Verilog 設(shè)計中經(jīng)常用到的方法。

Verilog 書寫規(guī)范

編程時多注意以下幾點,也可以避免大多數(shù)的競爭與冒險問題。

  • 1)時序電路建模時,用非阻塞賦值。
  • 2)組合邏輯建模時,用阻塞賦值。
  • 3)在同一個 always 塊中建立時序和組合邏輯模型時,用非阻塞賦值。
  • 4)在同一個 always 塊中不要既使用阻塞賦值又使用非阻塞賦值。
  • 5)不要在多個 always 塊中為同一個變量賦值。
  • 6)避免 latch 產(chǎn)生。

下面,對以上注意事項逐條分析。

1)時序電路建模時,用非阻塞賦值

前面講述非阻塞賦值時就陳述過,時序電路中非阻塞賦值可以消除競爭冒險。

例如下面代碼描述,由于無法確定 a 與 b 阻塞賦值的操作順序,就有可能帶來競爭冒險。

always @(posedge clk) begin
    a = b ;
    b = a ;
end

而使用非阻塞賦值時,賦值操作是同時進行的,所以就不會帶來競爭冒險,如以下代碼描述。

always @(posedge clk) begin
    a <= b ;
    b <= a ;
end

2)組合邏輯建模時,用阻塞賦值

例如,我們想實現(xiàn) C = A&B, F=C&D 的組合邏輯功能,用非阻塞賦值語句如下。

兩條賦值語句同時賦值,F(xiàn) <= C & D 中使用的是信號 C 的舊值,所以導(dǎo)致此時的邏輯是錯誤的,F(xiàn) 的邏輯值不等于 A&B&D。

而且,此時要求信號 C 具有存儲功能,但不是時鐘驅(qū)動,所以 C 可能會被綜合成鎖存器(latch),導(dǎo)致競爭冒險。

always @(*) begin
    C <= A & B ;
    F <= C & D ;
end

對代碼進行如下修改,F(xiàn) = C & D 的操作一定是在 C = A & B 之后,此時 F 的邏輯值等于 A&B&D,符合設(shè)計。

always @(*) begin
    C = A & B ;
    F = C & D ;
end

3)在同一個 always 塊中建立時序和組合邏輯模型時,用非阻塞賦值

雖然時序電路中可能涉及組合邏輯,但是如果賦值操作使用非阻塞賦值,仍然會導(dǎo)致如規(guī)范 1 中所涉及的類似問題。

例如在時鐘驅(qū)動下完成一個與門的邏輯功能,代碼參考如下。

always @(posedge clk or negedge rst_n)
    if (!rst_n) begin
        q <= 1'b0;
    end
    else begin
        q <= a & b;  //即便有組合邏輯,也不要寫成:q = a & b
     end
end

4)在同一個 always 塊中不要既使用阻塞賦值又使用非阻塞賦值

◆always 涉及的組合邏輯中,既有阻塞賦值又有非阻塞賦值時,會導(dǎo)致意外的結(jié)果,例如下面代碼描述。

此時信號 C 阻塞賦值完畢以后,信號 F 才會被非阻塞賦值,仿真結(jié)果可能正確。

但如果 F 信號有其他的負載,F(xiàn) 的最新值并不能馬上傳遞出去,數(shù)據(jù)有效時間還是在下一個觸發(fā)時刻。此時要求 F 具有存儲功能,可能會被綜合成 latch,導(dǎo)致競爭冒險。

always @(*) begin
    C = A & B ;
    F <= C & D ;
end

如下代碼描述,仿真角度看,信號 C 被非阻塞賦值,下一個觸發(fā)時刻才會有效。而 F = C & D 雖然是阻塞賦值,但是信號 C 不是阻塞賦值,所以 F 邏輯中使用的還是 C 的舊值。

always @(*) begin
    C <= A & B ;
    F = C & D ;
end

◆下面分析假如在時序電路里既有阻塞賦值,又有非阻塞賦值會怎樣,代碼如下。

假如復(fù)位端與時鐘同步,那么由于復(fù)位導(dǎo)致的信號 q 為 0,是在下一個時鐘周期才有效。

而如果是信號 a 或 b 導(dǎo)致的 q 為 0,則在當期時鐘周期內(nèi)有效。

如果 q 還有其他負載,就會導(dǎo)致 q 的時序特別混亂,顯然不符合設(shè)計需求。

always @(posedge clk or negedge rst_n)
    if (!rst_n) begin  //假設(shè)復(fù)位與時鐘同步
        q <= 1'b0;
    end
    else begin
        q = a & b;  
    end
end

需要說明的是,很多編譯器都支持這么寫,上述的分析也都是建立在仿真角度上。實際中如果阻塞賦值和非阻塞賦值混合編寫,綜合后的電路時序?qū)⑹清e亂的,不利于分析調(diào)試。

5)不要在多個 always 塊中為同一個變量賦值

與 C 語言有所不同,Verilog 中不允許在多個 always 塊中為同一個變量賦值。此時信號擁有多驅(qū)動端(Multiple Driver),是禁止的。當然,也不允許 assign 語句為同一個變量進行多次連線賦值。

從信號角度來講,多驅(qū)動時,同一個信號變量在很短的時間內(nèi)進行多次不同的賦值結(jié)果,就有可能產(chǎn)生競爭冒險。

從語法來講,很多編譯器檢測到多驅(qū)動時,也會報 Error。

6)避免 latch 產(chǎn)生

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 濾波電容
    +關(guān)注

    關(guān)注

    8

    文章

    458

    瀏覽量

    40089
  • 反相器
    +關(guān)注

    關(guān)注

    6

    文章

    311

    瀏覽量

    43401
  • 門電路
    +關(guān)注

    關(guān)注

    7

    文章

    199

    瀏覽量

    40197
  • 數(shù)字電路
    +關(guān)注

    關(guān)注

    193

    文章

    1608

    瀏覽量

    80696
  • 觸發(fā)器
    +關(guān)注

    關(guān)注

    14

    文章

    2000

    瀏覽量

    61229
收藏 人收藏

    評論

    相關(guān)推薦

    競爭冒險產(chǎn)生原因判斷方法和避免競爭冒險方法

    在實際的電路設(shè)計過程中,存在傳播延時和信號變換延時。由延時引起的競爭冒險現(xiàn)象會影響輸出的正確與否。下面將就 競爭冒險產(chǎn)生
    的頭像 發(fā)表于 02-18 14:34 ?8407次閱讀
    <b class='flag-5'>競爭</b>與<b class='flag-5'>冒險</b><b class='flag-5'>產(chǎn)生</b>的<b class='flag-5'>原因</b>,<b class='flag-5'>判斷</b><b class='flag-5'>方法</b>和避免<b class='flag-5'>競爭</b>與<b class='flag-5'>冒險</b>的<b class='flag-5'>方法</b>

    FPGA中競爭冒險的前世今生

    競爭冒險:在組合電路中,當邏輯門有兩個互補輸入信號同時向相反狀態(tài)變化時,輸出端可能產(chǎn)生過渡干擾脈沖的現(xiàn)象,稱為競爭冒險。那么 FPGA
    發(fā)表于 02-21 16:26

    FPGA設(shè)計中競爭冒險問題的研究

     摘 要:以現(xiàn)場可編程門陣列(以下簡稱FPGA)在設(shè)計中由于其內(nèi)部構(gòu)成,容易引起競爭問題。以我們在實驗教學(xué)中的應(yīng)用與實踐為主線,詳細介紹了消除競爭冒險的各種方法。關(guān)鍵詞:現(xiàn)場
    發(fā)表于 04-21 16:44

    怎樣消除競爭冒險

    ; elseout=0;endendmodule在進行門級仿真的時候波形中出現(xiàn)了毛刺,也就是所謂的競爭冒險,如下圖書上也有競爭冒險的解決辦法,但具體到代碼里還是不會,誰能教教我該怎么改
    發(fā)表于 10-21 14:31

    FPGA中競爭冒險問題的研究

    FPGA中競爭冒險問題的研究
    發(fā)表于 08-04 16:16

    組合邏輯電路的競爭冒險,輸入信號同時從1變0會產(chǎn)生競爭冒險

    `對于一個組合邏輯電路,如果有兩個輸入端,那么只有兩個輸入端一個從0變1,另一個從1變0是才有可能產(chǎn)生競爭冒險嗎,如果開始時兩個輸入端都是1,那么同時從1變0時會不會產(chǎn)生
    發(fā)表于 12-22 18:49

    FPGA中的競爭冒險現(xiàn)象

    通過改變設(shè)計,破壞毛刺產(chǎn)生的條件,來減少毛刺的發(fā)生。例如,在數(shù)字電路設(shè)計中,常常采用格雷碼計數(shù)器取代普通的二進制計數(shù)器,這是因為格雷碼計數(shù)器的輸出每次只有一位跳變,消除了競爭冒險的發(fā)生條件,避免了毛刺
    發(fā)表于 08-01 09:53

    什么是競爭冒險現(xiàn)象?怎樣判斷?如何消除?

     在組合邏輯中,由于門的輸入信號通路中經(jīng)過了不同的延時,導(dǎo)致到達該門的時間不一致叫競爭產(chǎn)生毛刺叫冒險。    如果布爾式中有相反的信號則可能產(chǎn)生
    發(fā)表于 08-02 11:57

    簡談FPGA的競爭冒險和毛刺問題

    問題。 競爭冒險:在組合電路中,當邏輯門有兩個互補輸入信號同時向相反狀態(tài)變化時,輸出端可能產(chǎn)生過渡干擾脈沖的現(xiàn)象,稱為競爭冒險
    發(fā)表于 05-30 17:15

    FPGA | 競爭冒險和毛刺問題

    ,某一輸入變量經(jīng)過不同途徑傳輸后,到達電路中某一匯合點的時間有先有后,這種現(xiàn)象稱競爭;由于競爭而使電路輸出發(fā)生瞬時錯誤的現(xiàn)象叫做冒險。(也就是由于競爭產(chǎn)生的毛刺叫做
    發(fā)表于 11-02 17:22

    第二十一講 組合邏輯電路中的競爭冒險

    第二十一講 組合邏輯電路中的競爭冒險 6.7.1 競爭冒險現(xiàn)象及其產(chǎn)生原因一、
    發(fā)表于 03-30 16:25 ?3092次閱讀
    第二十一講 組合邏輯電路中的<b class='flag-5'>競爭</b><b class='flag-5'>冒險</b>

    組合邏輯中的競爭冒險及毛刺的處理方法

    組合邏輯中的競爭冒險及毛刺的處理方法 在組合邏輯中,由于門的輸入信號通路中經(jīng)過了不同的延時,導(dǎo)致到達該門的時間不一致叫競爭產(chǎn)生毛刺叫
    發(fā)表于 01-24 18:12 ?0次下載
    組合邏輯中的<b class='flag-5'>競爭</b>與<b class='flag-5'>冒險</b>及毛刺的處理<b class='flag-5'>方法</b>

    組合邏輯中的競爭冒險及毛刺的處理方法

    組合邏輯中的競爭冒險及毛刺的處理方法
    發(fā)表于 01-17 19:54 ?7次下載

    電路存在競爭冒險產(chǎn)生原因

    簡言之:在組合邏輯中,由于門的輸入信號通路中經(jīng)過了不同的延時,導(dǎo)致到達該門的時間不一致叫競爭競爭產(chǎn)生冒險
    發(fā)表于 06-26 06:38 ?1.9w次閱讀

    毛刺的產(chǎn)生原因冒險競爭

    冒險按照產(chǎn)生方式分為靜態(tài)冒險 & 動態(tài)冒險兩大類。靜態(tài)冒險指輸入有變化,而輸出不應(yīng)該變化時產(chǎn)生
    的頭像 發(fā)表于 04-29 10:33 ?5310次閱讀
    主站蜘蛛池模板: www红色一片| 免费伦理片网站| 亚洲国产在线视频中文字| 精品国产福利在线视频| 97精品国产自产在线观看永久| 强行撕开衣服捏胸黄文| 国产亚洲精品久久无码98 | 最新色导航| 日韩欧美一区二区三区在线视频| 国产偷国产偷亚州清高| 91进入蜜桃臀在线播放| 色欲档案之麻雀台上淫| 久久亚洲成a人片| 公和熄洗澡三级中文字幕| 一区两区三不卡| 色综合a在线| 美女被触手注入精子强制受孕漫画| 嘟嘟嘟WWW在线观看视频高清| 伊人大香线蕉精品在线播放| 日本浴室日产在线系列| 久久精品伊人| 国产久久亚洲美女久久| 99视频在线精品免费观看18| 亚洲日本欧美天堂在线| 日韩精品久久久久影院| 老司机福利在 线影院| 国产精品嫩草影院| 99精品电影| 亚洲偷偷自拍免费视频在线| 日本妈妈JMZZZZZ| 美女伸开两腿让我爽| 好硬好湿好爽再深一点视频| 厨房玩朋友娇妻中文字幕| 在线欧美 精品 第1页| 午夜在线视频国产极品片| 欧美午夜a级精美理论片| 久久久久久久久女黄| 国产亚洲精品福利视频| 福利免费观看体检区| a在线免费观看视频| 777久久人妻少妇嫩草AV蜜桃|