前言
??在FPGA的設計中,避免使用鎖存器是幾乎所有FPGA工程師的共識,Xilinx和Altera也在手冊中提示大家要慎用鎖存器,除非你明確知道你確實需要一個latch來解決問題。而且目前網(wǎng)上大多數(shù)文章都對鎖存器有個誤解,我們后面會詳細說明。
??這篇文章,我們包含如下內(nèi)容:
-
鎖存器、觸發(fā)器和寄存器的原理和區(qū)別,為什么鎖存器不好?
-
什么樣的代碼會產(chǎn)生鎖存器?
-
為什么鎖存器依然存在于FPGA中?
鎖存器、觸發(fā)器和寄存器的原理和區(qū)別,為什么鎖存器不好?
??鎖存器、觸發(fā)器和寄存器它們的英文分別為:Latch、Flip-Flop、Register。我們對這三個單詞的翻譯真的是非常直觀,從名字就能大概猜出它們的含義。
鎖存器
-
什么是鎖存器?
??鎖存器就是用來存儲狀態(tài)信息,就是將這個狀態(tài)一直保持。鎖存器對脈沖的電平敏感,也就是電平觸發(fā),在有效的電平下,鎖存器處于使能狀態(tài),輸出隨著輸入發(fā)生變化,此時它不鎖存信號,就像一個緩沖器一樣;在鎖存器沒有使能時,則數(shù)據(jù)被鎖住,輸入信號不起作用,此時輸出一直為鎖存的狀態(tài)信息。我們常見的鎖存器有SR鎖存器、D鎖存器、JK鎖存器等。
-
鎖存器的工作過程
??我們以最簡單的D鎖存器為例來說明鎖存器的工作過程,D鎖存器有3個接口,也可以認為是4個,因為輸出的兩個Q和overline{Q}Q只是單純的反向關系。
?
?
??其中D為輸入信號,當E為高時,輸出Q即為輸入的D;當E為低時,Q保持E為高時的最后一次狀態(tài),也就是鎖存過程。
?
-
為什么鎖存器不好?
??從上面的圖中可以看出,鎖存器對毛刺不敏感,很容易在信號上產(chǎn)生毛刺;而且也沒有時鐘信號,不容易進行靜態(tài)時序分析。正是因為這兩個原因,我們在FPGA設計時,盡量不用鎖存器。
??當然,目前網(wǎng)上還有一種說法是FPGA中只有LUT和FF的資源,沒有現(xiàn)成的Latch,所以如果要用Latch,需要更多的資源來搭出來。但這一觀點,是錯誤的,我們后面會有專門的講解。
觸發(fā)器
-
什么是觸發(fā)器
??觸發(fā)器(Flip-Flop,簡寫為 FF),也叫雙穩(wěn)態(tài)門,又稱雙穩(wěn)態(tài)觸發(fā)器。在中國臺灣及中國香港譯作“正反器”,是一種具有兩種穩(wěn)態(tài)的用于儲存的組件,可記錄二進制數(shù)字信號“1”和“0”。
??FPGA工程師,對觸發(fā)器再熟悉不過了,D觸發(fā)器應該是我們平時寫程序中用到最多的element。除了D觸發(fā)器,常見的觸發(fā)器還有T觸發(fā)器、SR觸發(fā)器、JK觸發(fā)器等。觸發(fā)器對脈沖邊沿敏感,其狀態(tài)只在時鐘脈沖的上升沿或下降沿的瞬間改變。
-
觸發(fā)器的工作過程
??我們以D觸發(fā)器為例來說明觸發(fā)器的工作過程,D觸發(fā)器接口如下:
?
??觸發(fā)器只在時鐘邊沿時起作用,所以哪怕輸入的信號中有毛刺,輸出還是比較干凈的。
?
image?
??還有一點需要了解的是,F(xiàn)PGA中最小的單元是門電路,門電路又組成了鎖存器,鎖存器組成了寄存器。
寄存器
??用來存放數(shù)據(jù)的一些小型存儲區(qū)域,用來暫時存放參與運算的數(shù)據(jù)和運算結(jié)果,它被廣泛的用于各類數(shù)字系統(tǒng)和計算機中。其實寄存器就是一種常用的時序邏輯電路,但這種時序邏輯電路只包含存儲電路。寄存器的存儲電路是由鎖存器或觸發(fā)器構(gòu)成的,因為一個鎖存器或觸發(fā)器能存儲1位二進制數(shù),所以由N個鎖存器或觸發(fā)器可以構(gòu)成N位寄存器。工程中的寄存器一般按計算機中字節(jié)的位數(shù)設計,所以一般有8位寄存器、16位寄存器等。
什么樣的代碼會產(chǎn)生鎖存器?
在組合邏輯中,如果條件描述不全就會容易產(chǎn)生Latch:
-
if語句中缺少了else語句
-
case語句中沒有給出全部的情況。
也就是下面的情況:
always?@?*
begin
????if(en==1)
????????q?<=?d;
end
input?[1:0]d;
always?@?(d)
begin
????case(d)
????0:???????q0?<=?1'b1;
????1:???????q2?<=?1'b1;
????2:???????q2?<=?1'b1;
????3:???????q3?<=?1'b1;
????default:?q4?<=?1'b1;
end
??這個前提是組合電路中,在時序電路的if語句中,及時沒有else,也不會綜合出Latch的。
??上面這兩種寫法容易出現(xiàn)在什么地方呢?最常見的就是狀態(tài)機,我見過不少的FPGA工程師在寫狀態(tài)機時,case語句中沒有給出變量的全部情況。
為什么鎖存器依然存在于FPGA中?
??我們在前面說過網(wǎng)上有一種說法是:FPGA中只有LUT和FF的資源,沒有現(xiàn)成的Latch,所以如果要用Latch,需要更多的資源來搭出來。這種說法是錯誤的,因為在Xilinx的FPGA中,6 系列之前的器件中都有Latch;6系列和7系列的FPGA中,一個Slice中有50%的storage element可以被配置為Latch或者Flip-Flop,另外一半只能被配置為Flip-Flop。比如7系列FPGA中,一個Slice中有8個Flip-Flop,如果被配置成了Latch,該Slice的另外4個Flip-Flop就不能用了。這樣確實造成了資源的浪費。
?
image?
在UltraScale的FPGA中,所有的storage element都可以被配置成Flip-Flop和Latch。
?
image?
我們以下面的代碼來說明Flip-Flop和Latch在Ultrascale的FPGA中Implementation后的結(jié)果。
Flip-Flop代碼:
module?FF_top(
?input??????????????clk,
?input?[3:0]????????data_i,
?input??????????????data_ie,??//enable
?output?reg?[3:0]???o_latch
????);
always?@?(?posedge?clk?)
begin
????if(data_ie)
????????o_latch?<=?data_i;
end??
endmodule
Latch代碼:
module?latch_top(
?input?[7:0]????????data_i,
?input??????????????data_ie,??//enable
?output?reg?[7:0]???o_latch
????);
always?@?*?
begin
????if(data_ie)
????????o_latch[3:0]?<=?data_i[3:0];
end??
endmodule
Flip-Flop實現(xiàn)后的Schematic和Device如下:
?
image?
?
Latch實現(xiàn)后的Schematic和Device如下:
?
image?
?
可以看出,在使用Flip-Flop時,storage element被綜合成了FDRE,也就是觸發(fā)器;當使用Latch電路時,storage element被綜合成了LDCE。
??所以,F(xiàn)PGA中沒有Latch的說法在Xilinx的FPGA中是不對的。
??最后一個問題,既然Latch有這么多的問題,那為什么FPGA中還要保留?
-
首先就是因為FPGA電路的靈活性,保留Latch并不影響FPGA的資源,因為storage element可以直接被配置為Flip-Flop。
-
其次就是有些功能是必須要使用Latch的,比如很多處理器的接口就需要一個Latch來緩存數(shù)據(jù)或地址。
??最后要說明的一點是:鎖存器雖然在FPGA中不怎么被使用,但在CPU中卻很常見,因為鎖存器比Flip-Flop快很多。
?
?
陪你度過深夜的2048小游戲,我們用FPGA實現(xiàn)它
?
基于FPGA的數(shù)字識別-實時視頻處理的定點卷積神經(jīng)網(wǎng)絡實現(xiàn)
?
I3C的視頻介紹
?
以太網(wǎng)的發(fā)展歷史、演化過程以及工作基理
? ? ? ? ? ?
?
?
評論
查看更多