1:鎖存器、觸發(fā)器、寄存器的關聯(lián)與區(qū)別
首先應該明確鎖存器和觸發(fā)器是由與非門之類的東西構成。尤其是鎖存器,雖說數(shù)字電路定義含有鎖存器或觸發(fā)器的電路叫時序電路,但鎖存器有很多組合邏輯電路的特性。電平觸發(fā)的存儲單元,數(shù)據(jù)存儲的動作取決于輸入時鐘(或者使能)信號的電平值,當鎖存器處于使能狀態(tài)時,輸出才會隨著數(shù)據(jù)輸入發(fā)生變化。(簡單地說,它有兩個輸入,分別是一個有效信號EN,一個輸入數(shù)據(jù)信號DATA_IN,它有一個輸出Q,它的功能就是在EN有效的時候把DATA_IN的值傳給Q,也就是鎖存的過程)
普通鎖存器無控制信號:如基本RS鎖存器,其無須時鐘脈沖的觸發(fā)。set為置數(shù)端,reset為復位端。門控鎖存器:門控D鎖存器結構如下圖所示。(E為使能信號,D為信號輸入)E為1時,C為1,TG1被1驅(qū)動導通,TG2被0驅(qū)動斷開。(TG1為傳輸門,當C為1時,將輸入端的模擬信號整體傳輸之輸出端,無損耗,C為0時門關閉)應用場合:數(shù)據(jù)有效滯后于時鐘信號有效,這意味著時鐘信號先到,數(shù)據(jù)信號后到。在某些運算器電路中有時采用鎖存器作為數(shù)據(jù)暫存器;優(yōu)點:面積小、鎖存器比FF快,所以用在地址鎖存是很合適的,不過一定要保證所有的latch信號源的質(zhì)量,鎖存器在CPU設計中很常見,正是由于它的應用使得CPU的速度比外部IO部件邏輯快許多。不用鎖存器的原因有二:1、鎖存器容易產(chǎn)生毛刺,2、鎖存器在ASIC設計中應該說比FF要簡單,但是在FPGA的資源中,大部分器件沒有鎖存器這個東西,所以需要用一個邏輯門和FF來組成鎖存器,這樣就浪費了資源;(鐘控 D 觸發(fā)器其實就是 D 鎖存器,邊沿 D 觸發(fā)器才是真正的 D 觸發(fā)器)觸發(fā)器(Flip-Flop,簡寫為 FF)---對脈沖邊沿敏感,其狀態(tài)只在時鐘脈沖的上升沿或下降沿的瞬間改變;觸發(fā)器也叫雙穩(wěn)態(tài)門,又稱雙穩(wěn)態(tài)觸發(fā)器,是一種可以在兩種狀態(tài)下運行的數(shù)字邏輯電路。觸發(fā)器一直保持它們的狀態(tài),直到它們收到輸入脈沖,又稱為觸發(fā)。當收到輸入脈沖時,觸發(fā)器輸出就會根據(jù)規(guī)則改變狀態(tài),然后保持這種狀態(tài)直到收到另一個觸發(fā);
- 觸發(fā)器:我們把輸出只在時鐘某個時刻變化的玩意兒叫觸發(fā)器。邊沿敏感
- 這個便是一個d觸發(fā)器。只在enable(一般大家都叫它clock)的上升沿q采樣d,而且在每個時鐘的上升沿都會采樣。
觸發(fā)器分為兩種,一種是主從觸發(fā)器和邊沿觸發(fā)器。主從觸發(fā)器在時鐘有效期內(nèi) (主觸發(fā)器) 接收數(shù)據(jù),在時鐘邊沿輸出狀態(tài)轉(zhuǎn)換。應用場合:時鐘有效遲后于數(shù)據(jù)有效,這意味著數(shù)據(jù)信號先建立,時鐘信號后建立,在CP有效沿時刻打入到寄存器;邊沿觸發(fā)器在時鐘邊沿期間, 觸發(fā)器才接收數(shù)據(jù)并使輸出狀態(tài)轉(zhuǎn)換。下面為常見的幾種邊沿觸發(fā)器(符號中的“>”代表邊沿觸發(fā),單是這個符號代表上升沿觸發(fā),如果在CP信號輸入與邊框的交界處還有空心則代表下降沿觸發(fā))T=0 保持;T=1 翻轉(zhuǎn)(clk上升沿有效)S為1時置1;R為1時清0;R與S都為0時,保持狀態(tài);R、S不能同時為1JK觸發(fā)器的功能基本與RS觸發(fā)器相同:J=1 K=0時,置1;J=0 K=1時,清零;J=0 K=0時,保持;J=1 K=1時,翻轉(zhuǎn)(初態(tài)為0,次態(tài)為1;初態(tài)為1,次態(tài)為0)。總結下鎖存器的主要缺點:
(1)對毛刺敏感,不能異步復位,因此在上電后處于不確定的狀態(tài)。
(2)鎖存器會使靜態(tài)時序分析變得非常復雜,不具備可重用性。(首先, 鎖存器沒有時鐘參與信號傳遞,無法做 STA;其次,綜合工具會將 latch 優(yōu)化掉,造成前后仿真結果不一致)
(3)在 PLD 芯片中,基本的單元是由查找表和觸發(fā)器組成的,若生成鎖存器反而需要更多的資源。根據(jù)鎖存器的特點可以看出,在電路設計中,要對鎖存器特別謹慎,如果設計經(jīng)過綜合后產(chǎn)生出和設計意圖不一致的鎖存器,則將導致設計錯誤,包括仿真和綜合。因此,在設計中需要避免產(chǎn)生意想不到的鎖存器。總結一下避免生成鎖存器的一些方法:
1)組合邏輯盡量使用assign語句描述組合邏輯電路。
2)時序邏輯電路不用擔心生成鎖存器,但也要盡量規(guī)避一些if-else 或者case不完整的情況,養(yǎng)成好的coding style.
3)如果采用case或者if結構描述組合邏輯時,應確保全部寫全,不能遺漏。或者在組合邏輯塊中先給輸出變量賦初值。
寄存器(register):用來暫時存放參與運算的數(shù)據(jù)和運算結果。在實際的數(shù)字系統(tǒng)中,通常把能夠用來存儲一組二進制代碼的同步時序邏輯電路稱為寄存器。區(qū)別與聯(lián)系:由于觸發(fā)器內(nèi)有記憶功能,因此利用觸發(fā)器可以方便地構成寄存器。由于一個觸發(fā)器能夠存儲一位二進制碼,所以把 n 個觸發(fā)器的時鐘端口連接起來就能構成一個存儲 n 位二進制碼的寄存器。
從寄存數(shù)據(jù)的角度來講,寄存器和鎖存器的功能是相同的;它們的區(qū)別在于寄存器是同步時鐘控制,而鎖存器是電位信號控制。寄存器一般是邊沿觸發(fā)的觸發(fā)器,電路里叫register,而觸發(fā)器就是樓上所說的各種邏輯門構成的包含電平觸發(fā)和邊沿觸發(fā)的兩種,而鎖存器則是電平觸發(fā)的。所以一般說來,我們只叫寄存器和鎖存器兩種,在時序電路中寄存器的作用就是只在時鐘的邊沿有效傳輸data(setup time和hold time滿足),而鎖存器則在有效電平器件都可以傳輸data
寄存器(register):用來存放數(shù)據(jù)的一些小型存儲區(qū)域,用來暫時存放參與運算的數(shù)據(jù)和運算結果。其實寄存器就是一種常用的時序邏輯電路,但這種時序邏輯電路只包含存儲電路。寄存器的存儲電路是由鎖存器或觸發(fā)器構成的,因為一個鎖存器或觸發(fā)器能存儲1位二進制數(shù),所以由N個鎖存器或觸發(fā)器可以構成N位寄存器。工程中的寄存器一般按計算機中字節(jié)的位數(shù)設計,所以一般有8位寄存器、16位寄存器等;
- 寄存器這個玩意兒是一個概念層次的東西,1個寄存器就是能存1bit數(shù)據(jù)的東西。既可以用觸發(fā)器實現(xiàn)也可以用鎖存器實現(xiàn)。以觸發(fā)器為例,由于觸發(fā)器每個時鐘上升沿都會采樣,所以觸發(fā)器會有一個反饋邏輯,當load有效的時候才會采樣d,否則保持不變。
- always @ (posedge clk or negedge rst_n)
2:RS鎖存器、D鎖存器、D觸發(fā)器等邊沿觸發(fā)器的電路結構及其相應Verilog的描述(行為級、門級)
在數(shù)字電路里面,SR鎖存器是最簡單的時序單元,它由一對交叉耦合的或非門構成,如下所示:
主要功能就是通過輸入的S、R端分別控制Q進行置位(set)和復位(reset)。下面我們就對這個電路的分析:二輸入或非門的功能是,只要有一個輸入為1,輸出就為了0。這SR鎖存電路在正常情況下,輸入RS的組合之一4種可能,即00、01、10和11,下面我們就來看看這4種輸入對輸出Q的影響:A,假設原來的狀態(tài)Q=0時,對應的原來狀態(tài)就是Q’=1;那么N2的輸入就是0和0,輸出Q’=1,這樣子就鞏固了原來的狀態(tài)Q’=1;Q’=1,對于N2,輸入就是0和1,輸出Q=0,也鞏固了原來的狀態(tài),也就是與原來的假設一致。所以這個狀態(tài)可以穩(wěn)定下來,也就是當輸入SR=00時,輸出Q=1,Q’=0是可以存在的,如下圖所示:
B,假設原來的狀態(tài)Q=1時,對應的原來狀態(tài)就是Q’=0;那么N2的輸入就是0和1,輸出Q’=0,這樣子就鞏固了原來的狀態(tài)Q’=0;Q’=0,對于N2,輸入就是0和0,輸出Q=1,也鞏固了原來的狀態(tài),也就是與原來的假設一致。所以這個狀態(tài)可以穩(wěn)定下來,也就是當輸入SR=00時,輸出Q=0,Q’=1是也是可以存在的,如下圖所示:
由此可見,只要原來的狀態(tài)一定了,那么輸入SR=00時,輸出也就是原來的狀態(tài)。根據(jù)或非門的功能,由于S=1,N2的輸出Q’= 0;于是N1的輸入就是00,輸出Q就等于1;然后Q=1反饋回N2的輸入,讓N2的輸出穩(wěn)定為0,從而讓Q的輸出穩(wěn)定為1;輸入SR=10時,輸出Q=1,稱為置位功能。(這里我們看一下,在SR=10時,S的信號穩(wěn)定多久輸出Q和Q’才穩(wěn)定下來:S=1到來,首先經(jīng)過N2的門延時t1,然后是Q’反饋回N1的線延時t2,接著是N1的門延時t3,再然后是Q反饋回N2的門延時t4,也就是有2個門延時和兩個線延時,這是對于Q’的;對于Q還有增加一個N2門延時和一個Q’反饋回N1輸入的線延時)如下圖所示:
從上面的分析中,我們知道輸入S=1,R=0時,輸出Q=1,也就是置位的功能。1.·當S=0,R=1時,這種情況跟SR=10類似,只不過是輸出Q=0,也就是復位的功能。2.·當S=1,R=1時,根據(jù)或非門的功能知道,輸出Q=0,Q’=0。很顯然這時候Q=Q’了,這跟我們給輸出取值的字面意義是相反的,我們把這種狀態(tài)稱為錯誤輸出,這是要注意的。這里需要說明的是,S和R都有效是沒有意義的,鎖存器不能同時被復位和置位,這樣會引起輸出都是0的混亂電路反應。通過上面的分析,我們知道,SR鎖存器可以具有鎖存數(shù)據(jù)的功能:在S有效時,復位輸出Q=1;在R有效時,輸出復位Q=0;當S和R都無效時,就會保持前一個狀態(tài)的輸出。
同步RS鎖存器:有r(復位),s(置位)。它的缺點在于會有不確定狀態(tài)x。
- moduleRS_Flip(clk,r,s,q,qb);
- module RS_latch(r,s,q,qn);
D鎖存的功能是在時鐘高/低電平的時候通過數(shù)據(jù),在時鐘低/高電平的時候鎖存數(shù)據(jù)(這樣就明確地說明了什么時候鎖存什么數(shù)據(jù),而不是像SR鎖存器一樣,不知道鎖存什么數(shù)據(jù)),具體的結構圖和分析如下所示:D鎖存器常見結構和電路符號圖如下所示:
可以看到,D鎖存器可以分為前級門電路(兩個與門和一個非門)和后級SR鎖存器組成,(PS:反相器2個晶體管,兩個與門共12個晶體管,兩個或非門共8個晶體管,D鎖存器一個22個晶體管)下面我們就來分析一下它的功能:輸入是Clk(相當于第一節(jié)所展示電路圖中的E)和D,也就是輸入有四種可能:·當clk=0時,紅S紅R都為0,也就是SR鎖存器的輸入為00,根據(jù)SR鎖存器的功能,輸出Q和Q’將保持原來的狀態(tài);因此clk=0時,不管D是什么,輸出Q和Q’都不隨D變化,只與原來的狀態(tài)有關,也就是保持。·當clk=1時,R=(1·D’)=D’;S=(1·D)=D。也就是說,當clk=1的時候,SR鎖存的輸入是互補的,不會出現(xiàn)S和R同時有效的情況。當D=1時,S=1,置位有效,輸出Q=1;當D=0時,R=1,復位有效,輸出Q=0;因此就可以知道,在clk=1時,輸出Q=D,也就是輸出等于輸入。通過上面的分析,上面的D鎖存器結構功能為:在clk=1時,數(shù)據(jù)通過D鎖存器流到了Q;在Clk=0時,Q保持原來的值不變。這樣的鎖存器也稱為透明鎖存器或者電平敏感鎖存器(這里需要注意的是,上面結構中電平敏感鎖存器是高電平敏感,也是就是高電平有效,這里的有效不是指“鎖存”的這個功能有效,而是指輸出發(fā)生變化即輸入信號得以傳送到輸出,方便后面的鎖存操作)。然后低電平敏感的D鎖存器的電路結構這里就不介紹了。
- module d_latch(clk,d,q,qn);
- RS_latch rs (s,r,q,qn);//RS鎖存器中的所展示的門級描述
觸發(fā)器有很多類型,比如J-K觸發(fā)器、T觸發(fā)器、D觸發(fā)。前面我們也說了,鎖存器的應用之一就是構成觸發(fā)器,這里我們只聊最簡單的觸發(fā)器——D觸發(fā)器,D觸發(fā)器的結構和電路符號圖如下所示:
D觸發(fā)器可以由兩個D鎖存器構成,驅(qū)動時鐘的相位相反(也就是),前面的D鎖存器稱為主鎖存器,后面的D鎖存器稱為從鎖存器,因此D觸發(fā)器也可以稱為主從觸發(fā)器(PS:兩個D鎖存器共44個晶體管,非門2個晶體管,因此D觸發(fā)器46個晶體管)。下面我們分析一下D觸發(fā)的功能:假設要傳輸?shù)臄?shù)據(jù)D=D1:在(clock簡稱clk)clk=0的時候,主鎖存打開進行傳輸數(shù)據(jù),把輸入傳送到從到從鎖存器的輸入端,即Qm = D1。然后clk從0→1的時候,主鎖存器準備關閉,保持原來的值D1,與此同時從鎖存器準備打開,把Qm的值傳輸?shù)捷敵鯭s,也就是Qs=Qm=D1。在clk=1的時候,主鎖存器是關閉的,Qm保持D1不變,即Qm=D1;從鎖存器是打開的,Qs=Qm=D1。接著clk從1→0的時候,主鎖存器準備打開,準備傳輸數(shù)據(jù);而從鎖存器準備關閉。在clk=0的時候,主鎖存打開進行傳輸數(shù)據(jù),把輸入傳送到從到從鎖存器的輸入端,即Qm = D2;與此同時,從鎖存器關閉,由于新的Qm即Qm還沒有到達從鎖存器的D端,因此在從鎖存器關閉的時候,從鎖存器鎖存的是原來的值即D1,因此輸出Qs =D1。然后接下來上升沿就傳輸D2…從上面的分析可以找到,D觸發(fā)器在時鐘上升沿的時候鎖存在時鐘上升沿采到的值,并且保持一個時鐘周期。這種在時鐘上升沿鎖存數(shù)據(jù)的觸發(fā)器稱為正邊沿觸發(fā)器,與此對應的還有負邊沿觸發(fā)的觸發(fā)器,這里就不進行介紹了。由D觸發(fā)器延伸出去的知識點還有很多,比如寄存器,寄存器由多個D觸發(fā)器構成(一個D觸發(fā)器可以看做1位的寄存器);比如帶使能的觸發(fā)器:
帶復位的觸發(fā)器:
- module D_flip_flop(clk,d,q,qn);
- d_latch dlatch1(~clk,d,q0,qn0);//d_latch來源于上節(jié)
- d_latch dlatch2(clk,q0,q,qn);
其他邊沿觸發(fā)器的行為級描述
- 在時鐘沿到來的時候若T為0,那么觸發(fā)器輸出不變。如果為1,則輸出反轉(zhuǎn)。
- moduleT_Flip(clk,rst,t,q,qb);
- else;//本來應該有保持與翻轉(zhuǎn)兩種,但q不變其實就不需要給出?
- 同步D觸發(fā)器:這種觸發(fā)器是最常用的。
- moduleD_Flip(clk,rst,d,q,qb);
- 處于時鐘沿觸發(fā)時當JK為00,01,10時和RS觸發(fā)器一樣,當為11時和T觸發(fā)器一樣。
moduleJK_Flip(clk,j,k,q,qb);
inputwireclk,j,k;
outputwireqb;
outputregq;
assignqb=~q;
always@(posedgeclk)begin
case({j,k})
2'b00:
q<=?q;
2'b01:
q<=?0;
2'b10:
q<=?1;
2'b11:
q<=?~q;
endcase
end
endmodule
至芯科技12年不忘初心、再度起航12月17日北京中心FPGA工程師就業(yè)班開課、線上線下多維教學、歡迎咨詢!
歡迎加入至芯科技FPGA微信學習交流群,這里有一群優(yōu)秀的FPGA工程師、學生、老師、這里FPGA技術交流學習氛圍濃厚、相互分享、相互幫助、叫上小伙伴一起加入吧!
評論