verilog中if與case語句必須完整,即if要加上else,case后要加上default語句,以防止鎖存器的發生,接下來就來說說其中原因。
一,什么是鎖存器?鎖存器與觸發器的區別。http://www.eefocus.com/liuyuxue/blog/13-11/300280_d7008.html
鎖存器與觸發器最大的區別在於,鎖存器是電平觸發,而觸發器是邊沿觸發。鎖存器在不鎖存數據時,輸出隨輸入變化;但一旦數據鎖存時,輸入對輸出不產生任何影響。
鎖存器和觸發器區別
http://wenku.baidu.com/link?url=co1YvI0Ktb7sItCPzqNXiy7SXyWigv7uAnWaL3EtOT_7T7XsYOXIcfCTlYvlqPgPhy3bBpbeiQAcM2hVAUbK9qiJxRI3F0JctHaLCsWrYiS(寫的挺好的)
二,為什么語句的不完整會導致鎖存器的產生?
解:
老阮 (2014-10-21 19:30:10)
1、時序電路,生成觸發器,觸發器是有使能端的,使能端無效時數據不變,這是觸發器的特性。
2、組合邏輯,由於數據要保持不變,只能通過鎖存器來保存。
樓主位的第二個代碼就是在enable為低時,數據不變,因此要生成鎖存器。 第一個代碼,由於是時序邏輯,生成的觸發器在enable無效時就可以保存數據。跟鎖存器無關。
個人理解: 所謂生成latch其實是針對使用always語句描述一個組合邏輯而言,因為如果描述時序邏輯總是使用時鍾或者時鍾+復位作為敏感列表條件,所生成的電路總是組合邏輯+DFF;如果是描述組合邏輯,敏感列表中必然沒有時鍾復位,而是組合邏輯的輸入信號。在FPGA設計,避免使用latch,不利於時序分析和仿真。 樓上有提到latch比DFF省資源, 這個在FPGA設計中其實還好, 因為在FPGA中DFF就是一個專用的硬件資源,並且數量也比較多。
使用always描述組合邏輯時,好的習慣是使用always @(*)作為敏感列表, 並且需要檢查每個分支都有明確的賦值,從而避免生成latch.
使用always描述組合邏輯時,好的習慣是使用always @(*)作為敏感列表, 並且需要檢查每個分支都有明確的賦值,從而避免生成latch.
我是這么理解的,在一份資料看的,
時序電路=組合邏輯電路+儲存電路;
儲存電路有兩個:鎖存器(latch)和觸發器;
邊沿觸發產生觸發器,
電平觸發產生鎖存器,
多個觸發器組成寄存器,
當描述的是時序電路,寄存器變量對應的寄存器,
描述的是完整的組合邏輯電路,對應為硬件連線,
當描述的是不完整組合邏輯,則寄存器對應的是鎖存
時序電路=組合邏輯電路+儲存電路;
儲存電路有兩個:鎖存器(latch)和觸發器;
邊沿觸發產生觸發器,
電平觸發產生鎖存器,
多個觸發器組成寄存器,
當描述的是時序電路,寄存器變量對應的寄存器,
描述的是完整的組合邏輯電路,對應為硬件連線,
當描述的是不完整組合邏輯,則寄存器對應的是鎖存
總結:
1,存儲單元按照觸發的方式分為電平觸發和邊沿觸發,電平觸發的為鎖存器,邊沿觸發的觸發器。 2,對於if,case的完整性,@老阮已經說的很清楚了,在FPGA建議使用觸發器。