第5章基本邏輯門電路設計(VHDL)_第1頁
第5章基本邏輯門電路設計(VHDL)_第2頁
第5章基本邏輯門電路設計(VHDL)_第3頁
第5章基本邏輯門電路設計(VHDL)_第4頁
第5章基本邏輯門電路設計(VHDL)_第5頁
已閱讀5頁,還剩127頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第5章基本邏輯電路設計

5.1組合邏輯電路設計5.2

時序邏輯電路設計5.3存儲器設計5.4狀態(tài)機的VHDL設計

12/20/2023第5章基本邏輯電路設計

教學目標教學重點教學過程12/20/2023掌握組合邏輯電路的設計掌握總線接口電路的設計掌握存儲器和狀態(tài)機的設計通過若干數(shù)字電路設計實例掌握復雜邏輯電路的設計方法第5章教學目標12/20/2023第5章教學重點

掌握組合邏輯電路的設計掌握總線接口電路的設計掌握存儲器和狀態(tài)機的設計

12/20/20235.1組合邏輯電路設計5.1.1基本門電路

1.基本門電路的VHDL語言描述基本門電路用VHDL語言來描述十分方便。為方便起見,在下面的兩輸入模塊中,使用VHDL中定義的邏輯運算符,同時實現(xiàn)一個與門、或門、與非門、或非門、異或門及反相器的邏輯。

本節(jié)的組合邏輯電路設計主要有:基本門電路、3-8譯碼器、8-3線優(yōu)先編碼器、8位比較器、多路選擇器、三態(tài)門電路、單向總線驅動器、雙向總線緩沖器等設計實例。12/20/2023

【例5.1.1】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYGATEISPORT(A,B:INSTD_LOGIC;

YAND,YOR,YNAND,YNOR,YNOT,YXOR:OUTSTD_LOGIC);

ENDGATE;ARCHITECTUREARTOFGATEIS12/20/2023BEGINYAND<=AANDB; --與門輸出

YOR<=AORB; --或門輸出

YNAND<=ANANDB;--與非門輸出

YNOR<=ANORB; --或非門輸出

YNOT<=ANOTB; --反相器輸出

YXOR<=AXORB; --異或門輸出

ENDART;12/20/20232.3-8譯碼器下面我們分別以4種方法描述一個3-8譯碼器。【例5.1.2】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED_ALL;ENTITYDECODERISPORT(INP:INSTD_LOGIC_VECTOR(2DOWNTO0);

OUTP:OUTBIT_VECTOR(7DOWNTO0));ENDDECODER;12/20/2023方法1:使用SLL邏輯運算符ARCHITECTUREART1OFDECODERISBEGINOUTP<="11111110"SLL(CONV_INTEGER(INP));----輸出低有效譯碼ENDART1;

12/20/2023方法2:使用PROCESS語句ARCHITECTUREART2OFDECODERISBEGINPROCESS(INP)BEGINOUTP<=(OTHERS=>‘1’)--對輸出所有位全賦0OUTP(COVN_INTEGER(INP))<=‘1’--僅對其中的一位賦值

ENDPROCESS;ENDART212/20/2023方法3:使用CASE_WHEN語句LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYDECODERISPORT(SEL:INSTD_LOGIC_VECTOR(2DOWNTO0);

EN:INSTD_LOGIC;---加使能控制端

Y:OUTBIT_VECTOR(7DOWNTO0));ARCHITECTUREART3OFDECODERISBEGINPROCESS(SEL,EN)BEGINY<=”11111111”;IF(EN=’1’)THEN12/20/2023CASESELISWHEN"000"=>Y(0)<=‘0’;--輸出低有效

WHEN"001"=>Y(1)<=’0’;

WHEN"010"=>Y(2)<=‘0’;

WHEN"011"=>Y(3)<=‘0’;

WHEN"100"=>Y(4)<=‘0’;

WHEN"101"=>Y(5)<=‘0’;

WHEN"110"=>Y(6)<=‘0’;

WHEN"111"=>Y(7)<=‘0’;

WHENOTHERS=>NULL;

ENDCASE;ENDPROCESS;ENDART3;

12/20/2023方法4:使用條件選擇WHENELSE語句

ARCHITECTUREART4OFDECODERISBEGINY(0)<=‘0’WHEN(EN=’1’ANDSEL="000")ELSE’1’;

Y(1)<=‘0’WHEN(EN=’1’ANDSEL="001")ELSE’1’;

Y(2)<=‘0’WHEN(EN=’1’ANDSEL="010")ELSE’1’;

Y(3)<=‘0’WHEN(EN=’1’ANDSEL="011")ELSE’1’;

Y(4)<=‘0’WHEN(EN=’1’ANDSEL="100")ELSE’1’;

Y(5)<=‘0’WHEN(EN=’1’ANDSEL="101")ELSE’1’;

Y(6)<=‘0’WHEN(EN=’1’ANDSEL="110")ELSE’1’;

Y(7)<=’0’WHEN(EN=’1’ANDSEL="111")ELSE’1’;ENDART4;12/20/20233.8-3線優(yōu)先編碼器下面我們用三種方法設計8-3線優(yōu)先編碼器。8-3線優(yōu)先編碼器,輸入信號為y0、y1、y2、y3、y4、y5、y6和y7,輸出信號為OUT0、OUT1和OUT2。輸入信號中y0的優(yōu)先級別最低,依次類推,y7的優(yōu)先級別最高?!纠?.1.3】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYENCODERISPORT(y0,y1,y2,y3,y4,y5,y6,y7:INSTD_LOGIC;

OUT0,OUT1,OUT2:OUTSTD_LOGIC);ENDENCODER;12/20/2023方法1:使用條件賦值語句ARCHITECTUREART1OFENCODERISSIGNALOUTS:STD_LOGIC_VECTOR(2DOWNTO0);

BEGINOUTS(2DOWNTO0)<="111"WHENy7=‘1’ELSE"110"WHENy6=‘1’ELSE"101"WHENy5=‘1’ELSE"100"WHENy4=‘1’ELSE"011"WHENy3=‘1’ELSE"010"WHENy2=‘1’ELSE"001"WHENy1=‘1’ELSE"000"WHENy0=‘1’ELSE"XXX";OUT0<=OUTS(0);

OUT1<=OUTS(1);

OUT2<=OUTS(2);

ENDART1;12/20/2023

方法2:使用IF語句LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYENCODERISPORT(IN1:INSTD_LOGIC_VECTOR(7DOWNTO0);

OUT1:OUTSTD_LOGIC_VECTOR(2DOWNTO0));ENDENCODER;ARCHITECTUREART2OFENCODERISBEGINPROCESS(IN1)12/20/2023BEGINIFIN1(7)=‘1’THENOUT1<="111";ELSIFIN1(6)=‘1’THENOUT1<="110";ELSIFIN1(5)=‘1’THENOUT1<="101";ELSIFIN1(4)=‘1’THENOUT1<="100";ELSIFIN1(3)=‘1’THENOUT1<="011";ELSIFIN1(2)=‘1’THENOUT1<="010";ELSIFIN1(1)=‘1’THENOUT1<="001";ELSIFIN1(0)=‘1’THENOUT1<="000";ELSEOUT1<="XXX";ENDIF;

ENDPROCESS;ENDART2;12/20/2023

4.加法器—帶進位的4位加法器【例5.1.4】用FOR-LOOP語句實現(xiàn)LIBRARYIEEE;方法1:USEIEEE.STD_LOGIC_1164.ALL;ENTITYADDER4IS

PORT(A,B:INSTD_LOGIC_VECTOR(3DOWNTO0);

CIN:INSTD_LOGIC;SUM:OUTSTD_LOGIC_VECTOR(3DOWNTO0);COUNT:OUTSTD_LOGIC);ENDADDER4;12/20/2023ARCHITECTUREARTOFADDER4ISSIGNALC:STD_LOGIC_VECTOR(4DOWNTO0);

BEGINPROCESS(A,B,CIN,C)BEGINC(0)<=CIN;FORIIN0TO3LOOP---用FOR循環(huán)語句實現(xiàn)多位相加

SUM(I)<=A(I)XORB(I)XORC(I);C(I+1)<=(A(I)ANDB(I))OR(C(I)AND(A(I)ORB(I)));ENDLOOP;

12/20/2023COUNT<=C(4);---總的進位輸出

ENDPROCESS;ENDART;方法2:直接使用加法“+”函數(shù)LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED_ALL;ENTITYADDER4_OPIS

12/20/2023PORT(A,B:INSTD_LOGIC_VECTOR(3DOWNTO0);

CIN:INSTD_LOGIC;SUM:OUTSTD_LOGIC_VECTOR(3DOWNTO0);COUNT:OUTSTD_LOGIC);ENDADDER4_OP;ARCHITECTUREARTOFADDER4_OPISSIGNALC:STD_LOGIC_VECTOR(4DOWNTO0);

BEGINPROCESS(A,B,CIN,C)BEGINENDPROCESS;SUM<=C(3DOWNTO0)COUT<=C(4)ENDART12/20/2023

5.8位比較器

比較器可以比較兩個二進制是否相等,下面是一個8位比較器的VHDL描述。有兩個8位二進制數(shù),分別是A和B,輸出為EQ,當A=B時,EQ=1,否則EQ=0?!纠?.1.5】LIBRARYIEEE;USEIEEE.STD_LOGIC_VECTOR(7DOWNTO0);ENTITYCOMPAREISPORT(A,B:INSTD_LOGIC_VECTOR(7DOWNTO0);

EQ:OUTSTD_LOGIC);ENDCOMPARE;ARCHITECTUREARTOFCOMPAREISBEGINEQ<=‘1’WHENA=BELSE‘0’;ENDART;12/20/2023

6.多路選擇器

選擇器常用于信號的切換,前面用IF語句、CASE語句、條件賦值語句、選擇賦值語句分別描述過4選1選擇器。

5.1.2三態(tài)門及總線緩沖器

三態(tài)門和總線緩沖器是驅動電路經常用到的器件,VHDL語言通過指定大寫的Z值表示高阻狀態(tài)。

A:STD_LOGIC;B_BUS:STD_LOGIC_VECTOR(7DOWNTO0);指定高阻狀態(tài)如下:A<=‘Z’;A_BUS<=“ZZZZZZZZ”;

12/20/2023

【例5.1.6】三態(tài)門描述電路LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYTRI_GATEISPORT(EN,DIN:INSTD_LOGIC;

DOUT:OUTSTD_LOGIC);ENDTRI_GATE;ARCHITECTUREARTOFTRI_GATEISBEGINIF(EN=’1’)THENDOUT<=DIN;

ELSEDOUT<='Z';--此處是單總線

ENDIF;

ENDPROCESS;ENDART;12/20/20235.1.3單向總線驅動器

在微型計算機的總線驅動中經常要用單向總線緩沖器,它通常由多個三態(tài)門組成,用來驅動地址總線和控制總線。一個8位的單向總線緩沖器如圖5-1所示。圖5-1單向總線緩沖器圖5-1單向總線緩沖器12/20/2023

【例5.1.7】單向總線緩沖器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYTR1_BUF8ISPORT(DIN:INSTD_LOGIC_VECTOR(7DOWNTO0);

EN:INSTD_LOGIC;

DOUNT:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ARCHITECTUREARTOFTR1_BUF8IS12/20/2023

BEGINPROCESS(EN,DIN)IF(EN=‘1’)THENDOUT<=DIN;

ELSEDOUT<="ZZZZZZZZ";

ENDIF;

ENDPROCESS;ENDART;

12/20/2023

5.1.4雙向總線緩沖器

雙向總線緩沖器用于數(shù)據(jù)總線的驅動和緩沖,典型的雙向總線緩沖器如圖5-2所示。圖中的雙向總線緩沖器有兩個數(shù)據(jù)輸入輸出端A和B,一個方向控制端DIR和一個選通端EN。EN=0時雙向緩沖器選通,若DIR=0,則A=B,反之則B=A。

圖5-2雙向總線緩沖器12/20/2023

【例5.1.8】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYBIDIRISPORT(A,B:INOUTSTD_LOGIC_VECTOR(7DOWNTO0);

EN,DIR:INSTD_STD_LOGIC);圖5-2雙向總線緩沖器ENDBIDIR;ARCHITECTUREARTOFBIDIRISSIGNALAOUT,BOUT:STD_LOGIC_VECTOR(7DOWNTO0);

BEGIN12/20/2023

PROCESS(A,EN,DIR)BEGINIFEN=‘0’ANDDIR=‘1’THENBOUT<=A;

ELSEBOUT<"ZZZZZZZZ";

ENDIF;

B<=BOUT;

ENDPROCESS;

PROCESS(B,EN,DIR)BEGINIFEN=‘0’ANDDIR=‘1’THENAOUT<=B;

ELSEAOUT<"ZZZZZZZZ";

ENDIF;

A<=AOUT;

ENDPROCESS;

ENDART;12/20/2023

5.2時序邏輯電路設計在本節(jié)的時序電路設計主要有觸發(fā)器、寄存器、計數(shù)器、分頻器、序列信號發(fā)生器和序列信號檢測器等的設計實例。5.2.1時序電路特殊信號描述時鐘信號和復位信號1.時鐘信號的描述1)常用的描述方式:進程的敏感信號是時鐘信號,在進程內部用IF語句描述時鐘的邊沿條件。如:PROCESS(CLOCK_SIGNAL)BEGIN

12/20/2023IF(CLK_EDGE_CONDITION)

THENSIGNAL_OUT<=SIGNAL_IN;…

其他時序語句…ENDIF;ENDPROCESS;2.觸發(fā)器的復位信號描述1)同步復位:在只有以時鐘為敏感信號的進程中定義。如:PROCESS(CLOCK_SIGNAL)BEGIN12/20/2023

IF(CLK_EDGE_CONDITION)

THENIf(reset_condition)thenSIGNAL_OUT<=reset_value;elseSIGNAL_OUT<=SIGNAL_IN;…

其他時序語句…ENDIF;ENDIF;Endprocess;12/20/20232)異步復位:進程的敏感信號表中除時鐘信號外,還有復位信號。PROCESS(reset_signal,CLOCK_SIGNAL)BEGINIf(reset_condition)thenSIGNAL_OUT<=reset_value;

elsef(CLK_EDGE_CONDITION)

THENSIGNAL_OUT<=SIGNAL_IN;…

其他時序語句…ENDIF;Endprocess;12/20/2023

5.2.2常用時序電路設計1.基本觸發(fā)器(Flip_Flop)1)D觸發(fā)器【例5.2.1】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYDCFQISPORT(D,CLK:INSTD_LOGIC;

Q:OUTSTD_LOGIC);ENDDCFQ;ARCHITECTUREARTOFDCFQISBEGINPROCESS(CLK)--同步進程

12/20/2023

【例5.2.2】復位D觸發(fā)器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYDFF3ISPORT(CLR,PSET,CLK,D:INSTD_LOGIC;

Q:OUTSTD_LOGIC);ENDDFF3;ARCHITECTUREARTOFDFF3IS

12/20/2023BEGINPROCESS(CLK,CLR,PSET)--異步進程

BEGINIF(PSET=‘0’)THENQ<=‘1’;--置位信號有效,則觸發(fā)器被置位ELSIF(CLR=‘0’)THENQ<=‘0’;復位信號有效,則觸發(fā)器被復位ELSIF(CLK'EVENTANDCLK=‘1’)THENQ<=D;ENDIF;

ENDIF;

ENDPROCESS;ENDART;

12/20/2023【例5.2.3】同步復位的D觸發(fā)器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYSYNDCFQISPORT(D,CLK,RESET:INSTD_LOGIC;

Q:OUTSTD_LOGIC);ENDSYNDCFQ;ARCHITECTUREARTOFSYNDCFQISBEGINPROCESS(CLK)12/20/2023

BEGINIF(CLK'EVENTANDCLK=‘1’)THENIF(PRESET=‘0’)THEN Q<=‘0’;--時鐘邊沿到來且有復位信號,觸發(fā)器被復位

ELSEQ<=D;--且有復位信號,觸發(fā)器被復位

ENDIF;

ENDIF;

ENDPROCESS;ENDART;12/20/20232.T觸發(fā)器【例5.2.4】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYTCFQISPORT(T,CLK:INSTD_LOGIC;

Q:BUFFERSTD_LOGIC);ENDTCFQ;ARCHITECTUREARTOFTCFQISBEGINPROCESS(CLK)--同步進程

BEGIN

12/20/2023IF(CLK'EVENTANDCLK=‘1’)THENQ<=NOT(Q);

ELSEQ<=Q;

ENDIF;

ENDPROCESS;ENDART;3.RS觸發(fā)器【例5.2.5】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYRSCFQIS

12/20/2023PORT(R,S,CLK:INSTD_LOGIC;

Q,QB:BUFFERSTD_LOGIC);ENDRSCFQ;ARCHITECTUREARTOFRSCFQISSIGNALQ_S,QB_S:STD_LOGIC;

BEGINPROCESS(CLK,R,S)--異步進程

BEGINIF(CLK'EVENTANDCLK=‘1’)THENIF(S=‘1’ANDR=‘0’)THENQ_S<=‘0’;

QB_S<=‘1’;

ELSIF(S<=‘0’ANDR<=‘1’)THEN12/20/2023Q_S<=‘1’;

QB_S<=‘0’;

ELSIF(S<=‘0’ANDR<=‘0’)THENQ_S<=Q_S;--輸出保持不變

QB_S<=QB_S;

ENDIF;

ENDIF;

Q<=Q_S;

QB<=QB_S;

ENDPROCESS;ENDART;12/20/20235.關于觸發(fā)器的同步和非同步復位

觸發(fā)器的初始狀態(tài)應由復位信號來設置。按復位信號對觸發(fā)器復位的操作不同,可以分為同步復位和非同步復位兩種。所謂同步復位,就是當復位信號有效且在給定的時鐘邊沿到來時,觸發(fā)器才被復位;非同步復位,也稱異步復位,則是當復位信號有效時,觸發(fā)器就被復位,不用等待時鐘邊沿信號。下面以D觸發(fā)器為例分別予以舉例12/20/20235.2.3寄存器和移位寄存器1.寄存(鎖存)器

寄存器用于寄存一組二值代碼,廣泛用于各類數(shù)字系統(tǒng)。因為一個觸發(fā)器能儲存1位二值代碼,所以用N個觸發(fā)器組成的寄存器能儲存一組N位的二值代碼。下面給出一個8位寄存器的VHDL描述?!纠?.2.7】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYREGISPORT(D:INSTD_LOGIC_VECTOR(0TO7);

CLK:INSTD_LOGIC;

Q:OUTSTD_LOGIC_VECTOR(0TO7));ENDREG;

12/20/2023ARCHITECTUREARTOFREGISBEGINPROCESS(CLK)BEGINIF(CLK'EVENTANDCLK=‘1’)THEN

Q<=D;

ENDIF;

ENDPROCESS;ENDART;2.移位寄存器

移位寄存器除了具有存儲代碼的功能以外,還具有移位功能。所謂移位功能,是指寄存器里存儲的代碼能在移位脈沖的作用下依次左移或右移。因此,移位寄存器不但可以用來寄存代碼,還可用來實現(xiàn)數(shù)據(jù)的串并轉換、數(shù)值的運算以及數(shù)據(jù)處理等。下面給出一個8位的移位寄存器,其具有左移一位或右移一位、并行輸入和同步復位的功能。

12/20/2023【例5.2.8】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYSHIFTERISPORT(DATA:INSTD_LOGIC_VECTOR(7DOWNTO0);SHIFT_LEFT:INSTD_LOGIC;SHIFT_RIGHT:INSTD_LOGIC;RESET:INSTD_LOGIC;MODE:INSTD_LOGIC_VECTOR(1DOWNTO0);QOUT:BUFFERSTD_LOGIC_VECTOR(7DOWNTO0));12/20/2023ENDSHIFTER;ARCHITECTUREARTOFSHIFTERISBEGINPROCESSBEGINWAITUNTIL(RISING_EDGE(CLK));IF(RESET=‘1’)THENQOUT<="00000000"; ELSE --同步復位功能的實現(xiàn)CASEMODEISWHEN"01"=>QOUT<=SHIFT_RIGHT&QOUT(7DOWNTO1);12/20/2023

--右移一位WHEN"10"=>QOUT<=QOUT(6DOWNTO0)&SHIFT_LEFT;

--左移一位WHEN"11"=>QOUT<=DATA;WHENOTHERS=>NULL;

ENDCASE;

ENDIF;

ENDPROCESS;圖5-36位串行輸入串行輸出移位寄存器ENDART;12/20/20235.2.4計數(shù)器

計數(shù)器是在數(shù)字系統(tǒng)中使用最多的時序電路,它不僅能用于對時鐘脈沖計數(shù),還可以用于分頻、定時、產生節(jié)拍脈沖和脈沖序列以及進行數(shù)字運算等。計數(shù)器分為同步和異步。1.同步計數(shù)器:同步計數(shù)器指在時鐘脈沖(計數(shù)脈沖)的控制下,構成計數(shù)器的各觸發(fā)器狀態(tài)同時發(fā)生變化的計數(shù)器。12/20/2023【例5.2.10】12進制的計數(shù)器的設計

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYCNTM12IS

PORT(Clk,clr,en:INSTD_LOGIC;

Qa,qb,qc,qd:OUTSTD_LOGIC;

Endcount12;ARCHITECTUREARTOFCount12ISSignalcount_4:STD_LOGIC_VECTOR(3DOWNTO0);begin

qa<=count_4(0);qb<=count_4(1);qc<=count_4(2);qd<=count_4(3);12/20/2023process(clk,clr)BEGIN

IF(clr=‘0’)THEN --異步復位

Count_4<="0000";ELSIF(CLK'EVENTANDCLK=‘1’)THEN --IF(en=‘1’)THEN IF(Count_4<="1011")THENCount_4<="0000";ELSE Count_4<=Count_4+1;--調用STD_LOGIC_UNSIGNED.ALL程序包就是為了實現(xiàn)不同數(shù)據(jù)類型直接相加

ENDIF;ENDIF;

12/20/2023ENDIF;ENDPROCESS;ENDART;【例5.2.11】加減計數(shù)器(仿真如圖5-4所示)

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYupdncount64IS

PORT(Clk,clr,updn:INSTD_LOGIC;

qa,qb,qc,qd,qe,qf:OUTSTD_LOGIC);--輸出6位二進制數(shù)最大為63,所以是64進制計數(shù)器12/20/2023Endupdncount64;-ARCHITECTUREARTOFupdncount64IS圖5-4加減計數(shù)器仿波形

Signalcount_6:STD_LOGIC_VECTOR(5DOWNTO0);Begin

qa<=count_6(0);qb<=count_6(1);qc<=count_6(2);qd<=count_6(3);qe<=count_6(4);qf<=count_6(5);12/20/2023process(clk,clr)BEGIN

IF(clr=‘0’)THEN --異步復位

Count_6<="000000";ELSIF(CLK'EVENTANDCLK=‘1’)THEN -IF(updn=‘1’)THEN Count_6<=Count_6+1;--調用STD_LOGIC_UNSIGNED.ALL程序包就是為了實現(xiàn)不同數(shù)據(jù)類型直接相加

ELSECount_6<=Count_6-1;--為減1計數(shù)器

ENDIF;

12/20/2023ENDIF;ENDPROCESS;ENDART;【例5.2.12】60進制(分、秒)計數(shù)器LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYClock60IS

PORT(Clk

:INSTD_LOGIC;

NRESET:INSTD_LOGIC;12/20/2023

Bcd1_out:OUTSTD_LOGIC_VECTOR(3DOWNTO0);--個位顯示0~9需4位寬

Bcd10_out:OUTSTD_LOGIC_VECTOR(2DOWNTO0));--十位顯示0~5需3位寬ENDCLOCK60;ARCHITECTUREARTOFCLOCK60ISSIGNALBcd1n:STD_LOGIC_VECTOR(3DOWNTO0);

SIGNALBcd10n:STD_LOGIC_VECTOR(2DOWNTO0);

BEGINBcd1_out<=Bcd1n;--把定義的中間信分別賦給輸出端口12/20/2023Bcd10_out<=Bcd10n;PROCESS(CLK,NRESET)BEGINIF(NRESET=‘0’)THEN --異步復位Bcd1n<="0000";Bcd10n<="000";ELSIF(CLK’EVENTANDCLK=’1’)THENIF(Bcd1n=9)THEN--如個位為9則清零12/20/2023Bcd1n<="0000";IF(Bcd10n=5)THEN如十位為5則清零Bcd10n<="000";ELSIFBcd10n<=Bcd10n+1;ENDIF;ELSFBcd1n<=Bcd1n+1;ENDIF;ENDIF;ENDPROCESS;ENDART;12/20/2023【例5.2.13】模為60具有異步復位、同步置數(shù)功能的8421BCD碼計數(shù)器LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYClock60IS

PORT(Clk,:INSTD_LOGIC;

NRESET:INSTD_LOGIC;

LOAD:INSTD_LOGIC;

D:INSTD_LOGIC_VECTOR(7DOWNTO0);

CLK:INSTD_LOGIC;

CO:OUTSTD_LOGIC;

12/20/2023QH:BUFFERSTD_LOGIC_VECTOR(3DOWNTO0);

QL:BUFFERSTD_LOGIC_VECTOR(3DOWNTO0));ENDCNTM60;ARCHITECTUREARTOFCNTM60ISBEGINCO<=‘1’WHEN(QH="0101"ANDQL="1001"ANDCI=‘1’)ELSE'0';

--進位輸出的產生PROCESS(CLK,NRESET)

12/20/2023BEGINIF(NRESET=‘0’)THEN --異步復位

QH<="0000";

QL<="0000";ELSIF(CLK'EVENTANDCLK=‘1’)THEN --同步置數(shù)

IF(LOAD=‘1’)THENQH<=D(7DOWNTO4)QL<=D(3DOWNTO0);12/20/2023ELSIF(CI=‘1’)THEN --模60的實現(xiàn)

IF(QL=9)THENQL<="0000";

IF(QH=5)THENQH<="0000";

ELSE --計數(shù)功能的實現(xiàn)

QH<=QH+1;

ENDIFELSEQL<=QL+1;

ENDIF;

ENDIF; --ENDIFLOAD

ENDPROCESS;ENDART;12/20/20232.異步計數(shù)器

異步計數(shù)器又稱為行波計數(shù)器,它的低位計數(shù)器的輸出作為高位計數(shù)器的時鐘信號。由于是行波計數(shù),致使計數(shù)延遲增加,計數(shù)器工作頻率較低。用VHDL語言描述異步計數(shù)器,與同步計數(shù)器描述的區(qū)別主要體現(xiàn)在對各級時鐘的描述上。下面是一個由8個觸發(fā)器構成的異步計數(shù)器,采用元件例化的方式生成。如圖5-5所示圖5-58個觸發(fā)器構成的異步計數(shù)器12/20/2023【例5.2.14】

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYDIFFRISPORT(CLK,CLR,D:INSTD_LOGIC;

Q,QB:OUTSTD_LOGIC);ENDDIFFR;ARCHITECTUREART1OFDIFFRISSIGNALQ_IN:STD_LOGIC;BEGINQ<=Q_IN;QB<=NOTQ_IN;PROCESS(CLK,CLR)12/20/2023BEGINIF(CLR=‘1’)THEN圖5-58個觸發(fā)器構成的異步計數(shù)器

Q_IN<=‘0’;

ELSIF(CLK'EVENTANDCLK=‘1')THENQ_IN<=D;

ENDIF;

ENDPROCESS;ENDART1;LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYRPLCOUNTIS

12/20/2023PORT(CLK,CLR:INSTD_LOGIC;

COUNT:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDRPLCOUNT;ARCHITECTUREART2OFRPLCOUNTISSIGNALCOUNT_IN:STD_LOGIC_VECTOR(8DOWNTO0);

COMPONENTDFFRPORT(CLK,CLR,D:INSTD_LOGIC;

Q,QB:OUTSTD_LOGIC);

ENDCOMPONENT;12/20/2023

BEGINCOUNT_IN(0)<=CLK;

GEN1:FORIIN0TO7GENERATEU:DFFRPORTMAP(CLK=>COUNT_IN(I),--采用名字映射方式

CLR=>CLR,D=>COUNT_IN(I+1),

Q=>COUNT_IN(I),QB=>COUNT_IN(I+1));

ENDGENERATE;ENDART2;用計數(shù)器實現(xiàn)分頻器的設計(實現(xiàn)輸入信號的二分頻、四分頻)12/20/2023【例5.2.16】分頻器的設計LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYN_DIVISPORT(N:INSTD_LOGIC_VECTOR(7DOWNTO0);

Clk:INSTD_LOGIC;

ClkOUT:OUTSTD_LOGIC);

EndN_DIV;ARCHITECTUREARTOFN_DIVISSignalcnt:STD_LOGIC_VECTOR(7DOWNTO0);12/20/2023Signaln_t,n_1:STD_LOGIC_VECTOR(7DOWNTO0);BeginN_1<=N-1;--N_1代表N減一操作N_t<=‘0’&N(7DOWNTO1);--相當于右移一位,即除2操作(N_t是中間暫存信號)process(N,clk)BEGINIFVLK’EVENTANDCLK=‘1’THEN --異步復位

IFCnt<=N_1;THEN;--判斷是否到計數(shù)的終值

CNT<=“00000000”;--到計數(shù)的終值清零ELSIF12/20/2023Cnt<=Cnt+1;--未到計數(shù)的終值則加1計數(shù)ENDIF;IFCNT<N_TTHEN--如小于N的一半則輸出低電平

CLKOUT<=‘0’;ELSECLKOUT<=‘1’;--如大于等于N的一半則輸出高電平(N為偶數(shù)時,輸出方波信號)ENDIF;ENDPROCESS;ENDART;12/20/20235.2.5序列信號發(fā)生器、檢測器

在數(shù)字信號的傳輸和數(shù)字系統(tǒng)的測試中,有時需要用到一組特定的串行數(shù)字信號,產生序列信號的電路稱為序列信號發(fā)生器。1.“01111110”序列發(fā)生器(序列可任意)該電路可由計數(shù)器與數(shù)據(jù)選擇器構成,其VHDL描述如下:【例5.2.17】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYSENQGENIS

12/20/2023PORT(CLK,CLR,CLOCK:INSTD_LOGIC;--兩個時鐘信號

ZO:OUTSTD_LOGIC);ENDSENQGEN;ARCHITECTUREARTOFSENQGENISSIGNALCOUNT:STD_LOGIC_VECTOR(2DOWNTO0);--序列發(fā)生器的關鍵是計數(shù)器,COUNT的寬度決定序列的長度,此為8位

SIGNALZ:STD_LOGIC:=‘0’;--賦初值僅對仿真有用

BEGINPROCESS(CLK,CLR)12/20/2023BEGINIF(CLR=‘1’)THENCOUNT<="000";

ELSEIF(CLK=‘1’ANDCLK'EVENT)THENIF(COUNT="111")THENCOUNT<="000";--此處可不要

ELSECOUNT<=COUNT+1;

ENDIF;

ENDIF;ENDIF;ENDPROCESS;PROCESS(COUNT)12/20/2023BEGINCASECOUNTISWHEN"000"=>Z<=‘0’;WHEN"001"=>Z<=‘1’;WHEN"010"=>Z<=‘1’;WHEN"011"=>Z<=‘1’;WHEN"100"=>Z<=‘1’;WHEN"101"=>Z<=‘1’;WHEN"110"=>Z<=‘1’;WHENOTHERS=>Z<=‘0’;

ENDCASE;ENDPROCESS;12/20/2023PROCESS(CLOCK,Z)BEGIN --消除毛刺的鎖存器

IF(CLOCK'EVENTANDCLOCK=‘1’)THENZO<=Z;--把中間信號通過一個觸發(fā)器寄存輸出

ENDIF;

ENDPROCESS;ENDART;2.M序列發(fā)生器M序列發(fā)生器主要由移位寄存器和反饋環(huán)節(jié)組成。下面是一個20位的M序列發(fā)生器的VHDL描述。

12/20/2023【例5.2.18】LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYXLGEN20ISPORT(CLK,LOAD,EN:INSTD_LOGIC;

DATA:INSTD_LOGIC_VECTOR(20DOWNTO0);

LOUT:BUFFERSTD_LOGIC);ENDXLGEN20;12/20/2023ARCHITECTUREARTOFXLGEN20ISCONSTANTLEN:INTEGER:=20SIGNALLFSR_VAL:STD_LOGIC_VECTOR(LENDOWNTO0);

SIGNALDOUT:STD_LOGIC_VECTOR(LENDOWNTO0);

BEGINPROCESS(LOAD,EN,DOUT)BEGINIF(LOAD=‘1’)THENLFSR_VAL<=DATA;

ELSIF(EN=‘1’)THEN12/20/2023LFSR_VAL(0)<=DOUT(3)XORDOUT(LEN);

LFSR_VAL(LENDOWNTO1)<=DOUT(LEN-1DOWNTO0);ENDIF;

ENDPROCESS;

PROCESS(CLK)BEGINIF(CLK'EVENTANDCLK=‘1’)THENDOUT<=LFSR_VAL;

LOUT<=LFSR_VAL(LEN);

ENDIF;

ENDPROCESS;ENDART;12/20/2023【例5.2.20】簡潔序列檢測器LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYDETECT_SISPORT(DATAIN,CLK:INSTD_LOGIC;

Q:OUTSTD_LOGIC);ENDDETECT_S;ARCHITECTUREARTOFDETECT_SISSIGNALREG:STD_LOGIC_VECTOR(7DOWNTO0);BEGINPROCESS(CLK)BEGIN12/20/2023

IFCLK’EVENTANDCLK=’1’THEN—第一個IF語句

REG(0)<=DATAIN;--被檢測數(shù)據(jù)打入第一個寄存器的0位

REG(7DOWNTO1)<=REG(6DOWNTO0);--內部寄存器進行向高位的移位操作ENDIF;IFREG=”01111110”THENQ<=‘1’;第二個IF語句是判斷檢測到”01111110”圖5-7簡序列時把標志置1ELSSEQ<=‘0’;ENDIF;ENDPROCESS;ENDART;12/20/20235.3存儲器設計半導體存儲器的種類很多,從功能上可以分為只讀存儲器(Read_OnlyMemory,簡稱ROM)和隨機存儲器(RandomAccessMemory,簡稱RAM)兩大類。本節(jié)主要詳細描述了只讀存儲器ROM、靜態(tài)數(shù)據(jù)存儲器SRAM、先進先出堆棧FIFO的設計。5.3.1只讀存儲器ROM

只讀存儲器在正常工作時從中讀取數(shù)據(jù),不能快速地修改或重新寫入數(shù),適用于存儲固定數(shù)據(jù)的場合。下面是一個容量為256×4的ROM存儲的例子,該ROM有8位地址線ADR(0)~圖5-8只讀ROMADR(7),4位數(shù)據(jù)輸出線DOUT(0)~DOUT(3)及使能EN,如圖5-8所示。12/20/2023【例5.3.1】

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USESTD.TEXTIO.ALL;ENTITYROMIS

PORT(EN:INSTD_LOGIC;

ADR:INSTD_LOGIC_VECTOR(7DOWNTO0);

DOUT:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDROM;ARCHITECTUREARTOFROMIS12/20/2023SUBTYPEWORDISSTD_LOGIC_VECTOR(3DOWNTO0);

TYPEMEMORYISARRAY(0TO255)OFWORD;

SIGNALADR_IN:INTEGERRANGE0TO255;

VARIABLEROM:MEMORY;

VARABLESTART_UP:BOOLEAN:=TRUE;

VARABLEL:LINE;

VARABLEJ:INTEGER;

FILEROMIN:TEXTISIN"ROMIN";

BEGINPROCESS(EN,ADR)IFSTART_UPTHEN --初始化開始

FORJINROM'RANGELOOP12/20/2023

READLINE(ROMIN,1);READ(1,ROM(J));

ENDLOOP;

START_UP:=FALSE; --初始化結束

ENDIF;

ADR_IN<=CONV_INTEGER(ADR);--將向量轉化成整數(shù)

IF(EN=‘1’)THENDOUT<=ROM(ADR_IN);

ELSEDOUT<="ZZZZ";

ENDIF;

ENDPROCESS;ENDART;12/20/20235.3.2靜態(tài)數(shù)據(jù)存儲器SRAMRAM和ROM的主要區(qū)別在于RAM描述上有讀和寫兩種操作,而且在讀寫上對時間有較嚴格的要求。下面我們給出一個8×8位的雙口SRAM的VHDL描述實例,如圖5-9所示。

圖5-9雙口SRAM12/20/2023【例5.3.2.】8×8位的雙口SRAM的VHDL描述(仿真圖如圖5-10)LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYDPRAMISGENERIC(WIDTH:INTEGER:=8;

DEPTH:INTEGER:=8;

ADDER:INTEGER:=3);

PORT(DATAIN:INSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0);

DATAOUT:OUT.STD_LOGIC_VECTOR(WIDTH-1DOWNTO0);

12/20/2023CLOCK:INSTD_LOGIC;

WE,RE:INSTD_LOGIC;--讀寫控制信號WADD:INSTD_LOGIC_VECTOR(ADDER-1DOWNTO0);--讀地址3位寬

RADD:INSTD_LOGIC_VECTOR(ADDER-1DOWNTO0));--寫地址3位寬ENDDPRAM;ARCHITECTUREARTOFDPRAMISTYPEMEMISARRAY(0TODEPTH-1)OF--定義MEM為二維數(shù)組,數(shù)組有8個元素,每個元素為8位寬度

STD_LOGIC_VECTOR(WIDTH-1DOWNTO0);12/20/2023

SIGNALRAMTMP:MEM;--信號的類型為MEMBEGIN--第一個進程完成將輸入數(shù)據(jù)寫入RAM指定地址單元

PROCESS(CLOCK)BEGINIF(CLOCK'EVENTANDCLOCK=‘1’)THENIF(WE=‘1’)THEN判寫使能信號有效否

RAMTMP(CONV_INTEGER(WADD))<=DATAIN;--調用轉換函數(shù)把寫地址矢量轉換為整數(shù)

ENDIF;

ENDIF;ENDPROCESS;--讀進程12/20/2023PROCESS(CLOCK)BEGINIF(CLOCK'EVENTANDCLOCK=‘1’)THENIF(RE=‘1’)THEN--判讀使能有效否

DATAOUT<=RAMTMP(CONV_INTEGER(RADD));把輸入讀地址轉換為整數(shù),并把對應單元的數(shù)據(jù)送輸出端口

ENDIF;

ENDIF;

ENDPROCESS;ENDART;12/20/20235.3.3先進先出堆棧FIFOFIFO是先進先出堆棧,作為數(shù)據(jù)緩沖器,通常其數(shù)據(jù)存放結構完全與RAM一致,只是存取方式有所不同。圖5-11電路為一個8×8FIFO,其VHDL描述如例5.3.3?!纠?.3.3】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;ENTITYREG_FIFOISGENERIC(WIDTH:INTEGER:=8;

DEPTH:INTEGER:=8;ADDR:INTEGER:=3);12/20/2023PORT(DATA:INSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0);

Q:OUTSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0);

ACLR:INSTD_LOGIC;圖5-118×8FIFO模塊

CLOCK:INSTD_LOGIC;

WE:INSTD_LOGIC;

RE:INSTD_LOGIC;FF:OUTSTD_LOGIC;FF:OUTSTD_LOGIC);ENDREG_FIFO;12/20/2023TYPEMEMISARRAY(0TODEPTH-1)OFSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0);SIGNALRAMTMP:MEM;SIGNALWADD:STD_LOGIC_VECTOR(ADDR-1DOWNTO0);SIGNALRADD:STD_LOGIC_VECTOR(ADDR-1DOWNTO0);SIGNALWORDS:STD_LOGIC_VECTOR(ADDR-1DOWNTO0);ARCHITECTUREARTOFREG_FIFOIS12/20/2023BEGIN--寫指針修改進程WRITE_POINTER:PROCESS(ACLR,CLOCK)BEGINIF(ACLR=‘0’)THENWADD<=(OTHERS=>‘0’);

ELSIF(CLOCK'EVENTANDCLOCK=‘1’)THENIF(WE=‘1’)THENIF(WADD=WORDS)THENWADD<=(OTHERS=>‘0’);ELSEWADD<=WADD+‘1’;

ENDIF;

ENDIF;12/20/2023

ENDIF;ENDPROCESS;--寫操作進程WRITE_RAM:PROCESS(CLOCK)BEGINIF(CLOCK'EVENTANDCLOCK=‘1’)THEN

IF(WE=‘1’)THENRAMTMP(CONV_INTEGER(WADD))<=DATA;

ENDIF;

ENDIF;ENDPROCESS;12/20/2023--讀指針修改READ_POINIER:PROCESS(ACLR,CLOCK)BEGINIF(ACLR=‘0’)THENRADD<=(OTHERS=>‘0’);

ELSIF(CLOCK'EVENTANDCLOCK=‘1’)THENIF(RE=‘1’)THENIF(RADD=WORDS)THENRADD<=(OTHERS=>‘0’);

ELSERADD<=RADD+‘1’;

ENDIF;

12/20/2023ENDIF;

ENDIF;ENDPROCESS;--讀操作進程READ_RAM

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論