一、鎖存器
鎖存器(latch)---對脈沖電平敏感,在時鐘脈沖的電平作用下改變狀态
鎖存器是電平觸發的存儲單元,數據存儲的動作取決于輸入時鐘(或者使能)信号的電平值,僅當鎖存器處于使能狀态時,輸出才會随着數據輸入發生變化。
鎖存器不同于觸發器,它不在鎖存數據時,輸出端的信号随輸入信号變化,就像信号通過一個緩沖器一樣;一旦鎖存信号起鎖存作用,則數據被鎖住,輸入信号不起作用。鎖存器也稱為透明鎖存器,指的是不鎖存時輸出對于輸入是透明的。
鎖存器(latch):我聽過的最多的就是它是電平觸發的,呵呵。鎖存器是電平觸發的存儲單元,數據存儲的動作取決于輸入時鐘(或者使能)信号的電平值,當鎖存器處于使能狀态時,輸出才會随着數據輸入發生變化。(簡單地說,它有兩個輸入,分别是一個有效信号EN,一個輸入數據信号DATA_IN,它有一個輸出Q,它的功能就是在EN有效的時候把DATA_IN的值傳給Q,也就是鎖存的過程)。
應用場合:數據有效遲後于時鐘信号有效。這意味着時鐘信号先到,數據信号後到。在某些運算器電路中有時采用鎖存器作為數據暫存器。
缺點:時序分析較困難。
不要鎖存器的原因有二:1、鎖存器容易産生毛刺,2、鎖存器在ASIC設計中應該說比ff要簡單,但是在FPGA的資源中,大部分器件沒有鎖存器這個東西,所以需要用一個邏輯門和ff來組成鎖存器,這樣就浪費了資源。
優點:面積小。鎖存器比FF快,所以用在地址鎖存是很合适的,不過一定要保證所有的latch信号源的質量,鎖存器在CPU設計中很常見,正是由于它的應用使得CPU的速度比外部IO部件邏輯快許多。latch完成同一個功能所需要的門較觸發器要少,所以在ASIC中用的較多。
二、觸發器
觸發器(Flip-Flop,簡寫為 FF),也叫雙穩态門,又稱雙穩态觸發器。是一種可以在兩種狀态下運行的數字邏輯電路。觸發器一直保持它們的狀态,直到它們收到輸入脈沖,又稱為觸發。當收到輸入脈沖時,觸發器輸出就會根據規則改變狀态,然後保持這種狀态直到收到另一個觸發。
觸發器(flip-flops)電路相互關聯,從而為使用内存芯片和微處理器的數字集成電路(IC)形成邏輯門。它們可用來存儲一比特的數據。該數據可表示音序器的狀态、計數器的價值、在計算機内存的ASCII字符或任何其他的信息。
有幾種不同類型的觸發器(flip-flops)電路具有指示器,如T(切換)、S-R(設置/重置)J-K(也可能稱為Jack Kilby)和D(延遲)。典型的觸發器包括零個、一個或兩個輸入信号,以及時鐘信号和輸出信号。一些觸發器還包括一個重置當前輸出的明确輸入信号。
觸發器(flip-flop)---對脈沖邊沿敏感,其狀态隻在時鐘脈沖的上升沿或下降沿的瞬間改變。
T觸發器(Toggle Flip-Flop,or Trigger Flip-Flop)設有一個輸入和輸出,當時鐘頻率由0轉為1時,如果T和Q不相同時,其輸出值會是1。輸入端T為1的時候,輸出端的狀态Q發生反轉;輸入端T為0的時候,輸出端的狀态Q保持不變。把JK觸發器的J和K輸入點連接在一起,即構成一個T觸發器。
應用場合:時鐘有效遲後于數據有效。這意味着數據信号先建立,時鐘信号後建立。在CP上升沿時刻打入到寄存器。
三、寄存器
寄存器(register):用來存放數據的一些小型存儲區域,用來暫時存放參與運算的數據和運算結果,它被廣泛的用于各類數字系統和計算機中。其實寄存器就是一種常用的時序邏輯電路,但這種時序邏輯電路隻包含存儲電路。寄存器的存儲電路是由鎖存器或觸發器構成的,因為一個鎖存器或觸發器能存儲1位二進制數,所以由N個鎖存器或觸發器可以構成N位寄存器。 工程中的寄存器一般按計算機中字節的位數設計,所以一般有8位寄存器、16位寄存器等。
對寄存器中的觸發器隻要求它們具有置1、置0的功能即可,因而無論是用同步RS結構觸發器,還是用主從結構或邊沿觸發結構的觸發器,都可以組成寄存器。一般由D觸發器組成,有公共輸入/輸出使能控制端和時鐘,一般把使能控制端作為寄存器電路的選擇信号,把時鐘控制端作為數據輸入控制信号。
寄存器的應用:
1. 可以完成數據的并串、串并轉換;
2.可以用做顯示數據鎖存器:許多設備需要顯示計數器的記數值,以8421BCD碼記數,以七段顯示器顯示,如果記數速度較高,人眼則無法辨認迅速變化的顯示字符。在計數器和譯碼器之間加入一個鎖存器,控制數據的顯示時間是常用的方法。
3.用作緩沖器;
4. 組成計數器:移位寄存器可以組成移位型計數器,如環形或扭環形計數器。
四、移位寄存器
移位寄存器:具有移位功能的寄存器稱為移位寄存器。
寄存器隻有寄存數據或代碼的功能。有時為了處理數據,需要将寄存器中的各位數據在移位控制信号作用下,依次向高位或向低位移動1位。移位寄存器按數碼移動方向分類有左移,右移,可控制雙向(可逆)移位寄存器;按數據輸入端、輸出方式分類有串行和并行之分。除了D邊沿觸發器構成移位寄存器外,還可以用諸如JK等觸發器構成移位寄存器。
五、總線收發器/緩沖器
緩沖寄存器:又稱緩沖器緩沖器(buffer):多用在總線上,提高驅動能力、隔離前後級,緩沖器多半有三态輸出功能。當負載不具有非選通輸出為高阻特性時,将起到隔離作用;當總線的驅動能力不夠驅動負載時,将起到驅動作用。由于緩沖器接在數據總線上,故必須具有三态輸出功能。
它分輸入緩沖器和輸出緩沖器兩種。前者的作用是将外設送來的數據暫時存放,以便處理器将它取走;後者的作用是用來暫時存放處理器送往外設的數據。有了數控緩沖器,就可以使高速工作的CPU與慢速工作的外設起協調和緩沖作用,實現數據傳送的同步。
Buffer:緩沖區,一個用于在初速度不同步的設備或者優先級不同的設備之間傳輸數據的區域。通過緩沖區,可以使進程之間的相互等待變少,從而使從速度慢的設備讀入數據時,速度快的設備的操作進程不發生間斷。
緩沖器主要是計算機領域的稱呼。具體實現上,緩沖器有用鎖存器結構的電路來實現,也有用不帶鎖存結構的電路來實現。一般來說,當收發數據雙方的工作速度匹配時,這裡的緩沖器可以用不帶鎖存結構的電路來實現;而當收發數據雙方的工作速度不匹配時,就要用帶鎖存結構的電路來實現了(否則會出現數據丢失)。
緩沖器在數字系統中用途很多:
(1)如果器件帶負載能力有限,可加一級帶驅動器的緩沖器;
(2)前後級間邏輯電平不同,可用電平轉換器加以匹配;
(3)邏輯極性不同或需要将單性變量轉換為互補變量時,加帶反相緩沖器;(4)需要将緩變信号變為邊沿陡峭信号時,加帶施密特電路的緩沖器
(5)數據傳輸和處理中不同裝置間溫度和時間不同時,加一級緩沖器進行彌補等等。
鎖存器與觸發器的區别
鎖存器和觸發器是具有記憶功能的二進制存貯器件,是組成各種時序邏輯電路的基本器件之一。區别為:latch同其所有的輸入信号相關,當輸入信号變化時latch就變化,沒有時鐘端;flip-flop受時鐘控制,隻有在時鐘觸發時才采樣當前的輸入,産生輸出。當然因為latch和flip-flop二者都是時序邏輯,所以輸出不但同當前的輸入相關還同上一時間的輸出相關。
1、latch由電平觸發,非同步控制。在使能信号有效時latch相當于通路,在使能信号無效時latch保持輸出狀态。DFF由時鐘沿觸發,同步控制。
2、latch對輸入電平敏感,受布線延遲影響較大,很難保證輸出沒有毛刺産生;DFF則不易産生毛刺。
3、如果使用門電路來搭建latch和DFF,則latch消耗的門資源比DFF要少,這是latch比DFF優越的地方。所以,在ASIC中使用 latch的集成度比DFF高,但在FPGA中正好相反,因為FPGA中沒有标準的latch單元,但有DFF單元,一個LATCH需要多個LE才能實現。latch是電平觸發,相當于有一個使能端,且在激活之後(在使能電平的時候)相當于導線了,随輸出而變化。在非使能狀态下是保持原來的信号,這就可以看出和flip-flop的差别,其實很多時候latch是不能代替ff的。
4、latch将靜态時序分析變得極為複雜。
5、目前latch隻在極高端的電路中使用,如intel 的P4等CPU。 FPGA中有latch單元,寄存器單元就可以配置成latch單元,在xilinx v2p的手冊将該單元配置成為register/latch單元,附件是xilinx半個slice的結構圖。其它型号和廠家的FPGA沒有去查證。——個人認為xilinx是能直接配的而altera或許比較麻煩,要幾個LE才行,然而也非xilinx的器件每個slice都可以這樣配置,altera的隻有DDR接口中有專門的latch單元,一般也隻有高速電路中會采用latch的設計。altera的LE是沒有latch的結構的,又查了sp3和sp2e,别的不查了,手冊上說支持這種配置。有關altera的表述wangdian說的對,altera的ff不能配置成latch,它使用查找表來實現latch。
一般的設計規則是:在絕大多數設計中避免産生latch。它會讓您設計的時序完蛋,并且它的隐蔽性很強,非老手不能查出。latch最大的危害在于不能過濾毛刺。這對于下一級電路是極其危險的。所以,隻要能用D觸發器的地方,就不用latch。
有些地方沒有時鐘,也隻能用latch了。比如現在用一個clk接到latch的使能端(假設是高電平使能),這樣需要的setup時間,就是數據在時鐘的下降沿之前需要的時間,但是如果是一個DFF,那麼setup時間就是在時鐘的上升沿需要的時間。這就說明如果數據晚于控制信号的情況下,隻能用latch,這種情況就是,前面所提到的latch timing borrow。基本上相當于借了一個高電平時間。也就是說,latch借的時間也是有限的。
在if語句和case不全很容易産生latch,需要注意。VIA題目這兩個代碼哪個綜合更容易産生latch:
代碼1
always@(enable or ina or inb)
begin
if(enable)
begin
data_out = ina;
end
else
begin
data_out = inb;
end
end
代碼2
input[3:0] data_in;
always@(data_in)
begin
case(data_in)
0 : out1 = 1'b1;
1,3 :out2 = 1'b1;
2,4,5,6,7 : out3 = 1'b1;
default:out4 = 1'b1;
endcase
end
答案是代碼2在綜合時更容易産生latch。
對latch進行STA的分析其實也是可以,但是要對工具相當熟悉才行,不過很容易出錯。當前PrimeTime是支持進行latch分析的,現在一些綜合工具内置的STA分析功能也支持,比如RTL compiler, Design Compiler。除了ASIC裡可以節省資源以外,latch在同步設計裡出現的可能還是挺小的,現在處理過程中大都放在ff裡打一下。
鎖存器電平觸發會把輸入端的毛刺帶入輸出;而觸發器由于邊沿作用可以有效抑制輸入端幹擾。
在 CMOS 芯片内部經常使用鎖存器, 但是在PCB闆級結構上, 建議用觸發器在時鐘邊沿上鎖存數據。這是因為在鎖存器閘門開啟期間數據的變化會直接反映到輸出端, 所以要注意控制閘門信号的脈沖寬度,而對于觸發器,隻考慮時鐘的邊沿。
門電路是構建組合邏輯電路的基礎,而鎖存器和觸發器是構建時序邏輯電路的基礎。門電路是由晶體管構成的,鎖存器是由門電路構成的,而觸發器是由鎖存器構成的。也就是晶體管->門電路->鎖存器->觸發器,前一級是後一級的基礎。鎖存器和觸發器它們的輸出都不僅僅取決于目前的輸入,而且和之前的輸入和輸出都有關系。
它們之間的不同在于:鎖存器沒有時鐘信号,而觸發器常常有時鐘觸發信号。
鎖存器是異步的,就是說在輸入信号改變後,輸出信号也随之很快做出改變非常快。而另外一方面,今天許多計算機是同步的,這就意味着所有的時序電路的輸出信号随着全局的時鐘信号同時做出改變。觸發器是一個同步版鎖存器。
觸發器泛指一類電路結構,它可以由觸發信号 (如: 時鐘、置位、複位等) 改變輸出狀态, 并保持這個狀态直到下一個或另一個觸發信号來到時。觸發信号可以用電平或邊沿操作,鎖存器是觸發器的一種應用類型。
D觸發器和D鎖存器的區别
鐘控D觸發器其實就是D鎖存器,邊沿D觸發器才是真正的D觸發器,鐘控D觸發器在使能情況下輸出随輸入變化,邊沿觸發器隻有在邊沿跳變的情況下輸出才變化。
兩個鎖存器可以構成一個觸發器,歸根到底還是dff是邊沿觸發的,而latch是電平觸發的。鎖存器的輸出對輸入透明的,輸入是什麼,輸出就是什麼,這就是鎖存器不穩定的原因,而觸發器是由兩個鎖存器構成的一個主從觸發器,輸出對輸入是不透明的,必須在時鐘的上升/下降沿才會将輸入體現到輸出,所以能夠消除輸入的毛刺信号。
寄存器與鎖存器的區别
寄存器與鎖存器的功能是提供數據寄存和鎖存。寄存功能是指把數據暫時保存,需要時取出。鎖存功能是指總線電路中,鎖定數據輸出,使輸出端不随輸入端變化。
連續賦值與過程賦值的區别:
●連續賦值用于數據流行為建模,多用于組合邏輯電路,過程賦值用于順序行為建模,用于順序行為建模。
●連續賦值等号右邊操作數發生變化就需要執行(上電便一直執行),而過程性賦值語句隻是執行一次,注意我這裡的一次是指:在initial塊中,過程性賦值隻順序執行一次,而在always塊中,每一次滿足always的條件時,都要順序執行一次該always塊中的語句。
過程性連續賦值
連續賦值适用于線網,過程賦值适用于寄存器,但是還有一類賦值方式,它既能對線網賦值也能對寄存器賦值(但不能是寄存器的位選擇或部分選擇),這種賦值方式被稱為過程性連續賦值。它屬于過程賦值而非連續賦值,所以他能出現在always和initial語句中(連續賦值語句不可以出現在always和initial語句中)。并且這種賦值語句也有連續賦值的特征,在過程性連續賦值語句中,右端表達式中操作數的任何變化都會引起賦值語句重新執行。
兩種過程性連續賦值舉例:
(1)assign-deassign(賦值-重新賦值)assign用于對寄存器賦值(不可用于線網賦值),deassign用于取消之前由assign賦值給某寄存器的值,也就是說,使用assign給寄存器賦值之後,這個值将一直保持在這個寄存器上,直到遇到deassign為止。
舉例:
module DEF(D,Clr,Clk,Q)
input D,Clr,Clk;
output Q;
reg Q;
always@(negedge Clk)
Q = D;
always@(Clr)
begin
if(!Clr)
assign Q = 0;
else
deassign Q;
end
endmodule
以上的程序段,第一個always會将Q的值賦為D,第二個always語句在Clr的值發生變化時執行,若Clr是由高電平變為低電平,則assign有效,并一直保持這個賦值(直到遇到deassign),這時盡管第一個always也在執行(Clk的下降沿是不會起作用的),Q的值會一直保持“assign Q = 0;”,直到Clr來一個高電平為止(deassign Q語句執行)。
(2)force-release(強制-釋放,雖然它也可以用于對寄存器賦值,但主要用于線網賦值)
當force語句應用于寄存器時,寄存器當前值被force覆蓋,當release語句應用于寄存器時寄存器當前值将保持不變,直到被重新賦值。
舉例:
reg[2:0]colt;
……
colt=2;//colt被賦值為2;
……
force colt=1;//colt被強制賦值為1;
……
release colt;//對colt的強制賦值被取消,colt的值将保持為1;
……
assign colt =5;//colt被賦值為5;
……
force colt=3;//colt被強制賦值為3;
……
release colt;//對colt的強制賦值被取消,assign colt=5;重新生效;
……
force colt[1:0]=3;//不合法,寄存器的部分選擇不可以設為過程性連續賦值的目标
來源:網絡整理,如涉及版權問題,請及時聯系删除
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!