很多同學(xué)提問到鎖存器的相關(guān)問題,說明大家對(duì)這方面知識(shí)還不是很了解,今天我們就來探討一下。
上面是兩個(gè)沒有else的代碼,其等效于下面的代碼。
也就是說,當(dāng)if條件里面沒有寫else時(shí),默認(rèn)是表示“保持不變”的意思。
接下來,我們來討論一下,硬件中是如何實(shí)現(xiàn)“保持不變”的。
左邊是時(shí)序時(shí)序邏輯的代碼,右邊是該代碼所對(duì)應(yīng)的硬件電路。特別注意圖中紅色的那個(gè)線,那個(gè)就是保持不變的“反饋”。由圖中可以看出,當(dāng)時(shí)鐘上升沿的時(shí)候,當(dāng)選擇器的結(jié)果賦值給信號(hào)b;非上升沿的時(shí)候,b一直保持不變,因此紅色線在此期間也是保持不變的。當(dāng)a為0的時(shí)候,選擇器選擇當(dāng)前b的結(jié)果,然后在下一個(gè)時(shí)鐘上升沿賦給信號(hào)b。
由引可見,實(shí)現(xiàn)“保持不變”的關(guān)鍵在于D寄存器。
眾所周知,組合邏輯代碼是沒有D寄存器的,那么它又是如何實(shí)現(xiàn)保持不變呢?這個(gè)就會(huì)用到鎖存器了。
上圖左邊是組合邏輯代碼,右邊是其電路。為了讓信號(hào)b保持不變,就要用到一個(gè)叫“鎖存器”的器件。當(dāng)a為1時(shí),b就會(huì)等于1;當(dāng)a為0時(shí),b會(huì)保持不變。
關(guān)于鎖存器的危害,可以參考MDY的“FPGA知識(shí)大串講”視頻,總之我們知道鎖存器是不好東西的,盡量不要有鎖存器,也就是說組合邏輯里,要讓“if else”條件補(bǔ)全。
常見問題
問1:是不是所有的代碼,if else都需要補(bǔ)全呢?
答:如前面所討論的,對(duì)于時(shí)序邏輯可以由D寄存器實(shí)現(xiàn)“保持不變”,所以時(shí)序邏輯是不需要補(bǔ)全的,只有組合邏輯才需要。
問2:是不是只要組合邏輯的if else補(bǔ)充了,就不會(huì)生成鎖存器了?
答:不一定。這里的關(guān)鍵在于“保持不變”,千萬不要從“代碼層次”來理解,而應(yīng)該從“功能的層次”來理解,要找準(zhǔn)到底有沒有“保持不變”。例如,下面的代碼,雖然else寫上去了,但寫不寫else都是讓b保持不變。所以這仍然會(huì)綜合出鎖存器。
問3:是不是組合邏輯不寫else,就一定會(huì)生成鎖存器?
答:不一定。這里仍然要從是否包括“保持不變”這個(gè)功能來分析。如下面代碼,假設(shè)a是1比特信號(hào),其值只有0和1。那么已經(jīng)涵蓋了所有情況,再不會(huì)有其他情況,所以不會(huì)出現(xiàn)保持不變的情形,這個(gè)時(shí)候也不會(huì)生成鎖存器。
問4:case不寫default,是否會(huì)生成鎖存器?
答:case不寫default,相當(dāng)于if條件不寫else,其情況分析跟前面3個(gè)問題一樣,關(guān)鍵在于有沒有“保持不變”的功能。
問5:功能上,我一定要實(shí)現(xiàn)“組合邏輯的保持不變”功能,該如何做?
答:通常來說,所謂“組合邏輯的保持不變”,是指“該段代碼”是組合邏輯寫的,但需要與前一個(gè)時(shí)鐘的值保持不變,如下代碼,這種需求是很正常的。
解決方法,仍然是靠D觸發(fā)器來實(shí)現(xiàn)“保持不變”的功能。只不過是把一個(gè)時(shí)序邏輯的ALWAYS寫法,換成組合邏輯+時(shí)鐘邏輯的寫法而已,代碼如下。
問6:?jiǎn)栴}5的擴(kuò)展,我就是要實(shí)現(xiàn)組合邏輯的保持,并且小于一個(gè)時(shí)鐘周期的。
答:不正常需求,F(xiàn)PGA不會(huì)這么設(shè)計(jì)的。