數(shù)字電路中如何避免產(chǎn)生不必要的鎖存器方法解析:
1. if……else……結構中缺少else
先看一個實際的例子:
用quartus綜合一下這兩個電路,看看產(chǎn)生的RTL圖是怎樣的:
左邊的電路:
右邊的電路:
由RTL視圖可以直觀的看出,左邊的電路沒有生成鎖存器,而右邊的電路生成了一個我們不想要的鎖存器(q1$latch)。左邊的電路是時序邏輯,生成觸發(fā)器,而觸發(fā)器是有使能端(en)的,使能端無效時就可以保存數(shù)據(jù),無需鎖存器。右邊的電路是組合邏輯,在en為低電平時,輸出q1要保持不變,而組合邏輯沒有存儲元件,只能生成鎖存器來保持數(shù)據(jù)。所以在時序邏輯中,不完整的 if…else… 結構并不會生成鎖存器,而組合邏輯中不完整的 if…else… 結構就會生成鎖存器。為了避免我們設計的組合邏輯中出現(xiàn)不想要的鎖存器,在使用 if…else… 結構時一定要寫完整。把剛才例子中右邊的電路寫完整,并查看其RTL視圖如下:
寫完整后,就沒有生成鎖存器,而是生成了一個二選一的選擇器,這正是我們想要設計的。
2. case結構中的分支沒有包含所有情況且沒有default語句
case結構中一般要加上default語句,以保證出現(xiàn)意外情況也可以作出相應的反應。如果沒有加default并且case分支不完整,當出現(xiàn)case分支中沒有列出的情況時,電路狀態(tài)保持原來的狀態(tài)不變,于是就會生成鎖存器來保存狀態(tài),如下圖的電路所示:
圖中case分支中只寫了(se=0)的情況,而(se=1)的情況未給出,且沒有寫default,于是當(se=1)時,q1保持原來的值不變,這樣就產(chǎn)生了鎖存器(q1$latch)。
如果將case分支補全,或者加上default語句,則如下圖所示:
補全case分支后,就不會生成鎖存器了。
同樣,只有在組合邏輯中的case結構才有可能產(chǎn)生鎖存器,而在時序邏輯電路中,即使case結構中的分支不完整,也不會產(chǎn)生鎖存器,如下圖所示:
實際上,在時序邏輯中,由于觸發(fā)器具有鎖存數(shù)據(jù)的功能,所以不會生成鎖存器,鎖存器只會在組合邏輯電路中產(chǎn)生。
因此,在設計組合邏輯電路時,要注意將 if…else… 結構中的else寫完整,case結構中一定要加上default語句,這樣可以減少綜合出鎖存器的可能性。
評論
查看更多