Verilog設計中的鎖存器


問題:

什么是鎖存器?

什么時候出現鎖存器?

鎖存器對電路有什么影響?

如何在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.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM