《數(shù)字系統(tǒng)與邏輯設(shè)計(jì)》課件第10章_第1頁
《數(shù)字系統(tǒng)與邏輯設(shè)計(jì)》課件第10章_第2頁
《數(shù)字系統(tǒng)與邏輯設(shè)計(jì)》課件第10章_第3頁
《數(shù)字系統(tǒng)與邏輯設(shè)計(jì)》課件第10章_第4頁
《數(shù)字系統(tǒng)與邏輯設(shè)計(jì)》課件第10章_第5頁
已閱讀5頁,還剩126頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第十章VHDL語言簡介10.1

VHDL語言概述10.2

VHDL語言程序的基本結(jié)構(gòu)10.3

VHDL語言的數(shù)據(jù)類型及運(yùn)算操作符10.4

VHDL語言的主要描述語句10.5基本邏輯電路設(shè)計(jì)

10.1

VHDL語言概述

10.1.1VHDL語言的歷史

VHDL(VHSICHardwareDescriptionLanguage)是一種標(biāo)準(zhǔn)的硬件描述語言。20世紀(jì)70年代末,美國國防部提出了VHSIC(VeryHighSpeedIntegratedCircuit)計(jì)劃,目的是采用一種新的描述方法來進(jìn)行新一代集成電路的設(shè)計(jì)。同時(shí)便于管理有關(guān)電子電路技術(shù)文件,使其遵循統(tǒng)一的設(shè)計(jì)描述界面,以便將來在有新技術(shù)推出時(shí),仍能重復(fù)使用原設(shè)計(jì)。1981年6月,一個工作小組在美國國防部的組織下正式成立,不久提出了一種新的硬件描述語言——VHDL。硬件描述語言(HDL)是一種用形式化方法來描述數(shù)字電路和設(shè)計(jì)數(shù)字邏輯系統(tǒng)的語言,可以用來編寫設(shè)計(jì)文件、建立電子系統(tǒng)行為級的模擬模型,在此基礎(chǔ)上,可利用計(jì)算機(jī)的強(qiáng)大能力對用VHDL建模的復(fù)雜數(shù)字邏輯進(jìn)行模擬,再利用邏輯綜合工具自動生成符合要求且在電路結(jié)構(gòu)上可以實(shí)現(xiàn)的數(shù)字邏輯網(wǎng)表。根據(jù)網(wǎng)表和某種工藝可進(jìn)一步進(jìn)行版圖設(shè)計(jì),生成該工藝條件下電路的延時(shí)模型,并經(jīng)模擬驗(yàn)證無誤后用于制造ASIC芯片或者寫入CPLD和FPGA器件中。

提出VHDL語言的目標(biāo)是使電路文本化成為標(biāo)準(zhǔn),使文本描述的電路設(shè)計(jì)能夠?yàn)槠渌怂斫?,同時(shí)也可以作為一種模型語言并能采用軟件進(jìn)行仿真。

1986年,IEEE標(biāo)準(zhǔn)化組織開始討論VHDL語言標(biāo)準(zhǔn),同時(shí)成立了一個VHDL標(biāo)準(zhǔn)化小組。1987年12月,IEEE公布了VHDL的第一個工業(yè)標(biāo)準(zhǔn)版本并宣布實(shí)施,即IEEE1076標(biāo)準(zhǔn)。1988年,美國軍用標(biāo)準(zhǔn)MIL-STD-454規(guī)定所有為美國國防部設(shè)計(jì)的ASIC產(chǎn)品必須采用VHDL來進(jìn)行描述。1993年,經(jīng)過幾年的修訂和擴(kuò)展,IEEE公布了VHDL的新版本IEEE1164。1996年,IEEE1076.3成為VHDL的綜合標(biāo)準(zhǔn)。 10.1.2VHDL系統(tǒng)設(shè)計(jì)的特點(diǎn)及優(yōu)勢

與其他硬件描述語言相比,VHDL具有以下特點(diǎn):

(1)功能強(qiáng)大、設(shè)計(jì)靈活、支持廣泛、易于修改。

VHDL具有功能強(qiáng)大的語言結(jié)構(gòu),可以用簡潔明確的源代碼來描述復(fù)雜的邏輯控制。VHDL支持同步電路、異步電路和隨機(jī)電路的設(shè)計(jì),這是其他硬件描述語言所不能比擬的。VHDL還支持各種設(shè)計(jì)方法,既支持自底向上的設(shè)計(jì),又支持自頂向下的設(shè)計(jì);既支持模塊化設(shè)計(jì),又支持層次化設(shè)計(jì)。

由于VHDL已經(jīng)成為IEEE標(biāo)準(zhǔn)所規(guī)范的硬件描述語言,因此目前大多數(shù)EDA工具幾乎都支持VHDL,這為VHDL的進(jìn)一步推廣和廣泛應(yīng)用奠定了基礎(chǔ)。在硬件電路設(shè)計(jì)過程中,主要的設(shè)計(jì)文件是用VHDL編寫的源代碼,因?yàn)閂HDL易讀和結(jié)構(gòu)化,所以易于修改設(shè)計(jì)。

(2)強(qiáng)大的系統(tǒng)硬件描述能力。

VHDL具有多層次的設(shè)計(jì)描述功能,既可以描述系統(tǒng)級電路,又可以描述門級電路。而描述既可以采用行為描述、寄存器傳輸描述或結(jié)構(gòu)描述,也可以采用三者混合的混合級描述。另外,VHDL支持慣性延遲和傳輸延遲,還可以準(zhǔn)確地建立硬件電路模型。VHDL支持預(yù)定義的和自定義的數(shù)據(jù)類型,給硬件描述帶來了較大的自由度,使設(shè)計(jì)人員能夠方便地創(chuàng)建高層次的系統(tǒng)模型。

(3)獨(dú)立于器件的設(shè)計(jì)、與工藝無關(guān)。

設(shè)計(jì)人員用VHDL進(jìn)行設(shè)計(jì)時(shí),不需要首先考慮選擇完成設(shè)計(jì)的器件,可以集中精力進(jìn)行設(shè)計(jì)的優(yōu)化。當(dāng)設(shè)計(jì)描述完成后,可以用多種不同的器件結(jié)構(gòu)來實(shí)現(xiàn)其功能。

(4)很強(qiáng)的移植能力,易于共享和復(fù)用。

VHDL是一種標(biāo)準(zhǔn)化的硬件描述語言,同一個設(shè)計(jì)描述可以被不同的工具所支持,使得設(shè)計(jì)描述的移植成為可能。

VHDL采用基于庫(Library)的設(shè)計(jì)方法,可以建立各種可再次利用的模塊。將這些模塊存放到庫中,就可以在以后的設(shè)計(jì)中進(jìn)行復(fù)用,可以使設(shè)計(jì)成果在設(shè)計(jì)人員之間進(jìn)行交流和共享,減少了硬件電路設(shè)計(jì)的工作量??梢?,作為一種IEEE的工業(yè)標(biāo)準(zhǔn),VHDL具有很多其他硬件描述語言所不具有的優(yōu)點(diǎn)。當(dāng)然,VHDL也存在著不足之處,主要體現(xiàn)在以下幾個方面:

(1)系統(tǒng)級抽象描述能力較差;

(2)某些場合不能準(zhǔn)確描述硬件電路;

(3)綜合工具的不同將導(dǎo)致綜合質(zhì)量的不同;

(4)不具有描述模擬電路的能力。

10.2

VHDL語言程序的基本結(jié)構(gòu)

10.2.1VHDL語言設(shè)計(jì)的基本單元及其構(gòu)成

一個完整的VHDL語言程序通常包含實(shí)體(Entity)、結(jié)構(gòu)體(Architecture)、配置(Configuration)、包集合(Package)和庫(Library)五個部分。

簡單的程序是由實(shí)體和結(jié)構(gòu)體兩部分組成的。實(shí)體用于描述設(shè)計(jì)系統(tǒng)的外部接口信號,結(jié)構(gòu)體用于描述系統(tǒng)的行為、系統(tǒng)數(shù)據(jù)的流程或者系統(tǒng)組織結(jié)構(gòu)形式。設(shè)計(jì)實(shí)體是VHDL程序的基本單元,是電子系統(tǒng)的抽象。簡單的實(shí)體可以是一個門電路,復(fù)雜的實(shí)體可以是一個微處理器或一個數(shù)字電子系統(tǒng)。實(shí)體由實(shí)體說明和結(jié)構(gòu)體說明兩部分組成。

例10-2-1是計(jì)數(shù)器程序結(jié)構(gòu)模板。由這個抽象的程序可以歸納出VHDL程序的基本結(jié)構(gòu)。

【例10-2-1】計(jì)數(shù)器程序結(jié)構(gòu)模板。[HT5"SS][ZK(]LIBRARYIEEE;

USEieee.std_logic_1164.all;

ENTITYentity_counterIS

//實(shí)體說明

PORT(//端口說明

SIGNAL_data_input_name:ININTEGERRANGE0TO_count_value;

SIGNAL_clk_input_name:INSTD_LOGIC;

SIGNAL_clm_input_name:INSTD_LOGIC;

SIGNAL_ena_input_name:INSTD_LOGIC;

SIGNAL_ld_input_name:INSTD_LOGIC;

SIGNAL_count_output_name:OUTINTEGERRANGE0TO_Count_value;

)

ENDentity_name;

ARCHITECTUREcounterOF_entity_counterIS//結(jié)構(gòu)體說明

SIGNAL_count_signal_name:INTEGERRANGE0TO_count_value;

BEGIN

PROCESS(_clk_input_name,_clrn_input_name)----敏感變量表

BEGIN

IF_clrn_input_name=′0′THEN

_count_signal_name<=0;

ELSIF(_clk_input_name′EVENTAND_clk_input_name=′1′)THEN

IF_ld_input_name=′1′THEN

_count_signal_name<=_data_input_name;

ELSE

IF_ena_input_name=′1′THEN

_count_signal_name<=_count_signal_name+1;

ELSE

_count_signal_name<=_count_signal_name;

ENDIF;

ENDIF;

ENDIF;

ENDPROCESS;

_count_output_name<=_count_signal_name;

ENDcounter;圖10-2-1

VHDL程序結(jié)構(gòu)圖10-2-2

VHDL程序設(shè)計(jì)系統(tǒng)模型10.2.2實(shí)體

1.實(shí)體說明

根據(jù)IEEE標(biāo)準(zhǔn),實(shí)體組織的一般格式為

ENTITY實(shí)體名IS

[GENERIC(類型表);]——可選項(xiàng)

[PORT(端口表);]——必需項(xiàng)

實(shí)體說明部分;——可選項(xiàng)

[BEGIN

實(shí)體語句部分;]

END[ENTITY][實(shí)體名];

根據(jù)上述實(shí)體說明的一般書寫格式,編寫一個8位二進(jìn)制加法器的VHDL程序設(shè)計(jì)的實(shí)體說明,如例10-2-2所示?!纠?0-2-2】

8位二進(jìn)制加法器的實(shí)體說明。

LIBRARY

ieee;

USE

ieee.std_logic_1164.all;

ENTITYadd8

IS

PORT(

b:in

std_logic_vector(7

downto

0);

a:in

std_logic_vector(7

downto

0);

Ci:in

std_logic;

Sum:out

std_logic_vector(7downto

0);

Co:out

std_logic;)

ENDadd8;圖10-2-3實(shí)體add8/8位加法器外部接口實(shí)體說明以“ENTITY實(shí)體名IS”開始,以“END實(shí)體名”結(jié)束。大寫字母或黑體字都是VHDL關(guān)鍵字。實(shí)體說明主要描述一些參數(shù)的類型。參數(shù)的類型說明必須放在端口說明之前。

在層次化系統(tǒng)設(shè)計(jì)中,實(shí)體說明是整個系統(tǒng)的輸入/輸出(I/O)。在一個器件級的設(shè)計(jì)中,實(shí)體說明是一個芯片的輸入/輸出(I/O)。

實(shí)體說明在VHDL程序設(shè)計(jì)中描述一個元件或一個模塊與設(shè)計(jì)系統(tǒng)的其余部分(其余元件、模塊)之間的連接關(guān)系,可以看做一個電路圖的符號。

2.類型說明

類型說明是實(shí)體說明中的可選項(xiàng),放在端口說明之前,其一般書寫格式為

GENERIC[CONSTANT]名字表:[IN]子類型標(biāo)識[:=靜態(tài)表達(dá)式],…]

例如:

GENERIC(m:TIME:=3ns)

這個參數(shù)說明是指在VHDL程序中,結(jié)構(gòu)體內(nèi)的參數(shù)m是時(shí)間參數(shù),取值為3ns。

3.端口說明

端口說明是對設(shè)計(jì)實(shí)體與外部接口的描述,是設(shè)計(jì)實(shí)體和外部環(huán)境動態(tài)通信的通道,其功能對應(yīng)于電路圖符號的一個引腳。實(shí)體說明中的每一個I/O信號被稱為一個端口,一個端口就是一個數(shù)據(jù)對象。端口可以被賦值,也可以當(dāng)作變量用在邏輯表達(dá)式中。定義實(shí)體的一組端口稱作端口說明(portdeclaration)。

端口說明的組織結(jié)構(gòu)必須有一個名稱、一個通信模式和一個數(shù)據(jù)類型。端口說明的一般格式為

Port(端口名,端口名:模式數(shù)據(jù)類型名

端口名,端口名:模式數(shù)據(jù)類型名);端口名是賦予每個外部引腳的名稱,名稱的含義要明確,如D開頭的端口名表示數(shù)據(jù),A開頭的端口名表示地址等。端口名通常用幾個英文字母或一個英文字母加數(shù)字表示。下面是合法的端口名:CLK,RESET,A0,D3。

模式用來說明數(shù)據(jù)、信號通過該端口的傳輸方向。端口模式有in、out、buffer、inout。

(1)輸入(in)。輸入僅允許數(shù)據(jù)流入端口。輸入信號的驅(qū)動源在該設(shè)計(jì)實(shí)體的外部。輸入模式主要用于時(shí)鐘輸入、控制輸入(如Load、Reset、Enable、CLK)和單向的數(shù)據(jù)輸入,如地址信號(address)。不用的輸入一般接地,以免浮動引入干擾噪聲。

(2)輸出(out)。輸出僅允許數(shù)據(jù)流從實(shí)體內(nèi)部輸出。端口的驅(qū)動源在該設(shè)計(jì)實(shí)體的內(nèi)部。輸出模式不能用于被設(shè)計(jì)實(shí)體的內(nèi)部反饋,因?yàn)檩敵龆丝谠趯?shí)體內(nèi)不能看做可讀的。輸出模式常用于計(jì)數(shù)輸出、單向數(shù)據(jù)輸出、設(shè)計(jì)實(shí)體產(chǎn)生的控制其他實(shí)體的信號等。一般而言,不用的輸出端口不能接地,避免造成輸出高電平時(shí)燒毀被設(shè)計(jì)實(shí)體。

(3)緩沖(buffer)。緩沖模式的端口與輸出模式的端口類似,只是緩沖模式允許內(nèi)部引用該端口的信號。緩沖端口既能用于輸出,也能用于反饋。

緩沖端口的驅(qū)動源可以是設(shè)計(jì)實(shí)體的內(nèi)部信號源或者是其他實(shí)體的緩沖端口。緩沖不允許多重驅(qū)動,不與其他實(shí)體的雙向端口和輸出端口相連。

內(nèi)部反饋的實(shí)現(xiàn)方法有兩種,一是通過建立緩沖模式端口來實(shí)現(xiàn),二是通過建立設(shè)計(jì)實(shí)體的內(nèi)部節(jié)點(diǎn)來實(shí)現(xiàn)。

緩沖模式用于在實(shí)體內(nèi)部建立一個可讀的輸出端口,例如計(jì)數(shù)器輸出,計(jì)數(shù)器的現(xiàn)態(tài)被用來決定計(jì)數(shù)器的次態(tài)。實(shí)體既需要輸出,又需要反饋,這時(shí)設(shè)計(jì)端口模式應(yīng)為緩沖模式。

(4)雙向模式(inout)。雙向模式可以代替輸入模式、輸出模式和緩沖模式。

在設(shè)計(jì)實(shí)體的數(shù)據(jù)流中,有些數(shù)據(jù)是雙向的,數(shù)據(jù)可以流入該設(shè)計(jì)實(shí)體,也有數(shù)據(jù)從設(shè)計(jì)實(shí)體流出,這時(shí)需要將端口模式設(shè)計(jì)為雙向端口。雙向模式的端口允許引入內(nèi)部反饋,所以雙向模式端口還可以作為緩沖模式用。由此可知,雙向端口是一個完備的端口模式。

一般而言,輸入信號把端口指派成輸入模式,輸出信號把端口指派成輸出模式,而雙向數(shù)據(jù)信號,如計(jì)算機(jī)的PCI總線的地址/數(shù)據(jù)復(fù)用總線、DMA控制器數(shù)據(jù)總線,都選用端口雙向模式。這一良好的設(shè)計(jì)習(xí)慣,使得從端口名稱、端口模式就可一目了然地知道信號的用途、性質(zhì)、來源和去向,十分方便。對一個大型設(shè)計(jì)任務(wù),大家應(yīng)協(xié)同工作,從而不至于引起歧義。類型說明和端口說明是實(shí)體說明的組成部分,用于說明設(shè)計(jì)實(shí)體和外部通信的通道。利用外部通信通道和參數(shù)的類型說明為設(shè)計(jì)實(shí)體提供信息。參數(shù)的類型用來規(guī)定端口的大小、I/O引腳的指派、實(shí)體中子元件的數(shù)目和實(shí)體的定時(shí)特性等信息。

4.數(shù)據(jù)類型(types)

數(shù)據(jù)類型端口說明除了定義端口標(biāo)識名稱、端口定義外,還要標(biāo)明出入端口的數(shù)據(jù)類型。VHDL語言的IEEE1706/93標(biāo)準(zhǔn)規(guī)定,EDA綜合工具支持的數(shù)據(jù)類型為布爾型(boolean)、位型(bit)、位矢量型(bitvector)和整數(shù)型(integer)。

由IEEEstd_logic_1164所約定,并由EDA工具支持和提供的數(shù)據(jù)類型為標(biāo)準(zhǔn)邏輯(standardlogic)類型。標(biāo)準(zhǔn)邏輯類型也分為布爾型、位型、位矢量型和整數(shù)型。為了使EDA工具的仿真、綜合軟件能夠處理這些邏輯類型,這些標(biāo)準(zhǔn)庫必須在實(shí)體中聲明或在USE語句中調(diào)用。

10.2.3結(jié)構(gòu)體

1.結(jié)構(gòu)體說明

結(jié)構(gòu)體定義實(shí)體功能的一種實(shí)現(xiàn)。結(jié)構(gòu)體的結(jié)構(gòu)為

architecture結(jié)構(gòu)體名of實(shí)體名is

{塊說明項(xiàng)}

begin

{并行語句}

end結(jié)構(gòu)體名;

塊說明項(xiàng)(或定義語句)處于architecture與begin之間,對結(jié)構(gòu)體內(nèi)部使用的信號、常數(shù)、數(shù)據(jù)類型和函數(shù)進(jìn)行說明,包括使用語句、子程序說明、子程序體、類型說明、子類型說明、常數(shù)說明、信號說明和元件說明。

并行語句處于begin與end之間,描述結(jié)構(gòu)體的行為與連接關(guān)系。

結(jié)構(gòu)體的組織如圖10-2-4所示。圖10-2-4結(jié)構(gòu)體的組織

2.結(jié)構(gòu)體的子結(jié)構(gòu)描述

1)塊(block)語句結(jié)構(gòu)

塊語句結(jié)構(gòu)為

塊結(jié)構(gòu)名:

block

begin

{并行語句}

endblock塊結(jié)構(gòu)名;

2)進(jìn)程(process)語句結(jié)構(gòu)

進(jìn)程語句結(jié)構(gòu)為

[進(jìn)程名]:process(信號1,信號2,……)

{說明內(nèi)部變量}

begin

{順序語句}

endprocess;

進(jìn)程的組織如圖10-2-5所示。圖10-2-5進(jìn)程的組織一般地,一個可綜合的、完整的VHDL程序有比較固定的結(jié)構(gòu)。設(shè)計(jì)實(shí)體中,一般首先出現(xiàn)的是各類庫及其程序包的使用聲明,包括未以顯式表達(dá)的工作庫WORK庫的使用聲明,接著是實(shí)體描述,接著是結(jié)構(gòu)體描述,而在結(jié)構(gòu)體中可以含有不同的邏輯表達(dá)語句結(jié)構(gòu)。這里將一個相對完整的VHDL程序設(shè)計(jì)構(gòu)建稱為設(shè)計(jì)實(shí)體。

3.process進(jìn)程語句和順序語句

由process引導(dǎo)的語句稱為進(jìn)程語句。在VHDL中,所有合法的順序描述的語句都必須放在進(jìn)程語句中(并非所有語句都能放在進(jìn)程語句中)。

process(a,b,c)稱為進(jìn)程的敏感信號表,通常要求將進(jìn)程中所有的輸入信號都放在敏感信號表中。由于process語句的執(zhí)行依賴于敏感信號的變化,當(dāng)某一敏感信號(如a)從原來的“1”跳變到“0”,或者從原來的“0”跳變到“1”時(shí),就將啟動此進(jìn)程語句,而在執(zhí)行一遍整個進(jìn)程的順序語句后,便進(jìn)入等待狀態(tài),直到下一次敏感信號表中某一信號的跳變才再次進(jìn)入“啟動—運(yùn)行”狀態(tài)。在一個結(jié)構(gòu)體中可以包含任意個進(jìn)程語句,所有的進(jìn)程語句都是并行語句,而由任一進(jìn)程process引導(dǎo)的語句結(jié)構(gòu)屬于順序語句。10.2.4寄存器的VHDL描述

與其他硬件描述語言相比,在時(shí)序電路的描述上,VHDL具有許多獨(dú)特之處,最明顯的是VHDL主要通過對時(shí)序器件功能和邏輯行為的描述,而非結(jié)構(gòu)上的描述即能由計(jì)算機(jī)綜合出符合要求的時(shí)序電路,從而充分體現(xiàn)了VHDL電路系統(tǒng)行為描述的強(qiáng)大功能。

以D觸發(fā)器為例,其語言描述包含了VHDL對時(shí)序電路的最基本和典型的表達(dá)方式,同時(shí)也包含了VHDL中許多最具特色的語言現(xiàn)象。例10-2-3是對D觸發(fā)器元件圖10-2-6的VHDL描述。圖10-2-6

D觸發(fā)器【例10-2-3】

D觸發(fā)器的VHDL描述。

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYDFF1IS

PORT(CLK:[WBY]INSTD_LOGIC;

D:[DW)]INSTD_LOGIC;

Q:[DW)]OUTSTD_LOGIC);

END;

ARCHITECTUREbhvOFDFF1IS

SIGNALQ1:STD_LOGIC;

BEGIN

PROCESS(CLK)

BEGIN

IFCLK′EVENTANDCLK=′1′

THENQ1<=D;

ENDIF;

ENDPROCESS;

Q<=Q1;

ENDbhv;

1.標(biāo)準(zhǔn)邏輯位數(shù)據(jù)類型STD_LOGIC

從例10-2-3中可見,D觸發(fā)器的3個信號端口CLK、D和Q的數(shù)據(jù)類型都被定義為STD_LOGIC。就數(shù)字系統(tǒng)設(shè)計(jì)來說,類型STD_LOGIC比BIT包含的內(nèi)容豐富和完整得多。試比較STD_LOGIC和BIT兩種數(shù)據(jù)類型的程序包定義表達(dá)式(其中TYPE是數(shù)據(jù)類型定義語句):

BIT數(shù)據(jù)類型定義:

TYPEBITIS(′0′,′1′);

STD_LOGIC數(shù)據(jù)類型定義:

TYPESTD_LOGICIS(′U′,′X′,′0′,′1′,′Z′,′W′,′L′,′H′,′-′);以上定義的9種數(shù)據(jù)的含義是:′U′——未初始化的;′X′——強(qiáng)未知的;′0′——強(qiáng)邏輯0;′1′——強(qiáng)邏輯1;′Z′——高阻態(tài);′W′——弱未知的;′L′——弱邏輯0;′H′——弱邏輯1;′-′——忽略。它們較完整地概括了數(shù)字系統(tǒng)中所有可能的數(shù)據(jù)表現(xiàn)形式。STD_LOGIC類型比BIT類型的數(shù)據(jù)具有更寬的取值范圍,從而實(shí)際電路有更好的適應(yīng)性。

在仿真和綜合中,將信號或其他數(shù)據(jù)對象定義為STD_LOGIC數(shù)據(jù)類型是非常重要的,它可以使設(shè)計(jì)者精確地模擬一些未知的和具有高阻態(tài)的線路情況。但就目前的綜合器而言,STD_LOGIC型數(shù)據(jù)能夠在數(shù)字器件中實(shí)現(xiàn)的只有其中的四種值,即′X′(或′-′)、′0′、′1′和′Z′。

2.設(shè)計(jì)庫和標(biāo)準(zhǔn)程序包

如上所述,定義數(shù)據(jù)類型BIT的函數(shù)包含于標(biāo)準(zhǔn)庫STD的STANDARD標(biāo)準(zhǔn)程序包中。一般地,為了使用STD_LOGIC數(shù)據(jù)類型,應(yīng)該在如例10-2-1的程序上面增加如下兩句說明語句:

LIBRARYSTD;

USESTD.STANDARD.ALL;第一句中的LIBRARY是關(guān)鍵詞,LIBRARYSTD表示打開STD庫;第二句的USE和ALL是關(guān)鍵詞,USESTD.STANDARD.ALL表示允許使用STD庫中STANDARD程序包中的所有內(nèi)容,如類型定義、函數(shù)、過程、常量等。另一方面,要求VHDL設(shè)計(jì)文件存盤在某一文件夾中,如D:\VHDL_FILE中,并被指定為工程PROJECT文件所在的目錄,VHDL工具將此路徑指定的文件夾默認(rèn)為工作庫(WORKLIBRARY)。在VHDL程序前面還應(yīng)該增加“LIBRARYWORK;”語句,VHDL工具才能調(diào)用相關(guān)的元件和程序包。但是,由于VHDL標(biāo)準(zhǔn)中規(guī)定標(biāo)準(zhǔn)庫STD和工作庫WORK都是默認(rèn)打開的,因此可以像例10-2-1那樣,不必將上述庫和程序包的使用語句以顯式表達(dá)在VHDL程序中。除非如例10-2-3那樣,需要使用一些特殊的程序包。使用庫和程序包的一般定義表達(dá)式是:

LIBRARY<設(shè)計(jì)庫名>;

USE<設(shè)計(jì)庫名>.<程序包名>.ALL;

STD_LOGIC的類型定義在被稱為STD_LOGIC_1164的程序包中,此包由IEEE定義,而且此程序包所在的程序庫的庫名也稱為IEEE。由于IEEE庫不屬于VHDL標(biāo)準(zhǔn)庫,所以在使用其庫中內(nèi)容前,必須事先給予聲明,如例10-2-3最上面的兩句語句:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

3.SIGNAL信號定義和數(shù)據(jù)對象

例10-2-3中的語句“SIGNALQ1:STD_LOGIC;”表示在描述的器件DFF內(nèi)部定義標(biāo)識符Q1的數(shù)據(jù)對象為信號SIGNAL,其數(shù)據(jù)類型為STD_LOGIC。由于Q1被定義為器件的內(nèi)部接點(diǎn)信號,數(shù)據(jù)的進(jìn)出不像端口信號那樣受限制,所以不必定義其端口模式(如IN、OUT等)。

語句“SIGNALQ1:STD_LOGIC;”中的SIGNAL是定義某標(biāo)識符為信號的關(guān)鍵詞。在VHDL中,數(shù)據(jù)對象(DataObjects)類似于一種容器,它接受不同數(shù)據(jù)類型的賦值。數(shù)據(jù)對象有三類,即信號(SIGNAL)、變量(VARIABLE)和常量(CONSTANT)。VHDL中,被定義的標(biāo)識符必須確定為某類數(shù)據(jù)對象,同時(shí)還必須被定義為某種數(shù)據(jù)類型,如例10-2-3中的Q1,對它規(guī)定的數(shù)據(jù)對象是信號,數(shù)據(jù)類型是STD_LOGIC(規(guī)定Q1的取值范圍),前者規(guī)定了Q1的行為方式和功能特點(diǎn),后者限定了Q1的取值范圍。根據(jù)VHDL規(guī)定,Q1作為信號,它可以如同一根連線那樣在整個結(jié)構(gòu)體中傳遞信息,也可以根據(jù)程序的功能描述構(gòu)成一個時(shí)序元件;但Q1傳遞或存儲的數(shù)據(jù)的類型只能包含在STD_LOGIC的定義中。需要注意的是,語句“SIGNALQ1:STD_LOGIC;”僅規(guī)定了Q1的屬性特征,而其功能定位需要由結(jié)構(gòu)體中的語句描述具體確定。

4.上升沿檢測表式和信號屬性函數(shù)EVENT

例10-2-3中的條件語句的判斷表達(dá)式“CLK′EVENTANDCLK=′1′”是用于檢測時(shí)鐘信號CLK的上升沿的,即如果檢測到CLK的上升沿,此表達(dá)式將輸出“TRUE”。

關(guān)鍵詞EVENT是信號屬性,VHDL通過表達(dá)式“<信號名>′EVENT”來測定該信號的跳變邊沿。短語“clock′EVENT”就是對clock標(biāo)識符的信號在當(dāng)前的一個極小的時(shí)間段δ內(nèi)發(fā)生事件的情況進(jìn)行檢測。所謂發(fā)生事件,就是clock的電平發(fā)生變化,從一種電平方式轉(zhuǎn)變到另一種電平方式。如果clock的數(shù)據(jù)類型定義為STD_LOGIC,則在δ時(shí)間段內(nèi),clock從其數(shù)據(jù)類型允許的9種值中的任何一個值向另一個值跳變,如由′0′變成′1′、由′1′變成′0′或由′Z′變成′0′,都認(rèn)為發(fā)生了事件,于是此表達(dá)式將輸出一個布爾值TRUE,否則為FALSE。如果將“clock′EVENT”改成語句“clock′EVENTANDclock=′1′”,則一旦“clock′EVENT”在δ時(shí)間內(nèi)測得clock有一個跳變,而小時(shí)間段δ之后又測得clock為高電平′1′,從而滿足此語句右側(cè)的“clock=′1′”的條件,而兩者相與(AND)后返回TRUE,由此便可以從當(dāng)前的“clock=′1′”推斷在此前的δ時(shí)間段內(nèi),clock必為0(假設(shè)clock的數(shù)據(jù)類型為BIT)。因此,以上的表達(dá)式可以用來對信號clock的上升沿進(jìn)行檢測。

5.不完整條件語句與時(shí)序電路

下面分析例10-2-3中對D觸發(fā)器功能的描述。

首先當(dāng)時(shí)鐘信號CLK發(fā)生變化時(shí),PROCESS語句被啟動,IF語句將測定條件表達(dá)式“CLK′EVENTANDCLK=′1′”是否滿足條件(即CLK的上升沿是否到來),如果為“TRUE”,則執(zhí)行語句Q1<=D,即將D的數(shù)據(jù)向內(nèi)部信號Q1賦值,并結(jié)束IF語句,最后將Q1的值向端口信號Q輸出,即執(zhí)行Q<=Q1。如果CLK沒有發(fā)生變化,或是非上升沿方式的變化,IF語句都不滿足條件,即條件表達(dá)式給出“FALSE”,于是將跳過賦值表達(dá)式Q1<=D結(jié)束IF語句的執(zhí)行。由于在此IF語句中沒有利用ELSE明確指出當(dāng)IF語句不滿足條件時(shí)作何操作,顯然這是一種不完整的條件語句(即在條件語句中,沒有將所有可能發(fā)生的條件給出對應(yīng)的處理方式),對于這種語言現(xiàn)象,VHDL綜合器將“理解”為當(dāng)不滿足條件時(shí),不能執(zhí)行語句Q1<=D,即應(yīng)保持Q1的原值不變。這就意味著必須引進(jìn)時(shí)序元件來保存Q1中的原值,直到滿足IF語句的判斷條件后才能更新Q1中的值。將這種不完整的條件語句的描述引進(jìn)寄存器元件,從而構(gòu)成時(shí)序電路的方式是VHDL描述時(shí)序電路最重要的途徑。通常,完整的條件語句只能構(gòu)成組合邏輯電路,例如,IF_THEN_ELSE語句可以指明全部可能的條件下的賦值操作,從而構(gòu)成多路選擇器組合電路模塊。

然而必須注意的是,雖然在構(gòu)成時(shí)序電路方面,不完整的條件語句具有獨(dú)特的功能,但在利用條件語句進(jìn)行純組合電路設(shè)計(jì)時(shí),如果沒有充分考慮電路中所有可能出現(xiàn)的問題,即沒有列全所有的條件,將導(dǎo)致不完整的條件語句的描述,從而產(chǎn)生設(shè)計(jì)者不希望的組合與時(shí)序電路的混合體。10.3

VHDL語言的數(shù)據(jù)類型及運(yùn)算操作符

10.3.1VHDL的數(shù)據(jù)類型

VHDL中的數(shù)據(jù)類型用來描述目標(biāo)量的屬性,有三種數(shù)據(jù)類型:

(1)常量(constant):命名數(shù)據(jù)類型的一種特殊值。

(2)變量(variable):變量對象位于進(jìn)程和子程序中,主要用于局部計(jì)算結(jié)果的暫存。

(3)信號(signal):是連接實(shí)體(或進(jìn)程)的主要機(jī)制,用信號在實(shí)體(或進(jìn)程)之間傳送信息。

1.常量[HT](constant)

格式:

constant常數(shù)名:數(shù)據(jù)類型[:=初始值];

例如:

constantVOFF:real:=0.8;

constantdelay:Time:=10ns;

常數(shù)賦值后不能變,賦的值要與數(shù)據(jù)類型一致,常數(shù)有和信號一樣的可視性規(guī)則,在程序包中說明的常數(shù)為全局量;在實(shí)體說明部分的常數(shù)可以被該實(shí)體中任何結(jié)構(gòu)體引用,在結(jié)構(gòu)體中的常數(shù)能被其結(jié)構(gòu)體內(nèi)部任何語句采用,包括被進(jìn)程語句采用;在進(jìn)程說明中說明的常量只能在進(jìn)程中使用。

2.變量(variable)

格式:

variable變量名:數(shù)據(jù)類型[約束條件][:=表達(dá)式];

例如:

variablex,y:integer;

variablecount:integerrange0to255:=10;

變量只能在進(jìn)程、函數(shù)或過程中使用,用做局部的數(shù)據(jù)存儲,為局部量,賦值立即生效。

3.信號[HT](signal)

格式:

signal變量名:數(shù)據(jù)類型[約束條件][:=初始值];

即在關(guān)鍵詞signal后跟一個或者多個信號名,每個信號名將建一個新信號,用冒號“:”把信號名和信號的數(shù)據(jù)類型分隔開,信號數(shù)據(jù)類型規(guī)定信號包含的數(shù)據(jù)類型信息,最后信號還可包含初始化信號指定的初值。

例如:

signalground:bit:=′0′;

signalen:std_logic_vector(7downto0);

信號是實(shí)體間動態(tài)數(shù)據(jù)交換的手段,信號賦值有附加延遲,信號為全局量,可實(shí)現(xiàn)進(jìn)程之間的通信,程序中賦值采用<=。

4.常量、變量與信號的區(qū)別

常量的作用范圍取決于它被定義的位置,允許用在實(shí)體、結(jié)構(gòu)體、程序包、塊、進(jìn)程、子程序中。

變量是一個局部量,只作用于在定義了變量的process和子程序的順序語句里面,而且變量的數(shù)據(jù)傳輸沒有延時(shí)行為。變量的主要作用是在進(jìn)程中作為臨時(shí)的數(shù)據(jù)存儲單元(當(dāng)前)。信號的定義和使用的范圍為entity、architecture和package,而不能用在process和subprogram的順序語句中。而且在沒有作特殊設(shè)置時(shí),信號也有一個最小傳輸延時(shí),它的硬件特征更為明顯,類似于連接線,可以作為設(shè)計(jì)實(shí)體并行語句模塊間的信息交流通道,它既可以保存當(dāng)前值也可以保存歷史值,和觸發(fā)器的記憶功能有很好的對應(yīng)關(guān)系,只是不必關(guān)注信號上的數(shù)據(jù)流動方向。信號的初始值的設(shè)定和variable一樣,由于電路上電后的隨機(jī)性,因此綜合器并不支持設(shè)置初始值。由于process的敏感列表里可以有信號,因此信號就能把process外部的信息引入或傳出,在process中,當(dāng)多個同名信號被賦值后,只執(zhí)行最后一個,因?yàn)楫?dāng)遇到endprocess的時(shí)候才對signal賦值。但是在并行語句中卻不允許同一信號有多個驅(qū)動源。在進(jìn)程中向信號賦值的時(shí)刻和信號得到該值的時(shí)刻之間有一隱含延遲,稱Δ延遲,Δ延遲是一個無窮小的時(shí)間量。一般信號賦值在進(jìn)程中僅當(dāng)碰到wait語句或進(jìn)程結(jié)束賦值時(shí)才生效。

進(jìn)程只對信號敏感,而對變量不敏感。信號除當(dāng)前值外還有許多相關(guān)信息,而變量只有當(dāng)前值。信號是全局量,變量為局部量。信號在電路中的功能是保存變化的數(shù)值和連接子元件;變量在電路中無類似的對應(yīng)關(guān)系,僅用于計(jì)算。

從硬件電路系統(tǒng)上來看,變量和信號相當(dāng)于電路系統(tǒng)中的連線和連線上傳輸?shù)男盘?,常量相?dāng)于電路中的恒定電平,如GND和VCC。10.3.2VHDL語言的運(yùn)算操作符

VHDL支持的運(yùn)算有邏輯運(yùn)算(logical)、關(guān)系運(yùn)算(relational)、算術(shù)運(yùn)算(arithmetic)和并置(連接)(concatenation)運(yùn)算。

1.邏輯運(yùn)算符

邏輯運(yùn)算符有not、and、or、nand、nor、xor等6種。其操作數(shù)類型有std_logic、bit、std_logic_vector、bit_vector及boolean。表達(dá)式中,操作數(shù)必須同類型,數(shù)組操作數(shù)必須同長度,作用于兩個數(shù)組操作數(shù)的邏輯運(yùn)算符就是作用在兩數(shù)組相應(yīng)的元素對上,運(yùn)算結(jié)果為同長度數(shù)組。表達(dá)式左右無優(yōu)先級差別,必要時(shí)加括號。當(dāng)表達(dá)式中僅有“and”、“or”、“xor”運(yùn)算符時(shí),可省略括號,“not”的優(yōu)先級最高。

2.算術(shù)運(yùn)算符

算術(shù)運(yùn)算符有+、-、*、/、mod、rem、+、-、**、abs等10種。

一元運(yùn)算(“+”取正,“-”取負(fù))操作數(shù)為任何類型,類型要相同;乘除操作數(shù)可同為整型或?qū)嵭?,也可以是物理量;求模和取余的操作?shù)必須為整型;指數(shù)運(yùn)算的左操作數(shù)可為整型或?qū)嵭?,而右操作?shù)為整型只有“+”、“-”、“*”才能綜合;對“STD_LOGIC_VECTOR”類型做加減運(yùn)算時(shí),操作數(shù)位長應(yīng)相同。

3.關(guān)系運(yùn)算符

關(guān)系運(yùn)算符有=、/=、<、<=、>、>=等6種,比較同類型的兩個操作數(shù),返回一個BOOLEAN值。

“=”和“/=”適用于各種類型,對數(shù)組和記錄類型,比較操作數(shù)的對應(yīng)元素,運(yùn)算順序從算式左邊開始,關(guān)系運(yùn)算符<、<=、>、>=適用于INTEGER、REAL、STD_LOGIC、[JP]STD_LOGIC_VECTOR和枚舉類型,關(guān)系運(yùn)算兩邊的數(shù)據(jù)類型必須相同,但位長可以不同。

4.并置(連接)運(yùn)算符

并置(連接)運(yùn)算符用于一維數(shù)組的連接,右邊內(nèi)容接在左邊內(nèi)容之后形成新數(shù)組,操作數(shù)是數(shù)組或數(shù)組的元素。

例如:

signalA,D:BIT_VECTOR(3downto0);

signalB,C,G:BIT_VECTOR(1downto0);

signalE:BIT_VECTOR(2downto0);

signalF,H,I:BIT;

A<=notB¬C;--數(shù)組連接數(shù)組

D<=notE¬F;--數(shù)組連接元素

G<=notH¬I;--元素連接元素用集合體方法進(jìn)行位的連接(將“&”換成“,”),例如:

temp<=(en,en,en,en);

temp<=(3=>en,2=>en,1=>en,0=>en);

temp<=(3downto0=>en);

temp<=(2=>′0′,others=>en);

各種運(yùn)算符號之間的關(guān)系如表10-3-1所示。表10-3-1運(yùn)算操作符優(yōu)先級順序10.4

VHDL語言的主要描述語句

10.4.1順序描述語句

1.wait語句

WAIT語句用于多種不同的目的,常用于為綜合工具指定時(shí)鐘輸入。另一用途是將進(jìn)程的執(zhí)行延時(shí)一段時(shí)間或者是為了動態(tài)地修改進(jìn)程的敏感表。

WAIT語句的執(zhí)行會暫停進(jìn)程的執(zhí)行,直到信號敏感表發(fā)生變化或某種條件滿足為止。若進(jìn)程中含信號敏感表,則必須緊跟在procees之后,這等價(jià)于該進(jìn)程最后一個語句為waiton語句,此時(shí)不能用顯式的wait語句。

2.斷言(assert)語句

assert語句在運(yùn)行過程中報(bào)告指定的錯誤信息,用于仿真和調(diào)試。

基本格式:

assert條件[report報(bào)告信息][severity出錯級別];

報(bào)告信息:字符串;出錯級別:note,warning,error,failure。執(zhí)行此語句時(shí),如果條件為真,則向下執(zhí)行;反之,則輸出錯誤信息和出錯級別。

3.賦值語句

賦值語句將一個值賦給變量或信號。

基本格式:

標(biāo)識符:=表達(dá)式;變量賦值

標(biāo)識符<=表達(dá)式;信號賦值

標(biāo)識符為接受表達(dá)式值的變量或信號(或變量或信號的一部分),表達(dá)式必須求值得到與目標(biāo)相同的數(shù)據(jù)類型。

標(biāo)識符為信號或變量,對數(shù)組類型數(shù)組的所有元素都要賦值,數(shù)組的序號表達(dá)式必須計(jì)算成該數(shù)組序號類型的值且在界內(nèi),但無需是可計(jì)算的。

信號賦值語句有三種類型:基本型、條件型和選擇型。其中條件型和選擇型賦值語句為并發(fā)語句?;拘托盘栙x值語句舉例如下:

a<=b;

a<=bafter10ns;為賦值引入非零延時(shí)值

條件型信號賦值語句格式為:

信號<=敏感信號表達(dá)式;

例如:

z<=anot(bnadc);

條件型信號賦值語句信號賦值不立即生效,若在一個進(jìn)程中有若干值賦給一個信號,則最后一個賦值生效;若干進(jìn)程賦值給一個信號,電路可能失效。

4.if語句

格式:

(1)if條件then

<順序處理語句>;

endif;

【例10-4-1】一個D觸發(fā)器的實(shí)現(xiàn)。

entityuregis

generic(size:integer:=2);

port(

clk,reset,load:instd_logic;

d:inunsigned(size-1downto0);

q:bufferunsigned(size-1downto0));

endureg;

architecturearchuregofuregis

begin

p1:process(reset,clk)

begin

if

reset=′1′then

q<=(others=>′0′);

elsif(clk′eventandclk=′1′)then

if

load=′1′then

q<=d;

end

if;

endif;

end

process;

end

archureg;

(2)if條件then

<順序處理語句>;

else

<順序處理語句>;

endif;

例如,兩輸入與門,在所有條件下都賦給信號一個值:

if(PHI=′1′)then

TEMP<=A;

else

TEMP<=′0′;

endif;

(3)if條件then

<順序處理語句>;

elsif條件then

<順序處理語句>;

elsif條件then

<順序處理語句>;

else

<順序處理語句>;

endif;

if語句中的每個條件必須是布爾表達(dá)式,每個if分支都包括一個或幾個順序語句,每個條件按順序計(jì)算。如果沒有一個條件滿足且else語句存在,則執(zhí)行else語句;如果沒有一個條件滿足且else語句不存在,則什么語句也不執(zhí)行?!纠?0-4-2】

4選1數(shù)據(jù)選擇器的實(shí)現(xiàn)。

entity

mux4is

port(

input:instd_logic_vector(3downto0);

sel:instd_logic_vector(1downto0);

y:outinstd_logic);

endmux4;

architecturertlofmux4is

begin

process(input,sel)

begin

if(sel=″00″)then

y<=input(0);

elsif(sel=″01″)then

y<=input(1);

elsif(sel=″10″)then

y<=input(2);

elsif

y<=input(3);

endif;

end

process;

endrtl;

if

load=′1′then

q<=d;

end

if;

end

if;

end

process;

end

archureg;

5.case語句

格式:

case表達(dá)式is

when選擇=>順序處理語句;

end

case;

選擇的計(jì)算結(jié)果必須是整型、枚舉型或枚舉型數(shù)組;選擇為靜態(tài)表達(dá)式或動態(tài)范圍,最終的選擇可以是“others”,選擇不能重疊;若無“others”選擇,那么選擇必須覆蓋表達(dá)式的所有可能值?!纠?0-4-3】

case語句。

port(A,B,I0,I1,I2,I3:instd_logic;

Q:outstd_logic);

endMUX4;

architectureMUX4ofMUX4is

signalsel:INTEGERrange0to3;

begin

process(A,B,I0,I1,I2,I3)

caseselis

when0=>Q<=I0;

when1=>Q<=I1;

when2=>Q<=I2;

when3=>Q<=I3;

endcase;

endprocess;

endmux4;

6.loop語句

要重復(fù)地執(zhí)行順序語句時(shí),可利用for…loop和while…loop兩種語句來實(shí)現(xiàn)。

1)for…loop

該語句用于循環(huán)執(zhí)行一系列語句,迭代次數(shù)為一整數(shù),對該范圍內(nèi)的每一個值,循環(huán)執(zhí)行一次。當(dāng)?shù)秶械淖詈笠粋€值迭代完成后,跳出循環(huán),繼續(xù)執(zhí)行循環(huán)后的下一個語句。

格式:

[標(biāo)號]:for循環(huán)變量in范圍loop

<順序處理語句>;

end

loop[標(biāo)號名];【例10-4-4】loop語句的應(yīng)用。

asum:foriin1to9loop

sum:=i+sum;

endloopasum;

2)while…loop

該語句也用于循環(huán)執(zhí)行一系列語句,只要滿足迭代條件,就重復(fù)執(zhí)行下去。如果迭代條件求值為“真”,則封閉的語句就執(zhí)行一次。然后迭代條件重新求值。如果迭代仍為“真”,則循環(huán)重復(fù)執(zhí)行;否則,跳出循環(huán),繼續(xù)執(zhí)行循環(huán)后的下一個語句。

格式:

[標(biāo)號]:while條件loop

<順序處理語句>;

endloop[標(biāo)號名];

語句中的條件為布爾表達(dá)式?!纠?0-4-5】

while…loop語句的應(yīng)用。

i:=1;

sum:=0;

sbcd:while(i<10)loop

sum:=i+sum;

i:=i+1;

endloopsbcd;

7.next語句

next語句用于停止本次迭代,轉(zhuǎn)入下一次迭代。

格式:

next[標(biāo)號][when條件];

[標(biāo)號]表明下一次迭代的起始位置;若既無[標(biāo)號]也無[when條件],則執(zhí)行到該語句就立即跳出本次循環(huán),再從loop的起始位置進(jìn)行下次迭代。

例如:signalA,B,COPY_ENABLE:BIT_VECTOR(1to8);

A<=″00000000″;

for

I

in

1

to

8

loop

nextwhenCOPY_ENABLE(I)=′0′;

A(I)<=B(I);

end

loop;

8.exit語句

exit語句用于循環(huán)體內(nèi)部,有條件或無條件地結(jié)束當(dāng)前的迭代和循環(huán)。

格式:

exit[loop標(biāo)號][when條件];

當(dāng)條件滿足時(shí),結(jié)束循環(huán),繼續(xù)后繼的語句。

嵌套循環(huán)中有以下三種形式:

(1)若無[loop標(biāo)號],則執(zhí)行exit時(shí),程序僅從當(dāng)前所屬的loop循環(huán)中跳出。

(2)若exit后接[loop標(biāo)號],則執(zhí)行exit時(shí),程序跳到說明的標(biāo)號處。

(3)若exit后接[when條件],則執(zhí)行exit時(shí),只有當(dāng)條件為“真”時(shí)才跳出循環(huán)?!纠?0-4-6】

exit語句。

signalA,B:BIT_VECTOR(1downto

8);

signalA_LESS_THAN_B:boolean;

A_LESS_THAN_B<=FALSE;

forIin1downto

0

loop

if(A(I)=′1′andB(I)=′0′)then

A_LESS_THAN_B<=FALSE;

exit;

elsif(A(I)=′0′andB(I)=′1′)then

A_LESS_THAN_B<=TRUE;

exit;

else

null;

end

if;

end

loop;

9.exit與next語句的比較

exit與next語句兩者格式相同,都是跳出循環(huán)的剩余語句,但exit是終止循環(huán),而next是繼續(xù)下一次循環(huán)。10.4.2并行描述語句

VHDL的并行語句有進(jìn)程(process)語句、并行信號賦值(concurrentsignalassignment)語句、條件信號賦值(conditionalsignalassignment)語句、選擇信號賦值(selectivesignalassignment)語句、塊(block)語句等。

1.進(jìn)程(process)語句

進(jìn)程語句在一個結(jié)構(gòu)體中的所有進(jìn)程中并行運(yùn)行,每個進(jìn)程中的所有語句都順序執(zhí)行,進(jìn)程之間的通信靠信號來傳遞。

2.并發(fā)信號賦值[HT](concurrentsignalassignment)語句

并發(fā)信號賦值語句在結(jié)構(gòu)體的進(jìn)程之外使用,等價(jià)于包含順序賦值語句的進(jìn)程,并發(fā)信號賦值語句在仿真時(shí)同時(shí)運(yùn)行。

3.條件信號賦值(conditionalsignalassignment)語句

格式:

目標(biāo)<=表達(dá)式1when條件1else

表達(dá)式2when條件2else

表達(dá)式n;

“目標(biāo)”為接受表達(dá)式值的信號,所使用的表達(dá)式是“條件”為真的第一個(按順序)。如果沒有條件為真,則將最后一個表達(dá)式賦給目標(biāo),若多個條件為真,則僅第一個有效,如同if語句的第一個條件為真的分支一樣?!纾?/p>

z<=Awhenassign_A=′1′else

Bwhenassign_B=′1′else

C;

與此等價(jià)的if語句如下:

process(A,ssign_A,B,assign_B,C)

begin

ifasign_A=′1′then

Z<=A;

elsifasign_B=′1′then

Z<=B;

else

Z<=C;

endif;

endprocess;

條件信號賦值語句與if語句的區(qū)別如下:

(1)if語句只能在進(jìn)程內(nèi)使用,而條件賦值語句可在進(jìn)程外使用。

(2)if語句可以沒有else,而條件賦值語句一定要有else。

(3)if語句可以嵌套,而條件賦值語句不能進(jìn)行嵌套。

(4)if語句可以生成鎖存電路,而條件賦值語句不能生成鎖存電路。

4.選擇信號賦值(selectivesignalassignment)語句

格式:

with選擇表達(dá)式select

目標(biāo)<=表達(dá)式1when條件1

表達(dá)式2when條件2

表達(dá)式nwhen條件n;…當(dāng)選擇表達(dá)式的值滿足條件1時(shí),表達(dá)式1的值賦給目標(biāo),滿足條件2時(shí),表達(dá)式2的值賦給目標(biāo),依此類推。選擇表達(dá)式中的每一個值都必須由一個條件所覆蓋;最后的選擇可以是others。各條件不能重疊;若無others,則選擇表達(dá)式的所有可能值都必須被條件集合所覆蓋?!纠?0-4-7】選擇語句。

siganlA,B,C,D,Z:BIT

signalCONTROL:bit_vector(1downto0);

withCONTROLselect

Z<=A

when″00″,

Bwhen″01″,

Cwhen″10″,

Dwhen″11″,

′X′whenothers;等價(jià)的case語句:

process(CONTROL,A,B,C,D)

begin

caseCONTROLis

when0=>Z<=A;

when1=>Z<=B;

when2=>Z<=C;

when3=>Z<=D;

endcase;

endprocess;

5.塊(block)語句

塊語句允許設(shè)計(jì)者合理分組一個模型的區(qū)域,即把類似的部分由塊語句保持在一起,是VHDL中具有的一種劃分機(jī)制。例如設(shè)計(jì)CPU時(shí),將ALU劃分為一個塊,寄存器堆劃分為一個塊,而移位寄存器是另一個塊。每塊表示模塊中的一個自包容區(qū)域,分別描述局部信號、數(shù)據(jù)類型和常量等,任何能在結(jié)構(gòu)體說明部分說明的對象都能在塊說明部分說明。

block為并行語句,其所包含的語句也是并行語句。 10.5基本邏輯電路設(shè)計(jì)

10.5.1組合邏輯電路設(shè)計(jì)

組合邏輯電路包括簡單門電路、與非門、或非門、非門、異或門、編譯碼器與選擇器、加法器、求補(bǔ)器、三態(tài)門、總線緩沖器等。

1.簡單門電路

【例10-5-1】

3輸入與非門電路。

libraryieee;

useieee.std_logic_1164.all;

entitynand_3is

port(a,b,c:instd_logic;

y:outstd_logic);

endnand_3;

architecturebeh_nand_3ofnand_3is

begin

y<=not(aandbandc);

endbeh_nand_3;【例10-5-2】

2輸入異或門電路。

libraryieee;

useieee.std_logic_1164.all;

entityxor2isport(

a:instd_logic;

b:instd_logic;

y:outstd_logic);

endxor2;

architecturebeh_xor2ofxor2is

begin

y<=axorb;

endbeh_xor2;

2.編碼器、譯碼器與數(shù)據(jù)選擇器

【例10-5-3】3線-8線譯碼器。要求輸入“a,b,c”,輸出“y0~y7”,使能輸入“g1,g2,g3”,僅當(dāng)g1=1,g2=0,g3=0時(shí),譯碼器工作,否則輸出為高電平。

libraryieee;

useieee.std_logic_1164.all;

entitydecoder_3_to_8is

port(a,b,c,g1,g2,g3:instd_logic;

y:outstd_logic_vector(7downto0));

enddecoder_3_to_8;

architecturertlofdecoder_3_to_8is

signalindata:std_logic_vector(2downto0);

begin

indata<=c&b&a;

process(indata,g1,g2,g3)

begin

if(g1=′1′andg2=′0′andg3=′0′)then

caseindatais

when″000″=>y<=″11111110″;

when″001″=>y<=″11111101″;

when″010″=>y<=″11111011″;

when″011″=>y<=″11110111″;

when″100″=>y<=″11101111″;

when″101″=>y<=″11011111″;

when″110″=>y<=″10111111″;

when″111″=>y<=″01111111″

endcase;

else

y<=″11111111″;

endif;

endprocess;

endrtl;【例10-5-4】

3線-8線優(yōu)先級編碼器。

library

ieee;

useieee.std_logic_1164.all;

entity

priorityencoder

is

port(input:instd_logic_vector(7downto

0);

y:out

std_logic_vector(2downto

0));

end

priorityencoder;

architecture

rtl

of

priorityencoderis

begin

process(input)

begin

if(input(0)=″0″)then

y<=″111″;

elsif(input(1)=″0″)then

y<=″110″;

elsif(input(2)=″0″)then

y<=″101″;

elsif(input(3)=″0″)then

y<=″100″;

elsif(input(4)=″0″)then

y<=″011″;

elsif(input(5)=″0″)then

y<=″010″;

elsif(input(6)=″0″)then

y<=″001″;

else

y<=″000″;

end

if;

end

process;

end

rtl;【例10-5-5】4選1數(shù)據(jù)選擇器。

library

ieee;

useieee.std_logic_1164.all;

entitymux4is

port(input:instd_logic_vector(3downto0);

a,b:instd_logic;

y:outstd_logic);

endmux4;

architecturertlofmux4is

signalsel:std_logic_vector(1downto0);

begin

sel<=a&b;

process(input,sel)

begin

if(sel=″00″)then

y<=input(0);

elsif(sel=″01″)then

y<=input(1);

elsif(sel=″10″)then

y<=input(2);

else

y<=input(3);

endif;

endprocess;

endrtl;

3.加法器

【例10-5-6】半加器。

Library

ieee;

use

ieee.std_logic_1164.all;

entity

half_adder

is

port(a,b:instd_logic;

s,co:outstd_logic);

end

half_adder;

architecture

half1of

half_adder

is

begin

c<=a

or

b;

d<=a

nand

b;

co<=not

d;

s<=c

and

d;

end

half1;【例10-5-7】全加器。由兩個半加器構(gòu)成一個全加器。

libraryieee;

useieee.std_logic_1164.all;

entityfull_adderis

port(a,b,cin:instd_logic;

s,co:outstd_logic);

endfull_adder;

architectureful1offull_adderis

componenthalf_adder

port(a,b:instd_logic;

s,co:outstd_logic);

endcomponent;

signalu0_co,u0_s,u1_co:std_logic;

begin

u0:half_adderportmap(a,b,u0_s,u0_co);

u1:half_adderportmap(u0_s,cin,s,u1_co);

co<=u0_cooru1_co;

endfull;

4.三態(tài)門與總線緩沖器

【例10-5-8】三態(tài)門。

libraryieee;

use

ieee.std_logic_1164.all;

entity

tri_gateis

port(din,en:instd_logic;

dout:outstd_logic);

end

tri_gate;

architecturezasoftri_gateis

begin

tri_gate:process(din,en)

begin

if(en=′1′)then

dout<=din;

else

dout<=′Z′;

end

if;

endprocess;

endzas;

【例10-5-9】單向總線緩沖器,由多個三態(tài)門組成,來驅(qū)動地址總線和控制總線。

libraryieee;

useieee.std_logic_1164.all;

entitytri_buf8is

port(din:instd_logic_vector(7downto0);

dout:outstd_logic_vector(7downto0);

en:instd_logic;);

endtri_buf8;

architecturezasoftri_buf8is

begin

tri_buff:process(din,en)

begin

if(en=′1′)then

dout<=din;

else

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論