




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)員工合伙合同范本
- 個人英文傭金合同范本
- 亮化購貨合同范本
- 代理續(xù)約合同范本
- 魚池出租合同范本
- 公司裝飾勞務(wù)合同范例
- 兼職工作合同范本
- 停止合作合同范本
- 水上安全合同范本
- 做綠化合同范本
- 部編版小學(xué)一年級語文下冊《春夏秋冬》課件
- 中國煙草總公司鄭州煙草研究院筆試試題2023
- 建設(shè)法規(guī)(全套課件)
- 心衰患者的容量管理中國專家共識-共識解讀
- 外用激素合理使用
- 個人投資收款收據(jù)
- H3C全系列產(chǎn)品visio圖標(biāo)庫
- 新生兒常見儀器的使用與維護(hù) 課件
- 魯棒控制理論基礎(chǔ)1-2章
- 工藝能力分析報(bào)告
- 《給校園植物掛牌》課件
評論
0/150
提交評論