數字電路中應避免產生不必要的鎖存器 Latch


鎖存器(Latch)是數字邏輯電路中很重要的一種基本電路,常見的鎖存器包括三個端口:數據輸入口、數據輸出口、使能端。當使能端為高電平時,輸入口的數據直接送到輸出口,此時輸入輸出口可以看成是直接連通的;當使能端為低電平時,輸出口的數據保持之前的數據不變,無論輸入口的數據怎么變化,輸出都保持不變,就是把原來的狀態鎖存下來了(所以才叫鎖存器)。鎖存器與觸發器的區別在於:鎖存器是電平觸發,而觸發器是邊沿觸發。鎖存器在不鎖存數據時,輸出隨輸入變化;但一旦數據鎖存時,輸入對輸出不產生任何影響

在FPGA電路設計中,不規范的描述語言可能會產生意想不到的鎖存器,而設計者往往並沒有注意到自己的設計會被綜合出鎖存器,導致綜合出的電路出現邏輯錯誤。

在數字電路中,產生意外的鎖存器的情況一般有以下兩種:

1. if……else……結構中缺少else

先看一個實際的例子:

if else鎖存器

用quartus綜合一下這兩個電路,看看產生的RTL圖是怎樣的:

左邊的電路:

時序邏輯

右邊的電路:

組合邏輯

由RTL視圖可以直觀的看出,左邊的電路沒有生成鎖存器,而右邊的電路生成了一個我們不想要的鎖存器(q1$latch)。左邊的電路是時序邏輯,生成觸發器,而觸發器是有使能端(en)的,使能端無效時就可以保存數據,無需鎖存器。右邊的電路是組合邏輯,在en為低電平時,輸出q1要保持不變,而組合邏輯沒有存儲元件,只能生成鎖存器來保持數據。所以在時序邏輯中,不完整的 if…else… 結構並不會生成鎖存器,而組合邏輯中不完整的 if…else… 結構就會生成鎖存器。為了避免我們設計的組合邏輯中出現不想要的鎖存器,在使用 if…else… 結構時一定要寫完整。把剛才例子中右邊的電路寫完整,並查看其RTL視圖如下:

完整的組合邏輯

寫完整后,就沒有生成鎖存器,而是生成了一個二選一的選擇器,這正是我們想要設計的。

2. case結構中的分支沒有包含所有情況且沒有default語句

case結構中一般要加上default語句,以保證出現意外情況也可以作出相應的反應。如果沒有加default並且case分支不完整,當出現case分支中沒有列出的情況時,電路狀態保持原來的狀態不變,於是就會生成鎖存器來保存狀態,如下圖的電路所示:

case鎖存

圖中case分支中只寫了(se=0)的情況,而(se=1)的情況未給出,且沒有寫default,於是當(se=1)時,q1保持原來的值不變,這樣就產生了鎖存器(q1$latch)

如果將case分支補全,或者加上default語句,則如下圖所示:

case無鎖存

補全case分支后,就不會生成鎖存器了。

同樣,只有在組合邏輯中的case結構才有可能產生鎖存器,而在時序邏輯電路中,即使case結構中的分支不完整,也不會產生鎖存器,如下圖所示:

case時序邏輯

實際上,在時序邏輯中,由於觸發器具有鎖存數據的功能,所以不會生成鎖存器,鎖存器只會在組合邏輯電路中產生。

因此,在設計組合邏輯電路時,要注意將 if…else… 結構中的else寫完整,case結構中一定要加上default語句,這樣可以減少綜合出鎖存器的可能性。

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM