時序邏輯電路的基礎知識(結合Verilog)

TM^Twilight發表於2020-03-23

康華光《電子技術基礎 數字部分》(第六版)書中關於時序邏輯的介紹十分詳盡,僅在原書的基礎上增加一部分註釋,並省去一部分器件特性相關的內容。

目錄

1.鎖存器

1.1基本SR鎖存器

1.2用與非門構成的基本SR鎖存器 

1.3時序電路的描述方法(以或非門構成的RS鎖存器為例)

1.3.1特性表

1.3.2特性方程

1.3.3狀態圖

1.3.4波形圖

1.4門控SR鎖存器

1.5 D鎖存器

1.5.1CMOS傳輸門

1.5.2傳輸門控D鎖存器

1.5.3邏輯閘控D鎖存器

1.6空翻現象

2.觸發器

2.1主從D觸發器

2.1.1主從D觸發器的電路結構和工作原理

2.1.2 D鎖存器與D觸發器的比較

2.1.3利用Verilog描述觸發器

3.暫存器

三態輸出門

3.1暫存器的原理

3.2移位暫存器

3.2.1單向移位暫存器

3.2.2多功能雙向移位暫存器

 3.2.3利用Verilog描述移位暫存器

4.計數器

4.1 4位同步二進位制計數器

4.2基本環形計數器

4.3計數器的應用

4.4利用Verilog描述計數器


組合邏輯電路是沒有記憶的,也就是說在任何時刻產生的輸出訊號都僅僅取決於該時刻電路的輸入訊號,而與它以前的輸入訊號是無關的。而有的時候,外面需要電路具有一定的記憶功能,比如自動售貨機,當需要買一瓶水,需要三塊錢,當你依次投入三個硬幣時,之後當三個硬幣都投入之後,自動售貨機才會掉出你想要的東西,這樣的功能就是依靠內部的時序電路實現的。時序電路與組合邏輯電路相反,它具有記憶功能,它在任何時刻的輸出,不僅與該時刻的輸入訊號有關,而且還與該時刻以前的輸入訊號有關。時序邏輯電路的示意圖如下圖所示:

根據上圖可以知道,一個完整的時序電路,由兩部分構成,分別是組合邏輯電路和時序邏輯電路(用來儲存輸入資訊的儲存電路)。 常用的儲存電路有兩類,一類是鎖存器,而另一種是觸發器。它們兩者所採用的電路結構形式不同,訊號的觸發方式也不同,其中,採用電平觸發方式的叫做鎖存器,而採用脈衝邊沿觸發方式的叫做觸發器

在詳細介紹鎖存器和觸發器之前,先簡要介紹一下基本雙穩態電路。

將兩個G_{1}G_{2}接成如下圖所示的交叉耦合形式,則構成最基本的雙穩態電流。

由上述基本雙穩態電路的邏輯關係可知,若Q=0,經非門G_{2}反相,則\overline{Q}=1\overline{Q}反饋到G_{1}輸入端,又保證了Q=0。由於兩個門首尾相接的邏輯鎖定,因而電路能自行保持在Q=0\overline{Q}=1的狀態,形成第一種穩定狀態。同理,若Q=1,則\overline{Q}=0,形成第二種穩定狀態。在兩種穩定狀態中,輸出端Q\overline{Q}總是邏輯互補。可以定義Q=0為整個電路的0狀態,Q=1則是1狀態電路進入其中任意一種邏輯狀態都能長期保持下去,並可以通過Q端電平檢測出來,因此,它具有儲存1位二進位制資料的功能

像上述圖示電路一樣,具有0、1兩種邏輯狀態,一旦進入其中一種狀態,就能長期保持不變的單元電路,稱為雙穩態儲存電路,簡稱雙穩態電路。但是,上述雙穩態電路的功能極不完備。在接通電源後,它可能隨機進入0狀態或1狀態,因為沒有控制機構,所以也無法在執行中改變和控制它的狀態,從而不能作為儲存電路使用。但,基本在雙穩態電路是鎖存器和觸發器等儲存單元的基礎。

1.鎖存器

鎖存器是一種對脈衝電平敏感的雙穩態電路,它具有0和1兩個穩定狀態,一旦狀態被確定,就能自行保持,直到有外部特定輸入脈衝電平作用在電路一定位置時,才有可能改變狀態。這種特性可以用於置入和儲存1位二進位制資料。

1.1基本SR鎖存器

將基本雙穩態電路中的非門換成或非門,則構成下圖所示的基本SR鎖存器,它是一種具有最簡單控制功能的雙穩態電路。

圖中,SR是兩個輸入端, Q\overline{Q}是兩個輸出端。定義Q=0\overline{Q}=1為整個鎖存器的0狀態;Q=1\overline{Q}=0則是鎖存器的1狀態。下面根據SR的四種輸入狀態分析SR鎖存器的工作原理。

(1)S=R=0

根據邏輯電路列出,Q=\overline{R+\overline{Q}}=\overline{0+\overline{Q}}=Q\overline{Q}=\overline{S+Q}=\overline{0+Q}=\overline{Q}。顯然,SR兩種訊號對輸出Q\overline{Q}不起作用,電路狀態保持不變,功能與前述的基本雙穩態電路一致,因此可儲存1位二進位制資料。

(2)S=0R=1

對於或非門而言,S=0不會影響G_{2}的輸出狀態;R=1作用於G_{1}則不然,所以必須首先確定G_{1}輸出端Q的狀態(雖然一直強調電路是並行的,但是由於G_{2}的輸出\overline{Q}不受S控制,但是R=1可以決定G_{1}的輸出狀態,即Q,進而Q決定\overline{Q},也就是說,邏輯關係仍然存在主次關係)。根據電路可得:Q=\overline{R+\overline{Q}}=\overline{1+\overline{Q}}=0。該訊號再反饋到G_{2}輸入端,得到\overline{Q}=\overline{S+Q}=\overline{0+0}=1。根據定義,鎖存器這時的狀態為0。

如果從電路的動態變化分析,假設上述SR鎖存器此時的狀態為1,即Q=1\overline{Q}=0,在R端出現邏輯1電平瞬間,將使Q端輸出電壓下降並作用於G_{2}的的輸入端,隨即引發\overline{Q}端電壓上升。一旦Q\overline{Q}端均跨越邏輯閾值電平,便迅速轉換為Q=0\overline{Q}=1,電路狀態由1翻轉到0;反之,如果此前電路狀態為0,即Q=0\overline{Q}=1,則R=1的出現不改變其狀態。

綜上所述,S=0R=1將使鎖存器置0,因此將R端稱為復位(或置0)輸入端。當R=1訊號消失(即回到0),電路進入前述(1)的狀態,使鎖存器的0狀態得以保持。

(3)S=1R=0

由於電路是對稱的,因而此時的電路狀況與狀態(2)完全相反,S=1R=0將首先使\overline{Q}=\overline{S+Q}=0,繼而Q=\overline{R+\overline{Q}}=1,鎖存器置1。S端稱為置位(或置1)輸入端。當S=1訊號消失,同樣可使鎖存器的1狀態得以保持。

(4)S=R=1

無論Q\overline{Q}原來是什麼狀態,S=R=1將強制Q=\overline{R+\overline{Q}}=\overline{1+\overline{Q}}=0\overline{Q}=\overline{S+Q}=\overline{1+Q}=0,鎖存器處在既非1,又非0的非定義狀態。若SR同時回到0,則無法確定孫存其將落入1狀態還是0狀態(Q先變為1的話,\overline{Q}變為0,鎖存器進入1狀態;\overline{Q}先變為1的話,Q變為0,鎖存器進入0狀態。因此,屬於不確定狀態)。由於電路存在製造誤差,G_{1}G_{2}的延遲時間總是有微小差別,若G_{1}的延遲時間稍短,在SR同時跳變到0時,Q端會搶先跳變為1,迫使\overline{Q}=0;反之,若G_{2}的延遲時間稍短,鎖存器則進入0狀態。所以,實際的電路在這種情況下總是倒向電路設計者無法預知的一個固定狀態。為保證鎖存器始終工作於定義狀態,輸入訊號應遵守{\color{Red} S\cdot R=0}的約束條件,也就是說不允許{\color{Red} S=R=1}

根據上述分析得到基本SR鎖存器的功能表如下圖所示(4行內容分別對應前述4種狀態):

下圖為基本SR鎖存器的邏輯符號:

SR分別為置位端和復位端,Q\overline{Q}為互補的兩個輸出端,其中\overline{Q}輸出鎖存器的非狀態,所以用小圓圈示之。這樣,不通過邏輯閘電路,僅從抽象的邏輯符號也可以理解基本SR鎖存器各輸入、輸出訊號之間的邏輯關係。

基本SR鎖存器的資料保持、置0和置1功能,是一個可實際應用的儲存單元的邏輯功能,基本SR鎖存器的典型工作波形如下圖所示:

1.2用與非門構成的基本SR鎖存器 

除了可以用或非門構成基本SR鎖存器,還可以用與非門構成基本SR鎖存器,其邏輯原理圖和邏輯符號如下所示:

由上圖分析可以得到\overline{S}\overline{R} 為不同組合輸入狀態時鎖存器的狀態(非表示低電平有效,也就是說,當\overline{S}\overline{R}為0時,表示有激勵訊號;為1時,表示無激勵訊號)。用與非門構成的基本SR鎖存器的功能表如下所示

 觀察上表可知,與非門構成的基本SR鎖存器工作時應當受到\bg_white \overline{S}+\overline{R}=\overline{S\cdot R}=1的約束條件,即同樣應遵守S\cdot R=0的約束條件。由於功能與前述或非門構成的基本SR鎖存器類似,這裡不再贅述。

1.3時序電路的描述方法(以或非門構成的RS鎖存器為例)

1.3.1特性表

特性表反應輸入變數和原狀態以及新狀態關係的一種真值表,也被稱為狀態轉換真值表。原狀態,用Q_{n}表示,新狀態用Q_{n+1}表示。RS鎖存器的特性表如下表所示:

根據特性表可以較清楚地看出RS鎖存器的邏輯功能,比如當S_{D}=R_{D}=0時,也就是說,兩個輸入端均無激勵訊號,Q_{n}=Q_{n+1},即鎖存器的原狀態Q_{n}和新狀態Q_{n+1}保持不變。

1.3.2特性方程

 特徵方程鎖存器新狀態的邏輯函式表示式。根據RS鎖存器的特性表寫出它的特性方程(將輸出等於1的項提出後組成一個與或式),得到其函式式:Q_{n+1}=\overline{S_{D}}\cdot \overline{R_{D}}\cdot Q_{n}+S_{D}\cdot \overline{R_{D}}\cdot \overline{Q_{n}}+S_{D}\cdot \overline{R_{D}}\cdot Q_{n},另有兩個無關項,根據卡諾圖化簡得:Q_{n+1}=S_{D}+\overline{R_D}\cdot Q_{n}

1.3.3狀態圖

狀態圖可以更加形象地表示是時序邏輯電路的功能。SR鎖存器的狀態圖如下圖所示:

從RS鎖存器的狀態圖可以看出,,該狀態圖是由兩個圓圈和四個箭頭組成,兩個圓圈中的01表示的是RS 鎖存器的兩個狀態(也就是或非門構成的SR鎖存器的輸出Q),而四個箭頭表示的是四個轉換過程,箭頭的末端是原狀態Q_{n} ,箭頭的前端是新狀態Q_{n+1}(箭頭由原狀態指向新狀態,即Q_{n}\rightarrow Q_{n+1}),在箭頭旁邊的S_{D}R_{D}是狀態改變的條件, X代表任意狀態。由此,我們就可以根據RS 鎖存器的狀態圖來看出RS 鎖存器的狀態是如何變化的。

1.3.4波形圖

假設SR鎖存器的初始狀態為1,其SR端輸入和輸出QQ_{n+1}波形如下圖所示。

 雖然圖中1、2兩處輸入訊號越出了SR鎖存器的約束條件,出現了S=R=1使得Q=\overline{Q}=0的情況,但是,只要SR的1電平不同時撤銷,此後的輸出狀態仍讓是可以確定的,如上圖3、4處所示。而在5處,由於SR的1電平同時撤銷,所以鎖存器以後的狀態將無法確定,從而失去對它的控制。

1.4門控SR鎖存器

實際工作中,希望有一個控制訊號控制鎖存器狀態的轉換,因此在SR鎖存器的基礎上增加一個控制端,只有控制端的訊號變為有效電平後,SR鎖存器才能按照輸入的置1 或置0 訊號改變相應的狀態,稱之為門控SR鎖存器。通過控制E端電平,可以實現多個鎖存器同步的資料鎖存。下圖是門控SR鎖存器的邏輯電路及其對應邏輯符號:

根據其邏輯電路可知,當E=0時,Q_{3}=Q_{4}=0S、 R端的邏輯狀態不會影響到鎖存器的狀態;當\bg_white E=1時,S、 R端的訊號被傳送到基本SR鎖存器的輸入端,從而確定Q\overline{Q}端的狀態,其功能表與用或非門構成的基本SR鎖存器的功能表一致。若\bg_white E=1時輸入訊號S=R=1,則Q=\overline{Q}=0,鎖存器將處於非定義的邏輯狀態。當E恢復到0時,由於Q_{3}Q_{4}同時回到0,將不能確定鎖存器的狀態。因此,應用這種鎖存器必須更嚴格地遵守S\cdot R=0地約束條件。由於約束條件造成地應用限制,因而很少有獨立的門控SR鎖存器產品。但是,在許多大、中規模積體電路種時常應用這種鎖存器,或用它構成觸發器或儲存器。所以,SR鎖存器仍是重要的基本邏輯單元。

門控SR鎖存器的邏輯符號中,方框內用C11R1S表達內部邏輯之間的關聯關係。C表示這種關聯屬於控制型別,其字尾用序號“1”表示該輸入的邏輯狀態對所有以“1”作用字首的輸出起控制作用。這裡由於置位和復位輸入均受C1控制,故SR之前分別以表示序號“1”作為字首。

1.5 D鎖存器

D鎖存器就是能將輸入端的單路資料D存入到鎖存器中的電路。

不同於SR鎖存器,D鎖存器在工作中不存在非定義狀態,因而得到廣泛應用。目前,CMOS積體電路主要採用傳輸門控D鎖存器和邏輯閘控D鎖存器兩種電路結構形式,特別是前者電路結構簡單在晶片中佔用面積小而更受青睞。

1.5.1CMOS傳輸門

CMOS傳輸門由一個P溝道和一個N溝道增強型MOS管並聯而成,傳輸門的電路結構及邏輯符號如下所示:

T_{N}T_{P}的源極和漏極可以互換,因而傳輸門的輸入輸出端可以互換使用,即為雙向器件。 工作特性為:C=0,\overline{C}=VDD時,TG斷開;C=VDD,\overline{C}=0時,TG導通。

1.5.2傳輸門控D鎖存器

傳輸門控D鎖存器是在基本雙穩態電路中插入兩個傳輸門TG_{1}TG_{2}構成的,下圖是其邏輯電路及其對應邏輯符號:

D鎖存器有兩個輸入端:使能端E和資料輸入端D。當E=1時,\overline{C}=0,C=1TG_{1}導通,TG_{2}斷開,如下圖所示:

 輸入資料D經G_{1}G_{2}兩個門,使Q=D\overline{Q}=\overline{D},這時輸出Q端跟隨輸入訊號D的變化,因此又被稱作透明鎖存器。當E=0時,\overline{C}=1C=0TG_{1}斷開,TG_{2}導通,如下圖所示:

這種情況下與基本雙穩態電路一致。由於G_{1}G_{2}輸入端存在的分佈電容對邏輯電平有短暫的保持作用在兩個傳輸門狀態轉換瞬間並不影響電路的輸出狀態。之後,電路被鎖定在E訊號由1變0前瞬間D訊號所確定的狀態,在E=0的條件下可保持鎖存器狀態不變使1位二進位制資料得以儲存

D鎖存器的特性表如下表所示:

D鎖存器的功能表如下表所示:

 D鎖存器的狀態圖如下圖所示:

從狀態圖可以看出,當D=0狀態時,輸出Q_{n+1}將保持0狀態;當輸入D=1時,輸出Q_{n+1}將從0變為1。以下是D觸發器的波形圖:

1.5.3邏輯閘控D鎖存器

邏輯閘控D鎖存器是由門控SR鎖存器在輸入端SR之間連線一個G_{5}得到的,從而保證了S\cdot R=0的約束條件,消除了可能出現的非定義狀態。其邏輯功能與傳輸門控D鎖存器完全相同,因此邏輯符號也相同。邏輯閘控D鎖存器的邏輯電路如下所示:

1.6空翻現象

空翻現象指當控制訊號有效時,激勵訊號的任何變化,都將直接引起鎖存器輸出狀態的改變,若輸入訊號若發生多次變化輸出狀態也跟著發生多次變化(由於干擾導致輸入電平突變引起鎖存器邏輯值發生變化,這一現象就被稱為鎖存器的空翻。下圖是D鎖存器發生空翻現象的波形圖:

從波形圖中可以看出,藍色虛線內,由於控制訊號C為高電平, D=1,可以得出Q=1。藍色虛線和黃色虛線之間,由於D=0,那麼Q=0;同理,兩條黃色虛線之間,D=1Q=1空翻是一種有害的現象,它使得時序電路不能按時鐘節拍工作,造成系統的誤動作。我們前面學習的鎖存器都存在空翻現象,而引起空翻現象是由鎖存器的結構導致的,為了能夠解決鎖存器的空翻現象,人們便在鎖存器的基礎上進行了修改,因此人們便設計出了觸發器,觸發器按照邏輯功能的不同可分為RS 觸發器、D 觸發器、JK 觸發器、T 觸發器。

由於在FPGA 設計中我們更多的是利用D 觸發器來設計電路,基本上每一個時序電路模組都能看到D 觸發器的身影,所以下面將重點放在D 觸發器上,其他的觸發器我們這裡就不再進行詳細講解,可參考《電子技術基礎 數字部分》(第六版)。

2.觸發器

觸發器(Flip-Flop)也是數位電路中的一種具有記憶功能地邏輯器件。觸發器是一種對脈衝邊沿敏感的雙穩態電路,它只能在觸發脈衝的上升沿(或下降沿)瞬間改變狀態,在數位電路中可以記錄數字訊號“0”和“1”。D鎖存器在使能訊號E為邏輯1期間更新狀態。在下圖所示的波形中以加粗部分表示這個敏感時期。

在此期間,它的輸出會隨輸入訊號變化。而很多時序電路要求儲存電路只對時鐘訊號的上升沿或下降沿敏感,而在其他時刻保持狀態不變,如移位暫存器和計數器。這種對時鐘脈衝邊沿敏感的狀態更新稱為觸發具有觸發工作特性的儲存單元稱為觸發器。電路結構不同的觸發器對時鐘脈衝的敏感邊沿可能不同,分為上升沿觸發和下降沿觸發。以CP(Clock Pulse)命名上升沿觸發的時鐘訊號,觸發邊沿如下圖波形中的箭頭所示:

\overline{CP}命名下降沿觸發的時鐘訊號,觸發邊沿如下圖波形中的箭頭所示:

在Verilog HDL中,對脈衝電平敏感的鎖存器和脈衝邊沿的觸發器的描述語句是不同的。 

目前應用的觸發器主要有三種電路結構:主從觸發器、維持阻塞觸發器和利用傳輸延遲的觸發器。由於CMOS主從結構的D觸發器在晶片上佔用的面積最小邏輯設計方法比較簡單,在大規模CMOS積體電路,特別是可程式設計邏輯器件(如CPLD、FPGA)和專用積體電路(ASIC)中得到普遍應用,因而在目前的工程實踐中更多地應用到D觸發器。

2.1主從D觸發器

2.1.1主從D觸發器的電路結構和工作原理

下圖將兩個CMOS傳輸門控D觸發器級聯構成典型的CMOS主從D觸發器。圖中左邊的鎖存器稱為主鎖存器,右邊的稱為從鎖存器。主鎖存器與從鎖存器的使能訊號相位相反,利用兩個鎖存器的互動鎖存,則可實現儲存資料和輸入訊號之間的隔離

主從D觸發器的工作過程分為以下兩個節拍:

(1)當時鍾訊號CP=0時,\overline{C}=1C=0,使得TG_{1}導通, TG_{2}斷開,D端輸入訊號進入主鎖存器,這時Q^{'}跟隨D端的狀態變化,即Q^{'}=D。例如,D=1時,經TG_{1}傳送到G_{1}的輸入端,使\overline{Q^{'}}=0Q^{'}=1。同時由於TG_{3}斷開,切斷了從鎖存器與主鎖存器之間的連線,而TG_{4}導通,使G_{3}的輸入端和G_{4}的輸出端經過TG_{4}聯通,構成最基本的雙穩態電路,使從鎖存器維持原來的狀態,即觸發器的輸出狀態不變

(2)當CP由0跳變為1後,\overline{C}=0C=1,使得TG_{1}斷開,從而切斷D端與主鎖存器的聯絡,同時TG_{2}導通,將G_{1}的輸入端和G_{2}的輸出端連通,主鎖存器鎖存CP跳變前D端的資料(主鎖存器維持原來的狀態)。這時,TG_{3}導通,TG_{4}斷開,Q^{'}端訊號傳送到Q端。若Q^{'}=1\overline{Q^{'}}=0,經TG_{3}傳送到G_{3}的輸入端,於是\overline{Q}=0Q=1

在一個變化週期內,觸發器的輸出狀態只可能改變一次,克服了鎖存器存在的空翻現象。

可見,從鎖存器在工作中是跟隨主鎖存其的狀態變化的,觸發器因之冠名為主從(Master-Slave)。它的狀態轉換髮生在CP訊號上升沿到來後的狀態,輸出訊號由CP訊號上升沿到達前瞬間的資料訊號D所決定,從功能上考慮為D觸發器。如果以Q_{n+1}表示上升沿到達後觸發器的狀態,則D觸發器的特性可以用下式來表達:Q_{n+1}=D

(1)D觸發器的特性表

已輸入訊號和觸發器的現態為變數,以次態為函式,描述它們之間邏輯關係的真值表稱為觸發器的特性表。D觸發器的特性表如下圖所示,表中對觸發器的輸入訊號D和現態Q^{n}的每種組合都列出了相應的次態Q^{n+1}

 (2)D觸發器的特性方程

觸發器的邏輯功能也可以用邏輯表示式來描述,稱為觸發器的特性方程。根據D觸發器的特性表可以列出D觸發器的特性方程:Q_{n+1}=D

(3)D觸發器的狀態圖

D觸發器的狀態圖由D觸發器的特性表匯出。圓圈內為觸發器的狀態Q,分別標示為0和1的兩個圓圈代表了觸發器的兩個狀態;4跟帶箭頭的方向線表示狀態轉換的方向,分別對應特性表中的四行,方向線的起點為觸發器的現態Q^{n},箭頭指向相應的次態Q^{n+1};方向線旁邊標出了狀態轉換的條件,即輸入訊號D的邏輯值。D觸發器的狀態圖如下圖:

由特性表、特徵方程或狀態圖均可以看出,當D=0時,觸發器的下一狀態將被置0Q^{n+1}=0) ;當D=1時,將被置1Q^{n+1}=1)。在時鐘脈衝的兩個觸發沿之間,觸發器狀態保持不變,即儲存1位二進位制資料

2.1.2 D鎖存器與D觸發器的比較

D鎖存器與D觸發器的邏輯功能其實是相同的,只不過它們的觸發方式有所不同。下圖是D鎖存器與D觸發器的波形圖:

從上面的波形圖可以看出, D觸發器是在時鐘訊號CLK為0時,才會接收輸入訊號D的值,並將這個值鎖存起來,當控制訊號CLK 變為1 時,輸出訊號Q 才會被改變。那麼D 觸發器,其實就是在CLK 這個時鐘訊號由0 變為1 的這個邊沿進行觸發的,通常我們就將這種觸發方式稱為邊沿觸發,通過這種邊沿觸發方式的D 觸發器我們也將它稱為邊沿D 觸發器。

D 鎖存器的觸發方式是電平觸發,和我們剛剛講的邊沿觸發是有所不同的。這種不同是由於鎖存器和觸發器的電路結構不同,而造成的。這裡需要注意的是,由於D 鎖存器的功能和D 觸發器的功能是一樣的,所以在編寫程式碼時很容易把D 鎖存器當成D 觸發器來使用,這種情況應該是極力避免的。

2.1.3利用Verilog描述觸發器

1  module Digital_Data_Flip_Flop
2  (
3      CLK_50M,RST_N,D,Q
4  );
5
6  input CLK_50M;
7  input RST_N;
8  input D;
9  output reg Q; //可以分開寫output Q;reg Q;也可以合併在一起
10
11 always @ (posedge CLK_50M or negedge RST_N)
12 begin
13     if(!RST_N)
14         Q <= 1'b0;
15     else
16         Q <= D;
17 end
18
19 endmodule

相較於之前描述組合邏輯電路的Veriliog程式碼,在長度上並沒有什麼差別,但是該程式碼所描述的功能與之前程式碼所描述的功能是有很大區別的,之前我們所描述的功能是沒有時鐘訊號的,即之前描述的都是組合邏輯電路,而現在描述的是一個貨真價實的時序電路。以下是對D觸發器Verilog程式碼的分析:

該程式碼的第11 行至第17 行,是本程式中最核心的,也是用法相對比較多的always 模組。always 模組敏感表可以為電平、沿訊號(上升沿)posedge、(下降沿)negedge前面已經將always 模組用在組合邏輯電路中,其基本程式碼結構如下所示:

1  always @ (*) //always @ (A,B) 也可以always @ (A or B)
2  begin
3  //具體邏輯
4  end

always 後若有沿訊號(上升沿posedge,下降沿negedge)宣告,則多為時序邏輯,其基本程式碼結構如下所示:

1  always @ (posedge CLK_50M) //單個沿觸發的時序邏輯
2  begin
3  //具體邏輯
4  end
5
6  always @ (posedge CLK_50M or negedge RST_N) //多個沿觸發的時序邏輯
7  begin
8  //具體邏輯
9  end

組合邏輯電路中always@(A,B)意義為:@為事件等待語句,意思是一直等待A和B兩個敏感變數,不管A和B是從高變低,還是從低變高,都將會執行always下面的begin...end中的語句。如果A和B都沒有變化,那麼always 也將不往下執行,將一直迴圈等待新標準下也可以寫作:always@(*),解釋如下:always @ (*)是個組合邏輯電路的描述方式;是為了防止在設計時考慮不周全帶來一些操作失誤,所以敏感表用*(表示全部的敏感變數,這裡表示A 和B),只要有任何輸入訊號變化,其輸出立即發生變化

時序邏輯電路中always @ (posedge CLK_50M or negedge RST_N)@也同樣是事件等待語句,只是這裡一直等待的是CLK_50M 和RST_N 二個敏感變數的上升沿和下降沿的變化,如果有一個CLK_50M 的上升沿到來,那麼便會執行always下面的begin…end 中的語句。同樣的如果有一個RST_N 的下降沿到來,也同樣會執行always下面的begin……end 中的語句。如果兩個訊號都沒有到來,那麼將不會執行begin……end 中的語句,一直等待訊號的到來

注:時序電路中的賦值是”<=“(非阻塞賦值);而組合邏輯電路中的賦值是”=“(阻塞賦值

接下來再來看always模組中的程式碼,首先看到的是第13 行的if 語句,該語句判斷復位訊號是否有效,從變數命名規則中我們可以看出RST_N是一個低電平有效的復位訊號,也就是說,當RST_N=0時,if為真,Q<=1’b0 會被執行,D觸發器將會被複位輸出0當RST_N=1 時,if為假,就要執行else 中的Q<=D 這條語句,D觸發器將會正常工作

3.暫存器

由前面可知,能夠儲存一位二進位制碼的時序電路叫做觸發器,暫存器就是能夠儲存多位二進位制數碼的時序電路。

三態輸出門

三態輸出門除了具有一般閘電路的兩種狀態,即輸出高、低電平外,還具有高輸出阻抗的第三狀態,稱為高阻態,又稱為禁止態。下圖是三態輸出緩衝電路及其邏輯符號,其中A是輸入端,L位輸出端,EN是控制訊號輸入端,也成為使能端。

當使能端EN=1時,如果A=0,則B=1C=1,使得T_{N}導通,同時T_{P}截至,輸出端L=0;如果A=1,則B=0C=0,使得T_{N}截至,同時T_{P}導通,輸出端L=1

當使能端EN=0時,不論A的取值如何,都使得B=1C=0,則T_{N}T_{P}均截至,電路的輸出既不是低電平,又不是高電平,而是開路,這就是第三種高阻工作狀態。

因此,當EN有效的高電平時,電路處於正常邏輯工作狀態L=A;而當EN低電平時,電路處於高阻狀態。下圖是三態輸出閘電路的真值表。

 三態輸出們電路主要用於匯流排傳輸,如計算機或微處理器系統,其連線形式如下所示:

 任意時刻只有一個閘電路的使能端EN為1,該閘電路的訊號被傳送到匯流排上,而其他三態輸出電路處於高阻狀態。這樣就可以按一定順序將各個閘電路的輸出訊號分時送到匯流排上。

3.1暫存器的原理

暫存器是數字系統中用來儲存二進位制資料的邏輯器件。1個觸發器可儲存1位二進位制資料,儲存N位二進位制資料的暫存器需要用N個觸發器組成

由8個觸發器構成的8位暫存器的邏輯圖如下圖所示:

圖中,D_{7}~D_{0}是8位資料輸入端,在CP脈衝上升沿作用下,D_{7}~D_{0}端的資料同時存入相應的觸發器,直到下一個時鐘訊號的上升沿到來之前,無論怎麼改變輸入訊號的值,輸出訊號的值也不會改變,是一種極為簡單的同步時序電路。當輸出使能訊號\overline{OE}=0時,觸發器儲存的資料通過三態門輸出端Q_{7}~Q_{0}並行輸出。下圖是典型的中規模繼承8位暫存器74HC/HCT374的功能表(D_{N}Q_{N}^{n+1}的下標表示第N位觸發器,L^{*}H^{*}表示CP脈衝上升沿之前瞬間D_{N}的電平)。

3.2移位暫存器

移位暫存器有可以分為單向移位暫存器雙向移位暫存器,單向移位暫存器指的就是右移位暫存器和左移位暫存器,而雙向移位暫存器就是既能向左也能向右移位。

3.2.1單向移位暫存器

如果將若干個觸發器級聯成下圖所示電路,則構成基本的移位暫存器。這裡以右移位暫存器為例,如下圖所示:

上圖是一個4位移位暫存器,序列二進位制資料從輸入端D_{SI}輸入,左邊觸發器的輸出作為右鄰觸發器的資料輸入。若將序列數碼\bg_white D_{3}D_{2}D_{1}D_{0}從高位(\bg_white D_{3})至低位(\bg_white D_{0}按時鐘間隔依次送到D_{SI}端,經過第一個時鐘脈衝後,Q_{0}=D_{3}。由於跟隨\bg_white D_{3}後面的是\bg_white D_{2},因此經過第二個時鐘脈衝後,觸發器FF_{0}的狀態移入觸發器FF_{1},而FF_{0}轉變為新的狀態,即Q_{1}=D_{3}Q_{0}=D_{2}。以此類推,該暫存器的功能如下表所示:

由表可知,輸入數碼依次由左邊觸發器移到右側觸發器。經過4個時鐘脈衝後,4個觸發器的輸出狀態Q_{3}Q_{2}Q_{1}Q_{0}與輸入數碼\bg_white D_{3}D_{2}D_{1}D_{0}相對應。下圖是數碼1101(即Q_{3}=1D_{2}=1D_{3}=0D_{0}=1)在移位暫存器中移位的波形,經過4個時鐘脈衝後,1101出現在觸發器的輸出端Q_{3}Q_{2}Q_{1}Q_{0}。這樣,就將序列輸入資料轉換為並行輸出D_{PO}

這裡還畫出了第5到第8個時鐘脈衝作用下,輸入數碼在暫存器中移位的波形。可上圖可知,在第8個時鐘脈衝後,脈衝已從序列資料輸出端D_{S0}(即Q_{3}端)全部移出暫存器。也就是說,隨著時鐘訊號的推移,從輸出端D_{S0}可得到1101的序列輸出。

從上述操作可知,移位暫存器中能用脈衝邊沿敏感的觸發器,而不能用電平敏感的鎖存器來構成,因為在時鐘脈衝高電平期間,鎖存器輸出跟隨輸入變化的特性將使移位操作失去控制。顯然,移位暫存器屬於同步時序電路。

3.2.2多功能雙向移位暫存器

有時需要對移位暫存器的資料流向加以控制,實現資料的雙向移動,其中一個方向稱為右移,另一個方向稱為左移,這種移位暫存器稱為雙向移位暫存器規定邏輯圖中最低有效位(LSB)到最高有效位(MSB)的電路排列順序位從上到下,從左到右。因此,定義移位暫存器中的資料從低位觸發器移向高位為右移,反之為左移。這一點與通常計算機程式中的規定相反,後者從自然二進位制數的排列考慮,將資料移向高位定義為左移,反之為右移。

為了擴充套件邏輯功能和增加使用的靈活性,在雙向移位基礎上,還可以增加並行輸入、並行輸出等功能,構成多功能移位暫存器,其工作模式的簡化示意圖如下所示:

 3.2.3利用Verilog描述移位暫存器

1  module Digital_Shift_Reg
2  (
3      CLK_50M,RST_N,DATA_EN,DATA_IN,DATA_OUT
4  );
5
6  input CLK_50M;
7  input RST_N;
8  input DATA_EN;
9  input DATA_IN;
10 output DATA_OUT;
11
12 reg [3:0] DATA_OUT;
13 reg [3:0] DATA_OUT_N;
14
15 //時序電路
16 always @ (posedge CLK_50M or negedge RST_N)
17 begin
18     if(!RST_N)
19         DATA_OUT <= 4'b0;
20     else
21         DATA_OUT <= DATA_OUT_N;
22 end
23
24 //組合電路
25 always @ (*)
26 begin
27     if(DATA_EN)
28         DATA_OUT_N = {DATA_OUT[2:0] , DATA_IN};
29     else
30         DATA_OUT_N = DATA_OUT;
31 end
32
33 endmodule

 上述程式碼是一個典型的組合邏輯電路和時序邏輯電路分開寫的風格。。模組名、埠宣告、資料型別定義三部分這裡不再贅述。程式碼的16到22行程式碼主要完成的功能是一個4位的暫存器(即4位的D觸發器),其中RST_N是一個低電平有效的復位訊號;第25行到31行的程式碼主要完成的功能是判斷DATA_EN使能位,並進行移位操作。這裡詳細解釋一下第28行中的“{”和“}”,這裡是拼接運算子舉例說明,A=2'b10,B=4'1111,則{A,B}=6'b101111。接下來詳細講解一下移位操作是如何實現的,假設DATA_OUT為0000,DATA_IN為1,DATA_EN為1,當DATA_EN為1時,程式會自動執行第28行,由於DATA_OUT=4'b0000,所以DATA_OUT的低三位為3'b000,又因為DATA_IN=1'b1,所以DATA_OUT_N={3'b000,1'b1}=4'b0001;當程式執行第二次的時候,DATA_OUT為0001,此時假設DATA_IN為0,當DATA_IN為1時,DATA_OUT_N={3'b001,1'b0}=4'b0010。依次類推,這就是移位暫存器實現的過程。

有時要求在移位過程中,資料仍保持在暫存器中不丟失。此時,只要將移位暫存器最高位的輸出接至最低位的輸入,或將最低位的輸出接至最高位的輸出,便可實現這個功能,稱為環形移位暫存器。亦可作計數器使用,稱為環形計數器

4.計數器

計數器是最常用的時序電路之一,它們不僅可用於對脈衝進行計數,還可用於分頻定時產生節拍脈衝以及其他時序訊號。計算器的種類不勝列舉,按觸發器動作分類,可分為同步計數器非同步計數器按編碼數值增減分類,可分為遞增計數器遞減計數器和可逆計數器按編碼分類,又可分為二進位制計數器BCD計數器迴圈碼計數器等。計數器執行時,從某一狀態開始依次遍歷不重複的各個狀態後完成一次迴圈,所經過的轉檯總數稱為計數器的模(Module),並用M表示。若某個計數器在n個狀態下迴圈計數,通常則稱之為模n計數器,或M=n計數器。例如一個在60個不同狀態中迴圈轉換的計數器,就可稱為模60,或M=60計數器。有時也把模n計數器稱為n進位制計數器。這裡以4位同步二進位制計數器基本環形計數器為例。

4.1 4位同步二進位制計數器

由四位D觸發器組成的計數器電路圖如下所示:

上述計數器是由4個邊沿D觸發器F_{1}F_{2}F_{3}F_{4},再加上三個異或門和兩個與門構成的。電路計數的過程詳述如下:

假設電路的初始狀態為000(即初始輸出Q_{1}Q_{2}Q_{3}Q_{4}=0000),接下來看四個觸發器的輸入訊號分別是什麼,先看F_{1}F_{1}的輸入訊號D,是由\overline{Q_{1}}反饋回來的,已知此時Q_{1}=0,因此\overline{Q_{1}}=1,這個1反饋給輸入訊號D,此時F_{1}的輸入訊號就是1;接下來看F_{2}F_{2}的輸入訊號是Q_{1}Q_{2}經過一個異或門之後得到的,已知此時Q_{1}=0Q_{2}=0,因此F_{2}的輸入訊號為0;接著看F_{3}F_{3}的輸入訊號訊號是由Q_{1}Q_{2}經過一個與或門之後的輸出與Q_{3}異或得到的,因此F_{3}的輸出為0;最後看F_{4}F_{4}的輸入是由Q_{1}Q_{2}Q_{3}相與之後的輸出與Q_{4}異或得到的,因此F_{4}的輸出為0。

分析完F_{1}F_{2}F_{3}F_{4}此時的輸出值後,就可以根據D觸發器的邏輯規律知道下一刻電路的輸出值了,當CLK埠出現一個上升沿,即CLK由0變1,四個邊沿D觸發器同時觸發,當CLK這個時鐘訊號的上升沿到來時,D觸發器的輸入值將會被鎖存,下一刻4個D觸發器的輸出為Q_{1}=1Q_{2}=0Q_{3}=0Q_{4}=0Q_{1}為二進位制最低位,Q_{4}為二進位制最高位)。因此現在計數器輸出的值為二進位制數0001,也就是十進位制的1。依此類推,當第二個時鐘訊號的上升沿到來時,計數器會輸出二進位制數0010,也就是十進位制的2。每當電路多來一個時鐘上升沿,計數器就會加1。當電路計數到第十六個脈衝時,電路狀態將由1111變為0000,完成一個迴圈週期,因此該電路也稱為模16計數器。所謂同步是指該電路中的四個邊沿D觸發器共用一個時鐘脈衝CLK,當時鐘上升沿到來時,它們能同時觸發,這就叫同步。所謂非同步就是這些觸發器不是共用同一個時鐘脈衝,且觸發不是同時發生的

模16加法計數器特性表如下所示:

 下圖是模16加法計數器狀態圖。

4.2基本環形計數器

將前述的移位暫存器的D_{SO}Q_{3})與D_{S1}相連,則構成環形計數器,如下圖所示。

若事先通過\overline{PE}端施加低電平脈衝,在4個觸發器內建入資料Q_{3}Q_{2}Q_{1}Q_{0}=0001,那麼環形計數器在CP脈衝作用下,將會有如下所示的4個狀態,於是,電路成為模4計數器。

 下圖是在4個CP脈衝作用下的波形。

可以看出,這種計數器不必譯碼就能直接輸出4個狀態的譯碼訊號,亦不存在普通譯碼電路輸出易出現的競爭-冒險現象。 

4.3計數器的應用

瞭解完計數器的工作原理,接下來就是計數器的應用,首先想到的就是秒錶,秒錶就是一個典型的計數器。這裡暫不考慮秒錶的暫停和計時功能,主要了解一下秒錶的基本工作原理。

 一個兩位數的秒錶可以從0一直累加到59,然後再返回0迴圈進行累加,前述的是一個模16計數器,這裡從0到59迴圈累加,因此是一個模60計數器。模60計數器的電路結構相對模16是更加複雜的,如果直接選擇用閘電路進行搭建是十分麻煩的,因此這裡不直接用模60計數器來實現,而是選擇用模6計數器加上模10計數器的方法實現,原因在於一個兩位的秒錶是分各位和十位的,個位顯示0-9這十個數,十位顯示0-5這留個數,可以將十位和各位分開來進行技術。下圖中的計數器開始計數,它的個位數字每隔一秒變化一次,變化到9的時候,它的下一刻將會歸零,然後重新計數;而十位的數字每隔10秒變化一次,變化到5的時候,它的下一刻也將會歸0,然後重新計數。這就是兩位數秒錶的實現方法,下圖是秒錶的電路示意圖。

 從電路示意圖中可以看出,先將個位的數碼管和十位的數碼管分別與模10 和模6計數器對應,然後,將這兩個計數器的輸出訊號引出,連線到相應的譯碼器上,再通過譯碼器譯碼,將最終的數字顯示在數碼管上。這就是一個兩位數秒錶的電路結構了,這裡要注意的是,圖中的兩個計數器,它們的時鐘訊號不是共用的,模10 計數器的時鐘端,訊號的上升沿是需要間隔1 秒來一次,而模6 計數器的時鐘端,訊號的上升沿是需要間隔10 秒來一次的,具體怎麼產生需要的時鐘訊號,這裡就不再贅述。

4.4利用Verilog描述計數器

1  module Digital_Counter
2  (
3      CLK_50M,RST_N
4  );
5
6  input CLK_50M;
7  input RST_N;
8 
9  reg [3:0] time_cnt;
10 reg [3:0] time_cnt_n;
11
12 //時序電路
13 always @ (posedge CLK_50M or negedge RST_N)
14 begin
15     if(!RST_N)
16         time_cnt <= 4'b0;
17     else
18         time_cnt <= time_cnt_n;
19 end
20
21 //組合電路
22 always @ (*)
23 begin
24     if(time_cnt == 4'hf)
25         time_cnt_n = 4'b0;
26     else
27         time_cnt_n = time_cnt + 1'b1;
28 end
29
30 endmodule

References:

1.康華光《 電子技術基礎 數字部分》(第六版);

2.鋯石科技《HELLO FPGA數字部分》

相關文章