信息與通信實訓(xùn)十七 基本單元電路的VHDL設(shè)計_第1頁
信息與通信實訓(xùn)十七 基本單元電路的VHDL設(shè)計_第2頁
信息與通信實訓(xùn)十七 基本單元電路的VHDL設(shè)計_第3頁
信息與通信實訓(xùn)十七 基本單元電路的VHDL設(shè)計_第4頁
信息與通信實訓(xùn)十七 基本單元電路的VHDL設(shè)計_第5頁
已閱讀5頁,還剩45頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

實訓(xùn)十七基本單元電路的VHDL設(shè)計

本章提要:本章介紹了數(shù)字系統(tǒng)設(shè)計中經(jīng)常用到的計數(shù)器,分頻器,選擇器,譯碼器,編碼器,寄存器,

存儲器,輸入電路,顯示電路等基本單元電路的VHDL程序設(shè)計。

學(xué)習(xí)要求:在教師講授這些基本單元電路的設(shè)計思想的基礎(chǔ)上,通過上機(jī)調(diào)試熟練掌握這些基本單元電路

的設(shè)計。

關(guān)鍵詞:計數(shù)器(Counter),分頻器(Divder),選擇器(Multiplexer),譯碼器(Decoder),編碼器

(Encoder),寄存器(Register),存儲器(Memory),輸入電路(InputCircuit),顯示電路(Display

Circuit)

6.1計數(shù)器的設(shè)計

6.1.1同步計數(shù)器的設(shè)計

6.1.2異步計數(shù)器的設(shè)計

6.2分頻器的設(shè)計

6.3選擇器的設(shè)計

6.4譯碼器的設(shè)計

6.5編碼器的設(shè)計

6.5.1一般編碼器的設(shè)計

6.5.2優(yōu)先級編碼器的設(shè)計

6.6寄存器的設(shè)計

6.6.1數(shù)碼寄存器的設(shè)計

6.6.2移位寄存器的設(shè)計

6.6.3并行加載移位寄存器的設(shè)計

6.7存儲器的設(shè)計

6.7.1只讀存儲器ROM的設(shè)計

6.7.2讀寫存儲器SRAM的設(shè)計

6.8輸入電路的設(shè)計

6.8.1鍵盤掃描電路的設(shè)計

6.8.2鍵盤接口電路的設(shè)計

6.9顯示電路的設(shè)計

6.9.1數(shù)碼管靜態(tài)顯示電路的設(shè)計

6.9.2數(shù)碼管動態(tài)顯示電路的設(shè)計

6.9.2液晶顯示控制電路的設(shè)計

6.1計數(shù)器的設(shè)計

計數(shù)器是在數(shù)字系統(tǒng)中使用最多的時序電路,它不僅能用于對時鐘脈沖計數(shù),還可以用于分頻,定時,產(chǎn)

生節(jié)拍脈沖和脈沖序列以及進(jìn)行數(shù)字運(yùn)算等。計數(shù)器是一個典型的時序電路,分析計數(shù)器就能更好地了解

時序電路的特性。計數(shù)器分同步計數(shù)器和異步計數(shù)器兩種。

6.1.1同步計數(shù)器的設(shè)計

所謂同步計數(shù)器,就是在時鐘脈沖(計數(shù)脈沖)的控制下,構(gòu)成計數(shù)器的各觸發(fā)器狀態(tài)同時發(fā)生變化的那

一類計數(shù)器。

1)六十進(jìn)制計數(shù)器

眾所周知,用一個4位二進(jìn)制計數(shù)器可構(gòu)成1位十進(jìn)制計數(shù)器,而2位十進(jìn)制計數(shù)器連接起來可以構(gòu)成一

個六十進(jìn)制的計數(shù)器。六十進(jìn)制計數(shù)器常用于時鐘計數(shù)。一個六十進(jìn)制計數(shù)器的外部端口示意圖如圖6.1

所示。在該六十進(jìn)制計數(shù)器的電路中,BCDLWR和BCD10WR與DATAIN配合,以實現(xiàn)對六十進(jìn)制計數(shù)器的個

位和十位值的預(yù)置操作。應(yīng)注意,在對個位和十位進(jìn)行預(yù)置操作時,DATAIN輸入端是公用的,因而個位和

十位的預(yù)置操作必定要串行進(jìn)行。利用VHDL語言描述六十進(jìn)制計數(shù)器的程序如例6.1所示。

圖6.1六十進(jìn)制計數(shù)器外部端口示意圖

【例6.1]用VHDL設(shè)計一個六十進(jìn)制計數(shù)器(方法1)。

—BCD60C0UNT.VHD

LIBRARYIEEE;

USEIEEE.STD_L0GIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYBCD60C0UNTIS

PORT(CLK,BCD1WR,BCD10WR,CIN:STD_LOGIC;

CO:OUTSTD_LOGIC;

DATAIN:INSTD_LOGIC_VECTOR(3DOWNTO0);

BCD1:OUTSTD_LOGIC_VECTOR(3DOWNTO0);

BCDIO:OUTSTD_LOGIC_VECTOR(2DOWNTO0));

ENDBCD60C0UNT;

ARCHITECTURERTLOFBCD60C0UNTIS

SIGNALBCD1N:STD_LOGIC_VECTOR(3DOWNTO0);

SIGNALBCD10N:STD_LOGIC_VECTOR(2DOWNTO0);

BEGIN

BCD1<=BCD1N;

BCDI0<=BCD10N;

PROCESS(CLK,BCD1WR)--個位數(shù)處理進(jìn)程

BEGIN

IF(BCD1WR=T')THEN

BCD1N<=DATAIN;

ELSIF(CLK,EVENTANDCLK='1')THEN

IF(CIN=f)THEN

IF(BCD1N=9)THEN

BCD1NU0000";

ELSE

BCD1N<=BCD1N+1;

ENDIF;

ENDIF;

ENDIF;

ENDPROCESS:

PROCESS(CLK,BCD1OWR)--十位數(shù)處理進(jìn)程

BEGIN

IF(BCD1OWR='1')THEN

BCD1ON<=DATAIN(2DOWNTO0);

ELSIF(CLK'EVENTANDCLK=T')THEN

IF(CIN=fANDBCD1N=9)THEN

IF(BCD10N=5)THEN

BCD1ON<=Z/OOO";

ELSE

BCD1ON<=BCD1ON+1;

ENDIF;

ENDIF;

ENDIF;

ENDPROCESS:

PROCESS(BCD1ON,BCD1N,CIN)--進(jìn)位位處理進(jìn)程

BEGIN

IF(CIN=TANDBCD1N=9ANDBCD10N=5)THEN

CO<=r;

ELSE

CO<=O';

ENDIF;

ENDPROCESS:

ENDRTL;

【例6.2】用VHDL設(shè)計一個六十進(jìn)制計數(shù)器(方法2)。

—C0UNTER60.vhd

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_ARITH.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYC0UNTER60IS

PORT(CP:INSTD_LOGIC;一時鐘脈沖

BIN:OUTSTD_LOGIC_VECTOR(5DOWNTO0);一二進(jìn)制

S:INSTD_LOGIC;一輸出啟動信號

CLR:INSTD_LOGIC;一清除信號

EC:INSTD_LOGIC:一使能計數(shù)信號

CY60:OUTSTD_LOGIC);一計數(shù)60進(jìn)位信號

ENDC0UNTER60;

ARCHITECTURERTLOFC0UNTER60IS

SIGNALQ:STD_LOGIC_VECTOR(5DOWNTO0);

SIGNALRST,DLY:STD_LOGIC;

BEGIN

PROCESS(CP,RST)—計數(shù)60

BEGIN

IFRST=T'THEN

Q<="000000”;一復(fù)位計數(shù)器

ELSIFCP*EVENTANDCP二T'THEN

DLY<=Q(5);

IFEC=T'THEN

Q<=Q+l;~計數(shù)值加1

ENDIF;

ENDIF;

ENDPROCESS;

CY60<=NOTQ(5)ANDDLY;—進(jìn)位信號微分

RST〈二T'WHENQ=60ORCLR=T'ELSE—復(fù)位信號設(shè)定

'O';

BIN<=QWHENS='1'ELSE"計數(shù)輸出

“000000〃;

ENDRTL;

2)可逆計數(shù)器

在時序應(yīng)用電路中,計數(shù)器的應(yīng)用十分普遍,如加法計數(shù)器,減法計數(shù)器,可逆計數(shù)器等。所謂可逆計數(shù)

器,就是根據(jù)計數(shù)控制信號的不同,在時鐘脈沖作用下,計數(shù)器可以進(jìn)行加1或者減1操作的一種計數(shù)器。

可逆計數(shù)器有一個特殊的控制端,這就是UPDN端。當(dāng)UPDN='1'時,計數(shù)器進(jìn)行加1操作,當(dāng)UPDN='0'

時,計數(shù)器就進(jìn)行減1操作。表6.1是一個3位可逆計數(shù)器的真值表,它的VHDL語言描述如例6.3所示。

表6.1可逆計數(shù)器真值表

輸入端輸出端

DIRCPQ2QIQ0

XX000

1計數(shù)器加1操作

0計數(shù)器減1操作

【例6.3]用VHDL設(shè)計一個3位二進(jìn)制的可逆計數(shù)器。

—C0UNT3.vhd

LIBRARYIEEE;

USEIEEE.STDLOGIC1164.ALL;

USEIEEE.STD_LOGIC_ARITH.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYC0UNT3IS

PORT(CP,DIR:INSTD_LOGIC;

Q:OUTSTD_L0GIC_VECT0R(2DOWNTO0));

END;

ARCHITECTURERTLOFCOUNT3IS

SIGNALQN:STD_L0GIC_VECT0R(2DOWNTO0);

BEGIN

PROCESS(CP)

BEGIN

IFCP'EVENTANDCP:'TTHEN

IFDIR='O'THEN

QN<=QN+1;

ELSE

QN<=QN-1;

ENDIF;

ENDIF;

ENDPROCESS;

Q<=QN;

ENDRTL;

編寫可逆計數(shù)器VHDL程序時,在語法上,就是把加法和減法計數(shù)器合并,使用一個控制信號決定計數(shù)器作

加法或減法的動作。在本例中,利用“控制信號DIR”可以讓計數(shù)器的計數(shù)動作加1或減1。

6.1.2異步計數(shù)器的設(shè)計

異步計數(shù)器又稱行波計數(shù)器,它將低/高位計數(shù)器的輸出做為高/低位計數(shù)器的時鐘信號,這一級一級串行

連接起來就構(gòu)成了一個異步計數(shù)器。異步計數(shù)器與同步計數(shù)器不同之處就在于時鐘脈沖的提供方式,但是,

由于異步計數(shù)器采用行波計數(shù),從而使計數(shù)延遲增加,在要求延遲小的領(lǐng)域受到了很大限制。盡管如此,

由于它的電路簡單,仍有廣泛的應(yīng)用。

圖6.2是用VHDL語言描述的一個由8個觸發(fā)器構(gòu)成的異步計數(shù)器.它的程序如例6.4所示,采用元件例化

方式生成。與上述同步計數(shù)器不同之處主要表現(xiàn)在對各級時鐘脈沖的描述上,這一點請讀者在閱讀程序時

多加注意。

圖6.28位異步計數(shù)器原理圖

【例6.4]用VHDL設(shè)計一個由8個觸發(fā)器構(gòu)成的8位二進(jìn)制異步計數(shù)器。

-RPLCONT.VHD

LIBRARYIEEE;

USEIEEE.STD_L0GIC_1164.ALL;

ENTITYDFFRIS

PORT(CLK,CLR,D:INSTD_LOGIC;

Q,QB:OUTSTD_LOGIC);

ENDENTITYDFFR;

ARCHITECTUREART1OFDFFRIS

SIGNALQ_IN:STD_LOGIC;

BEGIN

QB<=NOTQ_IN;

Q<=Q_IN;

PROCESS(CLK,CLR)IS

BEGIN

IF(CLR='1')THEN

Q_IN<=,0*;

ELSIF(CLK,EVENTANDCLK二T')THEN

Q_IN<=D;

ENDIF;

ENDPROCESS;

ENDARCHITECTUREART1;

LIBRARYIEEE;

USEIEEE.STD_L0GIC_1164.ALL;

ENTITYRPLCONTIS

PORT(CLK,CLR:INSTD_LOGIC;

COUNT:OUTSTD_LOGIC_VECTOR(7DOWNTO0));

ENDENTITYRPLCONT;

ARCHITECTUREART2OFRPLCONTIS

SIGNALCOUNT_IN_BAR:STD_LOGIC_VECTOR(8DOWNTO0);

COMPONENTDFFRIS

PORT(CLK,CLR,D:INSTD_LOGIC;

Q,QB:OUTSTD_LOGIC);

ENDCOMPONENT;

BEGIN

COUNT_IN_BAR(O)<=CLK;

GEN1:FORIIN0TO7GENERATE

U:DFFRPORTMAP(CLK=>COUNT_IN_BAR(I),CLR=>CLR,

D二)COUNT」N_BAR(1+1),Q=>COUNT(I),QB=>COUNT_IN_BAR(1+1));

ENDGENERATE;

ENDARCHITECTUREART2;

6.2分頻器的設(shè)計

一般來說,可以把加法計數(shù)器看成一種分頻電路,而且是除2的N的次方的分頻電路。

但是也常常會有除M(M不是2的N次方)的分頻電路需求.

下面就介紹一個除6的加法分頻電路。先建立一個計數(shù)器,而這個計數(shù)器的大小必須是3位(計數(shù)默認(rèn)范圍

是0?2R-1:7),不過將把這樣的計數(shù)值為6的瞬間,立即復(fù)位改變?yōu)?,其丫皿1程序如例6.5所示

【例6.5】用VHDL設(shè)計一個除6的加法分頻電路。

—C0UNT6.vhd

LIBRARYIEEE;

USEIEEE.STD_L0GIC_1164.ALL;

USEIEEE.STD_LOGIC_ARITILALL;

USEIEEE.STDLOGICUNSIGNED.ALL;

ENTITYC0UNT6is

PORT(CP:INSTD_LOGIC;

Result:OUTSTD_LOGIC);

ENDC0UNT6;

ARCHITECTUREaOFC0UNT6IS

SIGNALRST:STD_LOGIC;

SIGNALQN:STD_LOGIC_VECTOR(2DOWNTO0);

BEGIN

PROCESS(CP,RST)—***COUNTER

BEGIN

IFRST='1'THEN

QN<="000〃;一ResetCounter

ELSIFCP*eventANDCP='1'THEN

QN<=QN+1;—COUNTER+1

ENDIF;

ENDPROCESS;

RST<=T'WHENQN=6ELSE—RESETCOUNTER

'O';

Result<=QN(2);-ResultOutput

ENDa;

以后遇到需要分頻是N的同步計數(shù)器,需將上述QN=6改成QN=N,而且計數(shù)器Xbits數(shù)需調(diào)整為符合條件

2X〉二N才可以。

6.3選擇器的設(shè)計

多路選擇器可以從多組數(shù)據(jù)來源中選取一組送入目的地。它的應(yīng)用范圍相當(dāng)廣泛,從組合邏輯的執(zhí)行,到

數(shù)據(jù)路徑的選擇,經(jīng)常可以看到它的蹤影。另外在像時鐘,計數(shù)定時器等的輸出顯示電路中都可以看到利

用多路選擇器制作掃描電路來分別驅(qū)動輸出裝置(通常為七段數(shù)碼顯示管,點矩陣或液晶面板),以降低功率

的消耗。有時也希望把兩組沒有必要同時觀察的數(shù)據(jù),共享一組顯示電路,以降低成本。

多路選擇器的結(jié)構(gòu)是2N個輸入線,會有N個地址選擇線及一個輸出線配合?,F(xiàn)以一個四選一的多路選擇器

為例,其四選一電路的真值表如表6.2所示,其外部端口示意圖如圖6.3所示。

表6.2四選一電路真值表

選擇輸入數(shù)據(jù)輸入數(shù)據(jù)輸出

baInput(0)Input(1)Input(2)Input(3)y

000XXX0

001XXX1

01X0XX0

01X1XX1

10XX0X0

10XX1X1

11XXX00

11XXX11

圖6.3四選一電路外部端口示意圖

描述四選一多路選擇器的方法有多種,例如在一個進(jìn)程中使用if-then-else語句;在一個進(jìn)程中使用case

語句;使用wilhselect構(gòu)造或使用結(jié)構(gòu)VHDL?,F(xiàn)用ifThen-else語句對它進(jìn)行描述,就可以得到如例

6.6所示的程序。

【例6.6】設(shè)計一個四選一的多路選擇器的VHDL程序(使用if-lhen-else語句)。

—MUX4.VHD

LIBRARYIEEE;

USEIEEE.STD_L0GIC_1164.ALL;

ENTITYMUX4IS

PORT(DATAO,DATA1,DATA2,DATA3:INSTD_LOGIC_VECTOR(3DOWNTO0);

A,B:INSTD_LOGIC;

Y:OUTSTD_L0GIC_VECT0R(3DOWNTO0));

ENDENTITYMUX4;

ARCHITECTUREARTOFMUX4IS

SIGNALSEL:STD_LOGIC_VECTOR(1DOWNTO0);

BEGIN

SELCB&A;

PROCESS(SEL)

BEGIN

IF(SEL=〃OO〃)THEN

Y<=DATAO;

ELSIF6EL="01")THEN

Y<=DATA1;

ELSIF(SEL="10")THEN

Y<=DATA2;

ELSE

Y<=DATA3;

ENDIF;

ENDPROCESS;

ARCHITECTUREART;

例6.6中的四選一選擇器是用IF語句描述的,程序中的ELSE項作為余下的條件,將選擇INPUT(3)從Y

端輸出,這種描述比較安全。當(dāng)然,不用ELSE項也可以,這時必須列出SEL的所有可能出現(xiàn)的情況,加以

一一確認(rèn)。在進(jìn)程中使用CASE語句會更清晰易讀。例6.7是用CASE語句描述的四選一選擇器。

【例6.7】設(shè)計一個四選一的多路選擇器的VHDL程序(使用case語句)。

—MUX4.VHD

LIBRARYIEEE;

USEIEEE.STD_LOGIC」164.ALL;

ENTITYMUX4IS

PORT(DATAO,DATA1,DATA2,DATA3:INSTD_LOGIC_VECTOR(3DOWNTO0);

A,B:INSTD_LOGIC;

Y:OUTSTD_L0GIC_VECT0R(3DOWNTO0));

ENDENTITYMUX4;

ARCHITECTUREARTOFMUX4IS

SIGNALSEL:STD_LOGIC_VECTOR(1DOWNTO0);

BEGIN

SELCB&A;

PROCESS(SEL)

BEGIN

CASESELIS

WHEN〃00"=>Y〈=DATA0;

WHEN,,0r=>Y<=DATAl;

WHEN,,10,=>Y<=DATA2;

WHEN,/ir=>Y<=DATA3;

WHENOTHERS=>Y<=NULL;

ENDCASE;

ENDPROCESS;

ENDARCHITECTUREART;

【例6.8】設(shè)計一個四選一的多路選擇器的VHDL程序(使用WHEN-ELSE并行條件賦值語句)。

—MUX4.VHD

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYMUX4IS

PORT(DATAO,DATA1,DATA2,DATA3:INSTD_LOGIC_VECTOR(3DOWNTO0);

A,B:INSTD_LOGIC;

Y:OUTSTD_L0GIC_VECT0R(3DOWNTO0));

ENDENTITYMUX4;

ARCHITECTUREARTOFMUX4IS

SIGNALSEL:STDLOGICVECTOR(1DOWNTO0);

BEGIN

SELCB&A;

Y<=DATAOWHENSEL=〃00〃ELSE

DATA1WHENSEL=〃01〃ELSE

DATA2WHENSEL="10"ELSE

DATA3WHENSEL=ELSE

'O';

ENDARCHITECTUREART;

6.4譯碼器的設(shè)計

譯碼器是把輸入的數(shù)碼解出其對應(yīng)的數(shù)碼,如果有N個二進(jìn)制選擇線,則最多可以譯碼轉(zhuǎn)換成2N個數(shù)據(jù)。

譯碼器也經(jīng)常被應(yīng)用在地址總線或用作電路的控制線。像只讀存儲器(ROM)中便利用譯碼器來進(jìn)行地址選

址的工作。

3-8譯碼器是最常用的種小規(guī)模集成電路。3-8譯碼器外部端口示意圖如圖6.9所示,它有3個二進(jìn)制輸入

端a,b,c和8個譯碼輸出端yO~y7。對輸入a,b,c的值進(jìn)行譯碼,就可以確定輸出端yO~y7的哪一個輸出

端變?yōu)橛行Вǖ碗娖剑?,從而達(dá)到譯碼的目的。另外為方便譯碼器的控制或便于將來擴(kuò)充用,在設(shè)計時常

常會增加一個EN使能輸入腳。3-8譯碼器的真值表如表6.3所示。有了真值表,就可以直接用查表法來設(shè)

計。

在VHDL中,“WITH…SELECT,“CASE…WHEN”及“WHEN…ELSE”這類指令都是執(zhí)行查表或?qū)?yīng)動作的

能手。

圖6.43-8譯碼器外部端口示意圖

表6.33-8譯碼器的真值表

使能二進(jìn)制輸入端譯碼輸出端

encbayOyly2y3y4y5y6y7

0xxx1111111

100001111111

100110111111

101011011111

101111101111

10011110111

110111111011

111011111101

11111111110

【例6.9]用VHDL設(shè)計一個3-8譯碼器(用“CASE…'”語句)。

—DEC0DER38.VHD

LIBRARYIEEE;

USEIEEE.STD_L0GIC_1164.ALL;

ENTITYDEC0DER38IS

PORT(A,B,C,EN:INSTD_LOGIC;

Y:OUTSTDLOGICVECTOR(7DOWNTO0));

ENDDEC0DER38;

ARCHITECTURERTLOFDECODER38IS

SIGNALINDATA:STD_L0GIC_VECT0R(2DOWNTO0);

BEGIN

INDATA〈=C&B&A;

PROCESS(INDATA,EN)

BEGIN

IF(EN=T)THEN

CASEINDATAIS

WHEN"000〃

WHEN"001〃

WHEN"010〃=>Y<=〃11111011”;

WHEN〃011〃=>Y<="111101ir;

WHEN"100〃=>Y<=/z111011irz;

WHEN"101〃=>Y<=〃11011111”;

WHEN〃110"=>Y<=z,101111ir;

WHEN〃111〃

WHENOTHERS=>Y<=NULL;

ENDCASE;

ELSE

¥<=/zllllllir;

ENDIF;

ENDPROCESS;

ENDRTL;

【例6.10]用VHDL設(shè)計一個3-8譯碼器(用“WITH…SELECT”語句)。

LIBRARYIEEE;

USEIEEE.STD_LOGIC」164.All;

ENTITYDECODER38IS

PORT(A,B,C,EN:INSTD_LOGIC;

Y:OUTSTD_L0GIC_VECT0R(7DOWNTO0));

ENDDEC0DER38;

ARCHITECTURERTLOFDEC0DER38IS

SIGNALINDATA:STD_L0GIC_VECT0R(3DOWNTO0);

BEGIN

INDATA<=EN&C&B&A;一將EN,A,B,C合并成序列的一種寫法

WITHINDATASELECT

¥<="11111110"WHEN〃1000〃,

"minorWHEN"1001”,

"liiiioirWHEN"1010”,

"llllOlll"WHEN"1011”,

T1101111"WHEN"1100”,

"11011111"WHEN"1101”,

"10111111"WHEN"1110”,

01111111〃WHEN

“11111111〃WHENOTHERS;

ENDRTL;

在本節(jié)中用到的兩種描述語句,“WITH…SELECT'是并行同時性語句,“CASE…WHEN”是與其功能相同的

順序性語句,讀者在使用時一定要確定需要的是順序性語句還是并行性語句,否則程序在編譯時會發(fā)生錯

誤。

6.5編碼器的設(shè)計

編碼器是將2飛個分離的信息代碼以N個二進(jìn)制碼來表示。它的功能和譯碼器正好相反。編碼器常常運(yùn)用

于影音壓縮或通信方面,以達(dá)到精簡傳輸量的目的。可以將編碼器看成壓縮電路,譯碼起看成解壓縮電路。

傳送數(shù)據(jù)前先用編碼器壓縮數(shù)據(jù)后在傳送出去,在接收端則由譯碼器將數(shù)據(jù)解壓縮,還原其原來的數(shù)據(jù)。

這樣,在傳送過程中,就可以以N個數(shù)碼來代替2飛個數(shù)碼的數(shù)據(jù)量,來提升傳輸效率。

6.5.1一般編碼器的設(shè)計

如果沒有特別說明,各編碼輸入端無優(yōu)先

區(qū)別。圖6.5是8-3編碼器的外部端口圖,

有了外部端口圖,就能夠做ENTITY的定義,

再根據(jù)編碼器的真值表如表6.4所示.,再使用

查表法就可以輕松描述結(jié)構(gòu)體了。

圖6.58-3編碼器外部端口圖

表6.48-3編碼器的真值表

輸入二進(jìn)制編碼輸出

A7A6A5A4A3A2AlAOY2Y1Y0

11111110111

1111110110

11111011101

11110111100

11101111011

1101111100

10111111001

0111111000

【例6.11】用VHDL設(shè)計一個8-3編碼器。

—CH_8_3.VHD

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYCH_8_3IS

PORT(A:INSTD_L0GIC_VECT0R(7DOWNTO0);

Y:OUTSTD_L0GIC_VECT0R(2DOWNTO0));

ENDCH_8_3;

ARCHITECTURERTLOFCH_8_3IS

BEGIN

WITHASELECT

Y〈二”000〃WHEN”11111110”,

“001〃WHEN"minor,

”010〃WHEN"iimoir,

“011〃WHEN“11110111”,

〃100〃WHEN"11101111",

,ziorWHEN"iioimr;

“110〃WHEN"loiimr,

WHEN"omiiir,

〃000”WHENOTHERS;

ENDRTL;

6.5.2優(yōu)先級編碼器的設(shè)計

優(yōu)先級編碼器長用于中斷的優(yōu)先級控制,例如,74LS148是一個8輸入,3位二進(jìn)制碼輸出的優(yōu)先級編碼器。

當(dāng)其某一個輸入有效時,就可以輸出一個對應(yīng)的3位二進(jìn)制編碼。另外,當(dāng)同時有幾個輸入有效時,將輸

優(yōu)先級最高的那個輸入所對應(yīng)的二進(jìn)制編碼。

該優(yōu)先級編碼器的真值表如表6.5所示。表中的“X”項表示任意項,它可以是“0”,也可以是“1”。

INPUT(0)的優(yōu)先級最高,INPUT(7)的優(yōu)先級最低。

表6.5優(yōu)先級編碼器真值表

輸入二進(jìn)制編碼輸出

Input(7)Input(6)Input(5)Input(4)Input(3)Input(2)Input(1)Input(0)Y2Y1Y0

XXXXXXX0111

XXXXXX01110

XXXXX011101

XXXX0111100

XXX01111011

01111100

X0111111001

X111111000

【例6.12]用VHDL設(shè)計一個8-3優(yōu)先級編碼器。

—CH8_3.VHD

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYCH8_3IS

PORT(INPUT:INSTD_L0GIC_VECT0R(7DOWNTO0);

Y:OUTSTD_L0GIC_VECT0R(2DOWNTO0));

ENDCH8_3;

ARCHITECTURERTLOFCH8.3IS

BEGIN

PROCESS(INPUT)

BEGIN

IF(INPUT(0)='O')THEN

Y<=,znr;

ELSIF(INPUT(1)='O'THEN

Y<=〃110”;

ELSIF(INPUT(2)=0*THEN

YU101〃;

ELSIF(INPUT(3)='O'THEN

YU'IOO";

ELSIF(INPUT(4)='O'THEN

Y<=/Zoir;

ELSIF(INPUT(5)=,0,THEN

Y<=〃010〃;

ELSIF(INPUT(6)=0,THEN

y<=z/oor;

ELSIF

YU'OOO";

ENDIF;

ENDPROCESS;

ENDRTL;

6.6寄存器的設(shè)計

寄存(鎖存)器是一種重要的數(shù)字電路部件,常用來暫時存放指令、參與運(yùn)算的數(shù)據(jù)或運(yùn)算結(jié)果等。它是數(shù)

字測量和數(shù)字控制中常用的部件,是計算機(jī)的主要部件之一。寄存器的主要組成部分是具有記憶功能的雙

穩(wěn)態(tài)觸發(fā)器。一個觸發(fā)器可以儲存一位二進(jìn)制代碼,要儲存N位二進(jìn)制代碼,就在有N個觸發(fā)器。寄存器

從功能上說,通??煞譃閿?shù)碼寄存器和移位寄存器兩種。

6.6.1數(shù)碼寄存器的設(shè)計

數(shù)碼寄存器用于寄存一組二進(jìn)制代碼,廣泛用于各類數(shù)字系統(tǒng)。下面給出一個8位寄存器的VHDL描述。

【例6.13】用VHDL設(shè)計一個8位的數(shù)碼寄存器。

—REG.VHD

LIBRARYIEEE;

USEIEEE.STD_L0GIC_1164.ALL;

ENTITYREGIS

PORT(D:INSTD_LOGIC_VECTOR(7TO0);

CLK:INSTD_LOGIC;

Q:OUTSTD_L0GIC_VECT0R(7TO0));

ENDENTITYREG;

ARCHITECTUREARTOFREGIS

BEGIN

PROCESS(CLK)IS

BEGIN

IF(CLK*EVENTANDCLK=T')THEN

Q<=D;

ENDIF;

ENDPROCESS;

ENDARCHITECTUREART;

6.6.2移位寄存器的設(shè)計

移位寄存器除了具有存儲代碼的功能以外,還具有移位功能。所謂移位功能,是指寄存器里存儲的代碼能

在移位脈沖的作用下依次左移或右移。因此,移位寄存器不但可以用來寄存代碼,還可用來實現(xiàn)數(shù)據(jù)的串

并轉(zhuǎn)換、數(shù)值的運(yùn)算以及數(shù)據(jù)處理等。下面給出一個8位的移位寄存器,其具有左移一位或右移一位、并

行輸入和同步復(fù)位的功能。

【例6.14】用VHDL設(shè)計一個8位的移位寄存器,其具有左移一位或右移一位、并行輸入和同步復(fù)位的功

能.

—SHIFT_REG.VHD

LIBRARYIEEE;

USEIEEE.STD_L0GIC_1164.ALL;

ENTITYSHIFT_REGIS

PORT(DATA:INSTD_LOGIC_VECTOR(7DOWNTO0);

CLK:INSTD_LOGIC;

SHIFT_LEFT,SHIFT_RIGHT:INSTD_LOGIC;

RESET:INSTD_LOGIC;

MODE:INSTD_LOGIC_VECTOR(1DOWNTO0);

QOUT:BUFFERSTD_L0GIC_VECT0R(7DOWNTO0));

ENDENTITYSHIFT_REG;

ARCHITECTUREARTOFSHIFT_REGIS

BEGIN

PROCESSIS

BEGIN

WAITUNTIL(RISING_EDGE(CLK));

IF(RESET='1')THEN

Q0UT<="00000000\

ELSE一同步復(fù)位功能的實現(xiàn)

CASEMODEIS

WHEN//O1Z'=>QOUT<=SHIFT_RIGHT&QOIIT(7DOWTO1);一右移一位

WHEN"10"=〉Q0UT〈=Q0UT(6DOWNTOO)&SHIFT_LEFT;一左移一位

WHEN<,ir=>QOUT<=DATA;一并行輸入

WHENOTHERS=>NULL;

ENDCASE;

ENDIF;

ENDPROCESS;

ENDARCHITECTUREART;

6.6.3并行加載移位寄存器的設(shè)計

在TTL手冊中的74LS166是一個帶清零端的8位并行加載的移位寄存器,其引腳圖及邏輯圖如圖6.6所示。

圖6.674LS166的引腳圖及邏輯圖

圖中各引腳名稱和功能如下:

A,B,C,D,E,F,G,II:8位并行數(shù)據(jù)輸入端;

SER:串行數(shù)據(jù)輸入端;

QH:串行數(shù)據(jù)輸出端;

CLK:時鐘信號輸入端;

CLKINH:時鐘信號禁止(FE)端:

SH/LD:移位加載控制(SL)端;

CLR:清零端。

當(dāng)清零輸入端CLR為‘0'時,8個觸發(fā)器的輸出均為'0',從而使輸出Q為‘0'。CLKINH是時鐘禁止端,

當(dāng)它為‘1'時將禁止時鐘,即不管時鐘信號如何變化,移位寄存器的狀態(tài)不發(fā)生改變。另外,時鐘信號只

在上升沿時才有效,且CLKINH為‘0'。當(dāng)控制端SH/LD='1'時是移位狀態(tài),在時鐘脈沖上升沿的控制

下右移,當(dāng)SH/LD='0'時是加載狀態(tài),在時鐘脈沖上升沿的作用下,數(shù)據(jù)輸入端A?H的信號就是裝載

到移位寄存器的QA?QH。根據(jù)上述描述,就可以用VHDL語言編寫出描述74166功能的程序。

【例6.15】用VHDL設(shè)計的帶清零端的8位并行加載的移位寄存器74LS166.

一SREG8PARLWCLR.VHD

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYSREG8PARLWCLRIS

PORT(CLR,SL,FE,CLK,SER:INSTD_LOGIC;

A,B,C,D,E,F,G,H:INSTD_LOGIC;

Q:OUTSTD_LOGIC);

ENDSREG8PARLWCLR;

ARCHITECTUREBEHAVOFSREG8PARLWCLRIS

SIGNALTMPREG8:STD_LOGIC_VECTOR(7DOWNTO0);

BEGIN

PROCESS(CLK,SL,FE,CLR)

IF(CLR='O')THEN

TMPREG8<="00000000”:

Q<=TMPREG8(7);

ELSIF(CLK'EVENT)AND(CLK='1')AND(FE='O')THEN

IF(SL='O')THEN

TMPREG8(0)<=A;

TMPREG8(1)<=B;

TMPREG8(2)<=C;

TMPREG8(3)<=D;

TMPREG8(4)<=E;

TMPREG8(5)<=F;

TMPREG8(6)<=G;

TMPREG8(7)<=H;

Q<=TMPREG8(7);

ELSIF(SL=)THEN

FORIINTMPREG8,HIGHDOWNTOTMPREG8'LOW+1LOOP

TMPREG8(I)<=TMPREG8(I-1);

ENDLOOP;

TMPREG8(TMPREG8'LOW)<=SE;

Q<=TMPREG8(7);

ENDIF;

ENDIF;

ENDPROCESS;

ENDBEHAV;

6.7存儲器的設(shè)計

半導(dǎo)體存儲器的種類很多,從功能上可以分為只讀存儲器(READONLYMEMORY,簡稱ROM)和隨機(jī)存儲器

(RANDOMACCESSMEMORY,簡稱RAM)兩大類。

6.7.1只讀存儲器ROM的設(shè)計

只讀存儲器在正常工作時從中讀取數(shù)據(jù),不能快速地修改或重新寫入數(shù),適用于存儲固定數(shù)據(jù)的場合。下

面是一個容量為256X4的ROM存儲的例子,該ROM有8位地址線ADR(0)-ADR(7),4位數(shù)據(jù)輸出線DOUT(0)?

D0UT(3)及使能EN,如圖6.7所示。

圖6.7ROM

【例6.16】用VHDL設(shè)計一個一個容量為256X4的ROM存儲的例子,該ROM有8位地址線ADR(O)-ADR(7),

4位數(shù)據(jù)輸出線DOUT(0)?DOUT(3)及使能EN。

—ROM.VHD

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL:

USEIEEE.STDJOGICJJNSIGNED.ALL;

USESTD.TEXTIO.ALL;

ENTITYROMIS

PORT(EN:INSTD_LOGIC;

ADR:INSTD_L0GIC_VECT0R(7DOWNTO0);

DOUT:OUTSTD_L0GIC_VECT0R(3DOTOTO0));

ENDENTITYROM;

ARCHITECTUREARTOFROMIS

SUBTYPEWORDISSTD_L0GICJ,ECT0R(3DOWNTO0);

TYPEMEMORYISARRAY(0TO255)OFWORD;

SIGNALADRIN:INTEGERRANGE0TO255:

VARIABLEROM:MEMORY;

VARIABLESTARTUP:BOOLEAN:=TRUE;

VARIABLEL:LINE;

VARIABLEJ:INTEGER;

FILEROMIN:TEXTISIN“ROMIN”:

BEGIN

PROCESS(EN,ADR)IS

BEGIN

IFSTART_UPTHEN-初始化開始

FORJINROM'RANGELOOP

READLINE(ROMIN,1);

READ(1,ROM(J));

ENDLOOP;

STARTUP::FALSE:一初始化結(jié)束

ENDIF;

ADR」N<=CONV」NTEGER(ADR);一將向量轉(zhuǎn)化成整數(shù)

IF(EN=T)THEN

DOUT<=ROM(ADR_IN);

ELSE

DOUT<="ZZZZ”;

ENDIF;

ENDPROCESS;

ENDARCHITECTUREART;

6.7.2讀寫存儲器SRAM的設(shè)計

RAM和ROM的主要區(qū)別在于RAM描述上有讀和寫兩種操作,而且在讀寫上對時間有較嚴(yán)格的要求。下面我

們給出一個8X8位的雙口SRAM的VHDL描述實例,如圖6.8所示。

圖6.8雙口SRAM

【例6.17]用VHDL設(shè)計一個8X8位的雙口SRAM。

—DPRAM.VHD

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_ARITH.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYDPRAMIS

GENERIC(WIDTH:INTEGER:=8;

DEPTH:INTEGER:=8;

ADDER:INTEGER:=3);

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

DATAOUT:OUTSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0);

CLOCK:INSTD_LOGIC;

WE,RE:INSTD_LOGIC;

WADD:INSTD_LOGIC_VECTOR(ADDER-1DOWNTO0);

RADD:INSTDLOGICVECTOR(ADDER-1DOWNTO0));

ENDENTITYDPRAM;

ARCHITECTUREARTOFDPRAMIS

TYPEMEMISARRAY(DEPTH-1TO0)OF

STD_LOGIC_VECTOR(WIDTH-1DOWNTO0);

SIGNALRAMTMP:MEM:

BEGIN

一寫進(jìn)程

PROCESS(CLOCK)IS

BEGIN

IF(CLOCK'EVENTANDCLOCK=T)THEN

IF(WE=DTHEN

RAMTMP(CONV_INTEGER(WADD))<=DATAIN;

ENDIF;

ENDIF;

ENDPROCESS;

一讀進(jìn)程

PROCESS(CLOCK)IS

BEGIN

IF(CLOCK'EVENTANDCLOCK?1')THEN

IF(RE="I')THEN

DATAOUT<=RAMTMP(CONV_INTEGER(RADD));

ENDIF;

ENDIF;

ENDPROCESS;

ENDARCHITECTUREART;

6.8輸入電路的設(shè)計

6.8.1鍵盤掃描電路的設(shè)計

計算機(jī)控制系統(tǒng)中,數(shù)據(jù)和控制信號的輸入主要使用鍵盤。下面給出一個鍵盤掃描電路VHDL描述。

【例6.18]用VHDL設(shè)計一個鍵盤掃描電路。

—KSCAN.VHD

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

USEIEEE.STD_LOGIC_ARITH.ALL:

ENTITYKSCANIS

PORT(CLK:INSTD_LOGIC;

KIN1,KIN2:INSTD_LOGIC;

LEDA,LEDB,LEDC:OUTSTD_LOGIC;

LEDD:OUTSTD_LOGIC_VECTOR(7DOWNTO0));

ENDKSCAN;

ARCHITECTUREHAVOFKSCANIS

SIGNALSEG:STD_LOGIC_VECTOR(7DOWNTO0);

SIGNALSEL:STD_L0GIC_VECT0R(2DOWNTO0);

SIGNALKNUM:STDLOGICVECTOR(3DOWNTO0):

SIGNALCOUNT:STD_L0GIC_VECT0R(4DOWNTO0);

SIGNALCOUNTO:STD_LOGIC;

BEGIN

LEDD<=SEG;

PROCESS(CLK)

BEGIN

IFCLK'EVENTANDCLK='1'THEN

COUNT<=COUNT+1;

ENDIF;

ENDPROCESS;

COUNTO<=COUNT(0):

PROCESS(COUNTO,COUNT,KIN1,KIN2)

BEGIN

IFCOUNT。'EVENTANDCOUNTO:PTHEN

IF(KIN2='O')ANDCOUNT(1)='O'THEN

KNUM<=T&COUNT(4DOWNTO2);

ELSIF(KIN1='O')ANDCOUNT(1)='O'THEN

KNUM<='O'&COUNT(4DOWNTO2);

ENDIF;

ENDIF;

ENDPROCESS;

SEL<=COUNT(4DOWNTO2):

PROCESS(KNUM)

BEGIN

CASEKNUMIS

WHEN“0000”=>SEG<="00111111”

WHEN“0001”=>SEG<="00000110”

WHEN“0010”=>SEG<="01011011”

WHEN“0011”=>SEG<="01001111”

WHEN“0100”=>SEG<="01100110”

WHEN“0101”=>SEG<="01101101”

WHEN“0110”=>SEG<="01111101”

WHEN“0111”=>SEG<="00000111”

WHEN“1000”=>SEG<="01111111”

WHEN“1001”=>SEG<="01101111”

WHEN“1010”=>SEG<="01110111”

WHEN“1011”=>SEG<="01111100"

WHEN“1100”=>SEG<="00111001”

WHEN=>SEG<="01011110”

WHEN“1110”=>SEG<="01111001”

WHEN“1111”=>SEG<="01110001”

WHENOTHERS=>SEG<="OOOOOOOO”;

ENDCASE;

ENDPROCESS;

LEDA〈二SEL(O);

LEDB<=SEL(1);

LEDC<=SEL(2);

ENDHAV;

6.8.2鍵盤接口電路的設(shè)計

PS/2鍵盤接口通常使用專用芯片實現(xiàn)。由于PS/2鍵盤或鼠標(biāo)串行輸出信號速度較高,普通單片機(jī)無法

接收,現(xiàn)利用VHDL在目標(biāo)器件FPGA/CPLD上實現(xiàn)一個鍵碼接收部分。PS/2接口的鍵盤每按下一個鍵,

該鍵的掃描碼即以十六進(jìn)制形式顯示在數(shù)碼管上。以下為接收PS/2鍵盤信號的VHDL邏輯描述。

【例6.20]用VI1DL設(shè)計一個接收PS/2鍵盤信號的接口電路。

—KB2PCL.VHD

LIBRARYIEEE;

USEIEEE.STD_LOG1C_1164.ALL;

ENTITYKB2PCLIS

PORT(SYSCLK:INSTD_LOGIC;RESET:INSTD_LOGIC;

KBCLK:INSTD_LOGIC;KBDATA:INSTD_LOGIC;

PDATA:OUTSTD_LOGIC_VECTOR(7DOWNTO0);

PARITY:OUTSTD_LOGIC;DTOE:BUFFERSTD_LOGIC);

ENDKB2PC1;

ARCHITECTUREONEOFKB2PC1IS

SIGNALCOSTATE:STD_LOGIC,VECTOR(1DOWNTO0);

SIGNALSPDATA:STD_LOGIC_VECTOR(8DOWNTO0);

SIGNALSTART,SWT002,RECVEN:STDLOGIC;

SIGNALCNT8:INTEGERRANGE0TO15;

BEGIN

SLRL:PROCESS(RESET,KBCLK,KBDATA,STAFF,COSTATE)

BEGIN

IFRESET='1'THEN

START<='O';

ELSIFKBCLK,EVENTANDKBCLK='O'THEN

IFCOSTATE="00"ANDKBDATA='O'THEN

STAFF<=T';

ENDIF;

ENDIF;

ENDPROCESS;

STR2:PROCESS(RESET,KBCLK,KBDATA,STAFF,COSTATE)

BEGIN

IFRESET=THEN

SWT002<='O';

ELSIFKBCLK'EVENTANDKBCLK=THEN

IFCOSTATE="00"ANDSTART='1'ANDKBDATA='O'THEN

SWT002O’1’;

ENDIF;

ENDIF;

ENDPROCESS;

CHSTATE:PROCESS(RESET,SYSCLK,COSTATE,SWTOO2)

BEGIN

IFRESET=T'THEN

COSTATE<=“00”;

ELSIFSYSCLK,EVENTANDSYSCLK:THEN

IFSWT002='1'THEN

COSTATE<="01”;

ELSIFCNT8=9THEN

COSTATE<=“10”;

ENDIF;

ENDIF;

ENDPROCESS;

RECV:PROCESS(RESET,KBCLK,KBDATA,COSTATE)

BEGIN

IFRESET='THEN

CNT8<=0:SPDATA<="000000000”;

ELSIFKBCLK,EVENTANDKBCLK='O'THEN

IFCOSTATE="01”THEN

IFCNT8/=9THEN

SPDATA(7DOWNTO0)<=SPDATA(8D0WT01);

SPDATA(8)<=KBDATA:

CNT8<=CNT8+1:

ENDIF;

ENDIF;

ENDIF;

ENDPROCESS;

RECVEND:PROCESS(RESET,KBCLK,RECVEN,COSTATE)

BEGIN

IFRESET二T'THEN

DTOE<='O';

ELSIFKBCLK,EVENTANDKBCLK='1'THEN

IFCNT8=9ANDCOSTATE="01”THEN

DTOE<=4";ENDIF;

ENDIF;

ENDPROCESS;

PARITY<=SPDATA(8);PDATA<=SPDATA(7DOWNTO0);

ENDONE;

6.9顯示電路的設(shè)計

常用的顯示器件有發(fā)光二極管,數(shù)碼管,液晶顯示器等,其中最常用的為數(shù)碼管。數(shù)碼管顯示數(shù)據(jù)的方式

有靜態(tài)顯示和動態(tài)顯示之分。所謂靜態(tài)顯示,就是將被顯示的數(shù)據(jù)的BCD碼,通過各自的4-7/8顯示譯碼

器譯碼后,分別接到顯示譯碼器的顯示驅(qū)動段a-g(p),而公共端COM則根據(jù)數(shù)碼管的類型(共陰/共陽)

分別接GND/VCC。動態(tài)顯示,就是將被顯示的數(shù)據(jù)的BCD碼,按照一定的變化頻率,在不同的時刻周期性

地分別送到一個數(shù)據(jù)總線上,再通過一個公共的4-7/8顯示譯碼器譯碼后,接到多個顯示譯碼器的公共顯

示驅(qū)動段a-g(p)上,同時,在不同的時刻周期性地選通對應(yīng)的數(shù)碼管的公共端COM。

6.9.1數(shù)碼管靜態(tài)顯示電路的設(shè)計

七段數(shù)碼顯示器由7根顯示碼管組成,對每一根碼管,用一位二進(jìn)制表示。若該數(shù)碼管的為共陰數(shù)碼管,

則該位為1時,表示此碼管發(fā)光,如為0,表示此碼管不發(fā)光,對7根碼管編號。共陽數(shù)碼管則正好相反。

下面用一個7位二進(jìn)制數(shù)表示一個七段顯示器的編碼,其VHDL程序段描述如下:

CASECNT4BIS

WHEN0=>DOUT<="0111111”;

WHEN1=>DOUT<="0000110”;

WHEN2=>DOUT<="1011011”;

WHEN3=>DOUT<="1001111”;

WHEN4=>DOUT<="1100110”;

WHEN5=>DOUT<="1101101”;

WHEN6=>DOUT<="1111101”;

WHEN7=>DOUT<="0000111”;

WHEN8=>DOUT<="1111111”;

WHEN9=>DOUT<="1101111”;

WHENOTHERS=>DOUT<="0000000”

ENDCASE;

下面給出一個4位二進(jìn)制加法計數(shù)器靜態(tài)顯示的VHDL程序。

【例6.21]用VIIDL設(shè)計一個4位二進(jìn)制加法計數(shù)器,并將計數(shù)結(jié)果用7段LED顯示數(shù)碼管進(jìn)行靜態(tài)顯示。

—CNTDISPLAY.VHD

LIBRARYIEEE;

USEIEEE.STDLOGIC1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYCNTDISPLAYIS

PORT(CLK:INSTD_LOGIC;

DOUT:OUTSTD_LOGIC_VECTOR(6DOWNTO0));

ENDDECLED;

ARCHITECTUREBEHAVOFCNTDISPLAYIS

SIGNALCNT4B:STD_LOGIC_VECTOR(3DOWNTO0);

BEGIN

PROCESS(CLK)

BEGIN

IFCLK'EVENTANDCLK='1'THEN

CNT4B<=CNT4B+1;

ENDIF;

ENDPROCESS;

PROCESS(CNT4B)

BEGIN

CASECNT4BIS

WHEN“0000”=>DOUT<=“0111111”

WHEN“0001”=>DOUT“0000110”

WHEN“0010”=>DOUT“1011011”

WHEN“0011”=>DOUT<=“1001111”

WHEN“0100”=>DOUT<=“1100110”

〈二

WHEN“0101”二>DOUT“1101101”

WHEN“0110”=>DOUT<=“1111101”

WHEN“0111”=>DOUT<=“0000111”

WHEN

溫馨提示

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

評論

0/150

提交評論