問題:
什么是鎖存器?
什么時候出現鎖存器?
鎖存器對電路有什么影響?
如何在FPGA設計中避免鎖存器?
在FPGA設計中應該避免鎖存器.實際上,鎖存器與D觸發器實現的邏輯功能基本相同,都有暫存數據的功能。但如果兩者都由與非門搭建的話,鎖存器耗用的邏輯資源要比D觸發器少(D觸發器需要12個MOS管,鎖存器只需6個MOS管),鎖存器的集成度更高。所以在的ASIC設計中會用到鎖存器。但鎖存器對毛刺敏感,無異步復位端,不能讓芯片在上電時處在確定的狀態;另外,鎖存器會使靜態時序分析變得很復雜,不利於設計的可重用,所以,在ASIC設計中,除了CPU這高速電路,或者RAM這種對面積很敏感的電路,一般不提倡用鎖存器。
FPGA的底層基本組件是查找表(LUT)和D觸發器,並不存在鎖存器,所以,FPGA中綜合出來的鎖存器都是由查找表和寄存器構成的,反而會更耗資源。
基於以上原因,在FPGA設計中,應該避免使用鎖存器。在組合電路中,可以通過讓代碼覆蓋所有條件分支,或者在組合進程中以賦默認值的方式避免鎖存器。在具體實現中:
always @(*) 這種語句中當條件語句沒有覆蓋到所有分支時將產生鎖存器,即if和case條件不全時綜合器會綜合出鎖存器。
以下是通過在always電平敏感進程中通過賦默認值避免產生鎖存器。
always @(sel or a)
begin
y2 = 3’b000; //賦默認值,避免產生鎖存器
casex(sel)
3’bxx1: y2 = a[0];
3’bx1x: y2 = a[1];
3’b1xx: y2 = a[2];
endcase
end
在寫三段式狀態機時,在寫狀態轉換時也會用到這個技巧:
always @(*)
begin
n_state = c_state; //賦默認值,避免產生鎖存器
case(c_state)
IDLE:
n_state = RD;
RD:
…
endcase
end
注:鎖存器是個時序電路,還是組合電路?
參考文獻:
[1] 王鈿, 卓興旺. 基於VerilogHDL數據系統應用設計(第2版). 國防工業出版社. 2007,08.
[2] Verilog. https://en.wikipedia.org/wiki/Verilog. 2015,08,10.
