首先應該明確鎖存器和觸發器也是由與非門之類的東西構成。尤其是鎖存器,雖說數字電路定義含有鎖存器或觸發器的電路叫時序電路,但鎖存器有很多組合電路的特性。
組合電路就是一個真值表,一個函數,一組輸入對應一組輸出,當前什么輸入就根據函數得到什么輸出,實時跟蹤變化,這樣也就容易有冒險、競爭之類的問題產生毛刺。
鎖存器:電平敏感
always @ (enable)
??if (enable) ?q <= d;
那就是說,在enable有效的時間內,q完全跟蹤d的值,比如在這個時間內d變化了,q跟着變化,當enable失效的時候,q存儲d最后的值。
觸發器:我們把輸出只在時鍾某個時刻變化的玩意兒叫觸發器。邊沿敏感
always @ (posedge enable)
??if (enable) q <= d;
這個便是一個d觸發器。只在enable(一般大家都叫它clock)的上升沿q采樣d,而且在每個時鍾的上升沿都會采樣。
在fpga中一般避免用latch,因為在FPGA中觸發器資源豐富,不用白不用,latch由於是電平觸發的,相對觸發器來說容 易產生毛刺,電路不穩定.
latch的優點是完成同一個功能所需要的門較觸發器要少,所以在asic中用的較多
?
那最后再說寄存器,寄存器這個玩意兒是一個概念層次的東西,1個寄存器就是能存1bit數據的東西。既可以用觸發器實現也可以用鎖存器實現。以觸發器為例,由於觸發器每個時鍾上升沿都會采樣,所以觸發器會有一個反饋邏輯,當load有效的時候才會采樣d,否則保持不變。
always @ (posedge clk or negedge rst_n)
if (!rst_n)
q <= 0;
else if (load)
q <= d;
這便就是一個寄存器了。
(2)寄存器的輸出端平時不隨輸入端的變化而變化,只有在時鍾有效時才將輸入端的數據送輸出端(打入寄存器),而鎖存器的輸出端平時總隨輸入端變化而變化,只有當鎖存器信號到達時,才將輸出端的狀態鎖存起來,使其不再隨輸入端的變化而變化
可見,寄存器和鎖存器具有不同的應用場合,取決於控制方式以及控制信號 和數據之間的時間關系:若數據有效一定滯后於控制信號有效,則只能使用鎖存器;數據提前於控制信號而到達並且要求同步操作,則可用寄存器來存放數據。