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