關於鎖存器問題的討論

2021-10-03 23:40:21 字數 1656 閱讀 3353

上圖是兩個沒有else的**,其等效於下圖的**。

也就是說,當if條件裡面沒有寫else時,預設是表示「保持不變」的意思。

接下來,我們來討論一下,硬體中是如何實現「保持不變」的。

左邊是時序時序邏輯的**,右邊是該**所對應的硬體電路。特別注意圖中紅色的那個線,那個就是保持不變的「反饋」。由圖中可以看出,當時鐘上公升沿的時候,當選擇器的結果賦值給訊號b;非上公升沿的時候,b一直保持不變,因此紅色線在此期間也是保持不變的。當a為0的時候,選擇器選擇當前b的結果,然後在下乙個時鐘上公升沿賦給訊號b。

由引可見,實現「保持不變」的關鍵在於d暫存器。

眾所周知,組合邏輯**是沒有d暫存器的,那麼它又是如何實現保持不變呢?這個就會用到鎖存器了。

常見問題

問1:是不是所有的**,if else都需要補全呢?

答:如前面所討論的,對於時序邏輯可以由d暫存器實現「保持不變」,所以時序邏輯是不需要補全的,只有組合邏輯才需要。

問2:是不是只要組合邏輯的if else補充了,就不會生成鎖存器了?

答:不一定。這裡的關鍵在於「保持不變」,千萬不要從「**層次」來理解,而應該從「功能的層次」來理解,要找準到底有沒有「保持不變」。例如,下面的**,雖然else寫上去了,但寫不寫else都是讓b保持不變。所以這仍然會綜合出鎖存器。

問3:是不是組合邏輯不寫else,就一定會生成鎖存器?

答:不一定。這裡仍然要從是否包括「保持不變」這個功能來分析。如下面**,假設a是1位元訊號,其值只有0和1。那麼已經涵蓋了所有情況,再不會有其他情況,所以不會出現保持不變的情形,這個時候也不會生成鎖存器。

問4:case不寫default,是否會生成鎖存器?

答:case不寫default,相當於if 條件不寫else,其情況分析跟前面3個問題一樣,關鍵在於有沒有「保持不變」的功能。

問5:功能上,我一定要實現「組合邏輯的保持不變」功能,該如何做?

答:通常來說,所謂「組合邏輯的保持不變」,是指「該段**」是組合邏輯寫的,但需要與前乙個時鐘的值保持不變,如下**,這種需求是很正常的。

解決方法,仍然是靠d觸發器來實現「保持不變」的功能。只不過是把乙個時序邏輯的always寫法,換成組合邏輯+時鐘邏輯的寫法而已,**如下。

問6:問題5的擴充套件,我就是要實現組合邏輯的保持,並且小於乙個時鐘週期的。

答:不正常需求,fpga不會這麼設計的。

關於case語句生成暫存器和鎖存器的討論

太極之道 45662410 下午 9 57 30 你那個絕不是不是單純posedge過程描述的 石小罡 1106256891 下午 9 57 36 對 石小罡 1106256891 下午 9 58 01 習慣性還是寫全else 數字前端學生 2065604636 下午 9 59 31 數字前端學生 ...

關於VerilogHDL生成的鎖存器

總是會遇到有寫文件中提到,不要生成鎖存器。問題是 一 什麼叫鎖存器 二 為什麼不要生成鎖存器 三 如何避免生成鎖存器 好,現在就這三個問題,一一做出解答 一 什麼叫鎖存器 鎖存器 latch 是一種對 脈衝電平敏感的 儲存單元 電路,它們可以在特定輸入脈衝電平作用下改變狀態。鎖存,就是把 訊號暫存以...

關於鎖的討論

一 背景 併發問題一直是企業架構不能忽視的問題,也就是說不可以高枕無憂,始終有些地方你是忽略掉的,對同一片資料庫,不同執行緒同時訪問就會出現併發,併發業務性併發和資料庫併發,事務系統的出現就是為了解決這種併發問題,事務也是利用鎖的原理,鎖定後只允許乙個請求獲得資源,當然事務中的鎖要視事務隔離性而定,...