VHDL與數(shù)字電路設(shè)計(jì)課件_第1頁
VHDL與數(shù)字電路設(shè)計(jì)課件_第2頁
VHDL與數(shù)字電路設(shè)計(jì)課件_第3頁
VHDL與數(shù)字電路設(shè)計(jì)課件_第4頁
VHDL與數(shù)字電路設(shè)計(jì)課件_第5頁
已閱讀5頁,還剩269頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

VHDL的程序結(jié)構(gòu)和軟件操作

1-1VHDL程序的基本結(jié)構(gòu)include“stdio.h”;include“math.h”;intmain(void){inta,b,c;a=8;b=9;c=a+b;returnc;}Librarystd;Usestd.standard.all;Entityand2isPort(a,b:inbit;c:outbit);Endand2;Architecturea1ofand2isBeginc<=aandb;Enda1;VHDL程序C程序1-1VHDL程序的基本結(jié)構(gòu)(1)LIBRARY和PACHAGE聲明區(qū);(2)ENTITY定義區(qū);(3)ARCHITECTURE定義區(qū);(4)CONFIGURATION定義區(qū)。Library(庫)是用于存放預(yù)先編譯好的Package(程序包)。Package(程序包)中定義了基本的常數(shù),數(shù)據(jù)類型,元件及子程序等。

作用:聲明在實(shí)體和結(jié)構(gòu)體定義中將用到的數(shù)據(jù)類型、元件或子程序等。聲明格式:

Library

庫名;

Use

庫名.PACKAGE名.All;(1)LIBRARY和PACKAGE聲明區(qū)

作用:

ENTITY(實(shí)體)用于定義電路的外觀,即I/O端口的類型和數(shù)量。定義格式:Entity

實(shí)體名

is

Port(a:

inbit;

b:inbit;

c:outbit);End

實(shí)體名;(2)ENTITY定義區(qū)端口名數(shù)據(jù)類型端口模式(2)ENTITY定義區(qū)標(biāo)識(shí)符的定義原則:(1)標(biāo)識(shí)符由字母、數(shù)字和下劃線組成,a7_;(2)在標(biāo)識(shí)符不區(qū)分大小寫,ab和AB是一樣的;(3)第一個(gè)字符必須是字母,即a666;(4)不允許有兩個(gè)連續(xù)的下劃線,a__b錯(cuò)誤;(5)末尾不能是下劃線,mname_錯(cuò)誤;(6)標(biāo)識(shí)符不能和關(guān)鍵字相同,如Entity,is等。端口模式(MODE)有以下幾種類型:

IN;OUT;INOUT;BUFFER

端口模式可用下圖說明:(黑框代表一個(gè)設(shè)計(jì)或模塊)

INOUTBUFFERINOUT(2)ENTITY定義區(qū)(3)ARCHITECTURE定義區(qū)

定義了實(shí)體的實(shí)現(xiàn)。即電路的具體描述,說明電路執(zhí)行什么動(dòng)作或?qū)崿F(xiàn)功能。定義格式:

Architecture結(jié)構(gòu)體名

of實(shí)體名

is

[聲明語句;(內(nèi)部信號(hào)、變量、常數(shù),元件,子程序聲明)]Begin并行描述語句;End

結(jié)構(gòu)體名;(4)CONFIGURATION定義區(qū)

一個(gè)完整VHDL電路設(shè)計(jì)必須有一個(gè)實(shí)體和對(duì)應(yīng)的結(jié)構(gòu)體,即實(shí)體和結(jié)構(gòu)體對(duì)構(gòu)成一個(gè)完整的VHDL設(shè)計(jì)。一個(gè)實(shí)體可對(duì)應(yīng)一個(gè)結(jié)構(gòu)體或多個(gè)結(jié)構(gòu)體,即一個(gè)實(shí)體可以有不同的描述方式。作用:當(dāng)實(shí)體有多個(gè)結(jié)構(gòu)體時(shí),系統(tǒng)默認(rèn)實(shí)體選用最后一個(gè)結(jié)構(gòu)體,利用CONFIGURATION語句可以任意選擇采用哪一個(gè)結(jié)構(gòu)體。

(4)CONFIGURATION定義區(qū)定義格式:Configuration配置名

of實(shí)體名

isfor選用的結(jié)構(gòu)體名endfor;endconfiguration配置名;二輸入與門電路設(shè)計(jì)范例

abc電路真值表abc000100010111二輸入與門電路設(shè)計(jì)范例Librarystd;Usestd.standard.all;Entityand2is

Port(a:inbit;b:inbit;c:outbit);Endand2;--實(shí)體定義結(jié)束。

雙減號(hào)--為VHDL程序的注釋符,類似C語言中的//注釋符。二輸入與門電路設(shè)計(jì)范例ArchitectureNaofand2isBegin

c<=’0’whena=’0’andb=‘0’else’0’whena=’1’andb=‘0’else’0’whena=’0’andb=‘1’else‘1’;符號(hào)<=為信號(hào)直接賦值符。

EndNa;--結(jié)構(gòu)體NaArchitectureNbofand2is

Beginc<=aandb;--and

為邏輯與操作EndNb;

--結(jié)構(gòu)體Nb二輸入與門電路設(shè)計(jì)范例Configurations1ofand2isfornaendfor;endconfigurations1;--結(jié)構(gòu)體配置結(jié)束。1-2Max+plusⅡ系統(tǒng)的操作

Max+plusⅡ開發(fā)工具是美國Altera公司自行設(shè)計(jì)的一種軟件工具,其全稱為MultipleArrayMatrixandProgrammableLogicUserSystem。它具有原理圖輸入和文本輸入(采用硬件描述語言)兩種輸入手段,利用該工具所配備的編輯、編譯、仿真、時(shí)序分析、芯片編程等功能,將設(shè)計(jì)電路圖或電路描述程序變成基本的邏輯單元寫入到可編程的芯片中(如CPLD或FPGA芯片),作成ASIC芯片。它是EDA設(shè)計(jì)中不可缺少的一種工具。

下面我們介紹利用Max+plusⅡ

系統(tǒng)如何實(shí)現(xiàn)如下操作:(1)如何編寫VHDL程序(使用TextEditor);(2)如何編譯VHDL程序(使用Compiler);(3)如何仿真驗(yàn)證VHDL程序(使用WaveformEditor,Simulator);(4)如何進(jìn)行芯片的時(shí)序分析(使用TimingAnalyzer);(5)如何安排芯片腳位(使用FloorplanEditor);(6)如何下載程序至芯片(使用Programmer)。1-2Max+plusⅡ系統(tǒng)的操作(1)如何編寫VHDL程序a.打開文本編輯器;File/new/Texteditorfileb.編寫VHDL程序;c.保存文件,<1>文件名和定義的實(shí)體名必須相同,<2>文件擴(kuò)展名為VHD,<3>文件存盤的目錄不應(yīng)是根目錄或桌面,建議存放在Max2work或Maxplus2目錄,或其子目錄

。(2)如何編譯VHDL程序a.打開需要編譯的文件;b.設(shè)置工程到目前打開的文件;

File/Project/SetProjecttoCurrentFile,c.打開編譯器;點(diǎn)擊主菜單MAX+plusⅡ/Compiler選項(xiàng)。

d.選定VHDL源文件的版本

;Interfaces/VHDLNetlistReaderSettings…e.打開編譯器進(jìn)行編譯。(3)如何仿真驗(yàn)證VHDL程序a.打開波形編輯器(WaveformEditor);b.確定仿真持續(xù)時(shí)間(File/EndTime);c.將輸入輸出端口名選入波形編輯器;d.編輯輸入信號(hào)波形;e.保存仿真波形文件

;f.打開仿真器MAX+plusⅡ\Simulator進(jìn)行仿真。在仿真結(jié)束后打開仿真波形文件(點(diǎn)擊右下角的OpenSCF按鈕)即可以顯示仿真結(jié)果。(4)如何進(jìn)行芯片的時(shí)序分析a.選擇要下載的器件型號(hào);點(diǎn)擊主菜單的Assign/Device項(xiàng)得到Device對(duì)話框。在DeviceFamily框中選擇芯片系列,在Devices選擇框下選擇具體的芯片名,最后點(diǎn)擊OK按鈕。b.再編譯一次;c.打開時(shí)序分析器(TimingAnalyzer);d.點(diǎn)擊Start進(jìn)行時(shí)序分析。(5)如何安排芯片腳位a.打開芯片腳位設(shè)置窗口;點(diǎn)擊主菜單Assign/Pin/Location/Chip,出現(xiàn)腳位設(shè)置對(duì)話框;

;b.將實(shí)體定義的端口名字和下載芯片的管腳進(jìn)行具體對(duì)應(yīng);在NodeName框中輸入我們定義的實(shí)體端口名字,然后在Pin列表選項(xiàng)框中輸入下載芯片的管腳序號(hào),再點(diǎn)擊對(duì)話框右下角的Add按鈕,將所有端口設(shè)置完成以后,點(diǎn)擊Ok按鈕,則實(shí)現(xiàn)實(shí)體端口和下載芯片的管腳的對(duì)應(yīng);

c.再編譯一次,將生成可以下載的文件(And2.Sof)。(6)如何下載程序至芯片a.將下載電纜與計(jì)算機(jī)并口相連,然后給芯片通電;b.打開編程器Programmer

;

Options/HardwareSetup,在HardwareType選擇ByteBlaster(MV)方式,則在ParallelPort處顯示LPT1,單擊OK鈕返回Programmer窗口。

c.下載方式選擇;d.選擇下載的芯片類型和要下載的文件(選擇JTAG/MutiDevicJTAGChainSetup)。e.點(diǎn)擊Configure進(jìn)行下載,將程序?qū)懭胄酒小5诙?/p>

數(shù)據(jù)類型與數(shù)據(jù)對(duì)象的定義2-1數(shù)據(jù)類型2-2數(shù)據(jù)對(duì)象的定義2-3信號(hào)運(yùn)算符2-4信號(hào)屬性2-1數(shù)據(jù)類型在VHDL程序中,我們經(jīng)常會(huì)遇到這樣的語句:SignalA:std_logic;VariableB:std_logic_vector(7downto0);ConstantC:integer;數(shù)據(jù)對(duì)象類型數(shù)據(jù)類型數(shù)據(jù)對(duì)象名

2-1-1邏輯數(shù)據(jù)類型

(1)布爾代數(shù)(Boolean)型;(2)位(Bit);(3)位數(shù)組類型(Bit_Vector)在std庫的standard程序包中進(jìn)行定義。typeBIT_VECTORisarray(NATURALrange<>)ofBIT;typeBITis(‘0’,‘1’);typeBOOLEANis(FALSE,TRUE);

(4)標(biāo)準(zhǔn)邏輯型(Std_Logic);

TypeSTD_LOGICis(‘U’,

--Uninialized;未初始化

‘X’,

--Forcingunknown;浮接不定

‘0’,

--Forcing0;低電位

‘1’,

--Forcing1;高電位

‘Z’,

--HighImpedance;高阻抗

‘W’,

--WeakUnknown;弱浮接

‘L’,

--Weak0;弱低電位

‘H’,

--Weak1;弱高電位

‘-’,

--Don’tcare;不必理會(huì)

);(5)標(biāo)準(zhǔn)邏輯數(shù)組類型(Std_Logic_vector);在ieee庫的std_logic_1164程序包中定義。TYPEstd_logic_vectorISARRAY(NATURALRANGE<>)OFstd_logic;

2-1-2數(shù)值數(shù)據(jù)類型(1)整數(shù)(Integer);

a.正整數(shù)(POSITIVE)

b.自然數(shù)(NATURAL)在std庫的standard程序包中進(jìn)行定義。subtypePOSITIVEisrange1toINTEGER’High;TypeINTEGERisrange–2147483648to2147483647;subtypeNATURALisrange0toINTEGER’High;(2)實(shí)數(shù)(Real)(3)有符號(hào)數(shù)(Signed)無符號(hào)數(shù)(Unsigned)在ieee庫的std_logic_arith程序包中定義。typeREALisrange–1.7E38to1.7E38;typeUNSIGNEDisarray(NATURALrange<>)ofSTD_LOGIC;typeSIGNEDisarray(NATURALrange<>)ofSTD_LOGIC;SIGNED

的最高位為符號(hào)位,其余位為數(shù)值位,數(shù)值位為補(bǔ)碼形式。如:符號(hào)數(shù)”1001”表示-7。libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;entitydataisport(a,b:inunsigned(3downto0);--a,b:insigned(3downto0);c:outstd_logic);enddata;architecturem1ofdataisbeginc<='1'whena<belse'0';endm1;當(dāng)定義成無符號(hào)類型時(shí),若a<=”1000”,b=’0001’,即a=8,b=1則結(jié)果c=’0’;當(dāng)定義成有符號(hào)類型時(shí),若a<=”1000”,b=’0001’,則a=-8,b=1,則結(jié)果c=’1’。

2-1-3列舉和數(shù)組數(shù)據(jù)類型

(1)列舉數(shù)據(jù)類型(EnumeratedTypes)定義格式:Type列舉名稱is(元素1,元素2,…);(2)數(shù)組數(shù)據(jù)類型(ArrayTypes)定義格式:Type數(shù)組名稱isArray(range<>)of數(shù)據(jù)類型;2-1-4數(shù)據(jù)類型的轉(zhuǎn)換

在VHDL語言里,不同類型的數(shù)據(jù)信號(hào)之間不能互相賦值。當(dāng)需要不同類型數(shù)據(jù)之間傳遞信息時(shí),就需要類型轉(zhuǎn)換函數(shù)將其中的一種類型數(shù)據(jù)轉(zhuǎn)換為另一中數(shù)據(jù)類型后,再進(jìn)行信號(hào)的傳遞。例如:SignalY:Std_logic_vector(7downto0);

SignalX:Integerrange0to255;Y<=CONV_STD_LOGIC_VECTOR(X,8);轉(zhuǎn)換函數(shù)有兩個(gè)參數(shù),被轉(zhuǎn)換的對(duì)象和轉(zhuǎn)換后的位數(shù)。

常用的數(shù)據(jù)類型轉(zhuǎn)換函數(shù)CONV_INTEGER

將數(shù)據(jù)類型UNSIGNED,SIGNED轉(zhuǎn)換為INTEGER類型.

CONV_UNSIGNED

將數(shù)據(jù)類型INTEGER,SIGNED轉(zhuǎn)換為UNSIGNED類型.CONV_SIGNED

將數(shù)據(jù)類型INTEGER,UNSIGNED轉(zhuǎn)換為SIGNED類型. CONV_STD_LOGIC_VECTOR

將數(shù)據(jù)類型INTEGER,UNSIGNED,SIGNED,STD_LOGIC轉(zhuǎn)換為STD_LOGIC_VECTOR類型.在庫ieee的程序包std_logic_arith中定義2-2

數(shù)據(jù)對(duì)象的定義常用的數(shù)據(jù)對(duì)象有三種:常數(shù)(Constant)信號(hào)(Signal)變量(Variable)

2-2-1常數(shù)的定義(1)將數(shù)據(jù)對(duì)象定義為常數(shù),一方面希望該數(shù)據(jù)對(duì)象的值不會(huì)被改變;另一方面,為了提高程序的可讀性。(2)常數(shù)為全局量。(3)常數(shù)在程序包說明、實(shí)體說明、結(jié)構(gòu)體描述、過程說明、函數(shù)調(diào)用中使用。(4)常數(shù)的定義格式:

Constant

常數(shù)名:數(shù)據(jù)類型:=常數(shù)值;

如:ConstantD1:Integer:=3;注意!常數(shù)定義的同時(shí)進(jìn)行賦初值。常數(shù)的應(yīng)用示例libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;--必需定義+entityexam1is

port(ip:instd_logic_vector(3downto0);op:outstd_logic_vector(3downto0));endexam1;architecturem1ofexam1isconstantnum:integer:=6;beginop<=ip+num;endm1;2-2-2信號(hào)的定義(1)“信號(hào)”數(shù)據(jù)對(duì)象,代表電路內(nèi)部信號(hào)或連接線路,其在元件之間起互連作用。注意!信號(hào)定義的時(shí)候盡管可以直接賦初值,但系統(tǒng)往往忽略。建議信號(hào)對(duì)象定義后再進(jìn)行賦值。(2)信號(hào)為全局量。(3)在實(shí)體說明、結(jié)構(gòu)體描述和程序包說明中使用。(4)信號(hào)的定義格式:Signal信號(hào)名:數(shù)據(jù)類型;(5)信號(hào)賦值的語法格式為:信號(hào)名<=表達(dá)式;如:SignalS1:Std_logic_vector(3Downto0);S1<=“0000”;2-2-3變量的定義(1)“變量”數(shù)據(jù)對(duì)象,它用于對(duì)中間數(shù)據(jù)的臨時(shí)存儲(chǔ),并不一定代表電路的某一組件。注意!變量定義的時(shí)候盡管可以直接賦初值,但系統(tǒng)往往忽略。建議變量對(duì)象定義后再進(jìn)行賦值。(2)變量為局部量。(3)僅限于進(jìn)程(Process)或子程序中使用。(4)變量的定義格式:Variable變量名:數(shù)據(jù)類型;

(5)變量賦值的語法格式為:目標(biāo)信號(hào)值:=表達(dá)式;如:VariableS1:Std_logic_vector(3Downto0);S1:=“0000”;libraryieee;useieee.std_logic_1164.all;entitybcvisport(a,b,c:instd_logic;x,y:outstd_logic);endbcv;architecturem2ofbcvisbeginprocess(a,b,c)variabled:std_logic;begin

d:=a;x<=cxord;

d:=b;y<=cxord;endprocess;endm2;ABCXY例一結(jié)果:x<=cxorb,y<=cxorbx<=cxora,y<=cxorbarchitecturem1ofbcvissignald:std_logic;beginprocess(a,b,c)begin

d<=a;

--ignoredx<=cxord;

d<=b;y<=cxord;endprocess;endm1;libraryieee;useieee.std_logic_1164.all;Entitycmpisport(cp,ip:instd_logic;--cp為時(shí)鐘脈沖

op,oq:outstd_logic);--ip為輸入信號(hào)endcmp;Architecturem1ofcmpissignald:std_logic;beginprocess(cp)variablee:std_logic;beginifcp'eventandcp='1'thend<=ip;op<=d;e:=ip;oq<=e;endif;endprocess;endm1;例二D觸發(fā)器在進(jìn)程中,信號(hào)賦值只有在過程結(jié)束時(shí)起作用,而變量賦值是立即進(jìn)行的。2-2-4信號(hào)和變量的比較

(1)信號(hào)和變量的對(duì)應(yīng)關(guān)系不同:信號(hào)代表電路內(nèi)部信號(hào)或連接線路;而變量則不是。

(2)信號(hào)和變量聲明的位置不同:信號(hào)聲明在子程序、進(jìn)程的外部;而變量聲明在子程序、進(jìn)程的內(nèi)部。

(3)信號(hào)為全局量,而變量只在定義它的域中才可見。因此,變量不能在兩個(gè)進(jìn)程之間傳遞信息。

(4)在一個(gè)進(jìn)程中多次為一個(gè)信號(hào)賦值時(shí),只有最后一個(gè)值會(huì)起作用;而變量則不同,每次賦值都會(huì)改變它的值。(5)賦值不同。在進(jìn)程中,信號(hào)賦值只有在進(jìn)程結(jié)束時(shí)起作用,而變量賦值是立即進(jìn)行的。而且賦值符號(hào)不同:信號(hào)賦值為“<=”,變量賦值為“:=”。Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;一位BCD碼的加法器Entitybcdadder

is

Port(a,b:instd_logic_vector(3downto0);result:outstd_logic_vector(4downto0));Endbcdadder;ArchitectureNaofbcdadder

is

constantadjnum:integer:=6;--常數(shù)定義signalbinadd:std_logic_vector(4downto0);--信號(hào)

Beginbinadd<=a+b;--兩數(shù)相加process(binadd)--對(duì)兩數(shù)和進(jìn)行處理variabletmp:integerrange0to6;--變量定義beginifbinadd>9thentmp:=adjnum;elsetmp:=0;endif;result<=binadd+tmp;endprocess;EndNa;

2-3信號(hào)運(yùn)算符

VHDL提供了四種類型運(yùn)算符號(hào):邏輯運(yùn)算符關(guān)系運(yùn)算符算術(shù)運(yùn)算符連接運(yùn)算符VHDL運(yùn)算符——邏輯運(yùn)算符

and

邏輯與

or

邏輯或

nand

與非

nor

或非

xor

異或

xnor

同或

not

邏輯非上述邏輯運(yùn)算在庫ieee的程序包std_logic_1164中定義。

VHDL運(yùn)算符——關(guān)系運(yùn)算符

= 等于

/= 不等于

< 小于

<= 小于或等于

> 大于

>= 大于或等于

注:其中‘<=’操作符也用于表示信號(hào)的賦值操作。上述運(yùn)算在庫ieee的程序包std_logic_arith中定義。VHDL運(yùn)算符——算術(shù)運(yùn)算符

+ 加

- 減

* 乘

/ 除

** 乘方

mod 求模

rem

求余

abs 求絕對(duì)值

在庫ieee的程序包std_logic_arith中定義。

VHDL運(yùn)算符——連接運(yùn)算符

&

連接符,將兩個(gè)數(shù)據(jù)對(duì)象或矢量連接成維數(shù)更大的矢量,它可給代碼書寫帶來方便。例如:vabc=a&b&c;如果a=‘1’,b=‘0’,c=‘1’,則vabc=“101”。(1)數(shù)值類屬性:(數(shù)組類型的數(shù)據(jù)對(duì)象)數(shù)值類屬性有‘left,‘right,‘low,‘high,‘length。其中用符號(hào)“‘”隔開對(duì)象名及其屬性。

left表示數(shù)組的左邊界;

right表示數(shù)組的右邊界;

low表示數(shù)組的下邊界;

high表示數(shù)組的上邊界;

length表示數(shù)組的長度。2-4數(shù)據(jù)對(duì)象屬性如:SignalA:std_logic_vector(7downto0);SignalB:std_logic_vector(0to3);則這兩個(gè)信號(hào)的屬性值分別為:

A’left=7;A’right=0;A’low=0;A’high=7;A’length=8;B’left=0;B’right=3;B’low=0;B’high=3;B’length=4;left表示數(shù)組的左邊界;

right表示數(shù)組的右邊界;

low表示數(shù)組的下邊界;

high表示數(shù)組的上邊界;

length表示數(shù)組的長度。(2)‘event屬性:‘event屬性,它的值為布爾型,如果剛好有事件發(fā)生在該屬性所附著的信號(hào)上(即信號(hào)有變化),則其取值為Ture,否則為False。利用此屬性可決定時(shí)鐘信號(hào)的變化情況,即時(shí)鐘是否發(fā)生。

2-4數(shù)據(jù)對(duì)象屬性(2)‘Event屬性:例如:時(shí)鐘邊沿表示

signalclk:in

std_logic;

則clk’event

andclk=’1’表示時(shí)鐘的上升沿。即時(shí)鐘變化了,且其值為1。

clk’eventandclk=’0’表示時(shí)鐘的下降沿。即時(shí)鐘變化了,且其值為0。此外,還可利用兩個(gè)函數(shù)來表示時(shí)鐘的邊沿。 rising_edge(clk)表示時(shí)鐘的上升沿

falling_edge(clk)表示時(shí)鐘的下降沿這兩個(gè)函數(shù)分別在庫ieee的程序包Std_logic_1164中定義。2-4數(shù)據(jù)對(duì)象屬性

并行語句一般處于進(jìn)程(PROCESS)的外部。所有并行語句都是并行執(zhí)行的,即與它們出現(xiàn)的先后次序無關(guān)。并行語句有三個(gè)特點(diǎn):a.所有語句的執(zhí)行是并行的;b.每條語句的執(zhí)行和其所在的位置無關(guān);c.并行語句的輸出僅僅依賴于輸入,沒有其它的限制條件。第三章

并行賦值語句

第三章

并行賦值語句(1)直接賦值語句:<=賦值運(yùn)算符(2)條件式信號(hào)設(shè)置語句:When-Else(3)選擇式信號(hào)設(shè)置語句:With-Select-When(4)Process(進(jìn)程)語句(5)Block(塊)語句(6)函數(shù)調(diào)用語句(后面章節(jié)講)(7)Component(元件)例化語句(8)For-Generate語句Generic的使用(1)直接賦值語句:<=直接賦值語句的格式:Signal_name<=expression;如:SignalA,B:std_logic_vector(7downto0);A<=”0000000”;B<=”1000000”;我們也可以這樣賦值:A<=(others=>’0’);結(jié)果信號(hào)A的每一位的值都為0。B<=(‘1’,others=>’0’);信號(hào)對(duì)象的位數(shù)很多時(shí),采用others來賦值很方便。<=示例libraryieee;useieee.std_logic_1164.all;Entitytest1IsPort(a,b:instd_logic;c,d:outstd_logic);endtest1;architecturetest1_bodyoftest1isbegin

同時(shí)執(zhí)行d<=aorb;

c<=aandb;endtest1_body;輸出僅僅依賴于輸入,沒有其它的限制條件。

每條語句的執(zhí)行和其所在的位置無關(guān)。

ABCD(2)When-Else條件式信號(hào)設(shè)置語句它的語法格式為:[label:]Signal_name<=expression1Whenlogic_expression1Else{expression2Whenlogic_expression2Else}expressionn;

例如:f<=’1’whenx1=x2else‘0’;When-Else語句示例Libraryieee;Useieee.std_logic_1164.all;Entityxor2isPort(x,y:instd_logic;z:outstd_logic);Endxor2;Architectureaofxor2isBeginz<='1'when(x='0'andy='1')else'1'when(x='1'andy='0')else'0';Enda;ZXY(3)With-Select-When選擇式信號(hào)設(shè)置語句[label:]WithexpressionSelectSignal_name<=expressionWhenconstant_value{,{expressionWhenconstant_value};With-Select-When示例Libraryieee;Useieee.std_logic_1164.all;Entityxor2isPort(x,y:instd_logic;z:outstd_logic);Endxor2;Architectureaofxor2issignaltmp:std_logic_vector(1downto0);Begintmp<=x&y;Withtmp

Selectz<=‘1’when“01”,--注意結(jié)束為“,”不是“;”'1'when"10",'0'whenothers;Enda;ZXYWhen-else和With-select-When語句的區(qū)別

(1)With-select-When語句中When后的constant_value必須是互不相同的;(2)而When-else語句中When后的logic_expression則不需要這樣的嚴(yán)格條件;(3)When-else語句中When后的logic_expression的優(yōu)先權(quán)次序?yàn)橛上鹊胶笈帕?。?yōu)先編碼器示例Libraryieee;Useieee.std_logic_1164.all;EntitypriorityisPort(r1,r2,r3:instd_logic;f:outstd_logic_vector(1downto0));Endpriority;ArchitectureaofpriorityisBeginf<=‘01'when(r1='1')else'10'when(r2='1')else'11'when(r3='1')else'00';Enda;Ifr1=’1’,f=”01”;Ifr2=’1’andr1/=’1’,f=”10”;Ifr3=’1’andr1/=’1’andr2/=’1’,

f=”11”;如果三個(gè)輸入都為0,f=”00”。r1r3r2f(4)Process語句(1)一個(gè)結(jié)構(gòu)體當(dāng)中可以有多個(gè)Process語句,Process語句是同時(shí)執(zhí)行的并行語句。(2)Process內(nèi)的語句卻是順序執(zhí)行的順序語句。(3)多進(jìn)程之間的信息通過信號(hào)對(duì)象來傳遞。Process語句的格式為:[Processlabel:]Process[(Sensitivitylist)][Variabledeclarations]Begin順序語句;EndProcess[Processlabel];

(4)Process語句

敏感表(Sensitivitylist)包括進(jìn)程的一些信號(hào),當(dāng)敏感表中的某個(gè)信號(hào)變化時(shí)進(jìn)程才被激活,進(jìn)程內(nèi)的順序語句被執(zhí)行。當(dāng)進(jìn)程結(jié)束時(shí),進(jìn)程內(nèi)的輸出信號(hào)值被更新,進(jìn)程進(jìn)入等待(睡眠)狀態(tài),直到敏感表中的某一信號(hào)發(fā)生變化,進(jìn)程被再次激活。對(duì)于上述電路,我們同樣可以采用Process語句來進(jìn)行描述。Process語句示例architecturem2ofexam1isSignaltmp:std_logic;beginprocessbegintmp<=aandb;endprocess;d<=tmp;processbegine<=tmp

orc;endprocess;endm2;ABDCE(5)Block(塊)語句

當(dāng)我們?cè)O(shè)計(jì)一個(gè)比較復(fù)雜的電路時(shí),為了使設(shè)計(jì)簡(jiǎn)單化,可以將其分為幾個(gè)部分分別進(jìn)行設(shè)計(jì),每個(gè)部分設(shè)計(jì)完成后,再將其組合成我們需要的電路。這種方法稱為模塊化設(shè)計(jì)方法。這樣,使得整個(gè)設(shè)計(jì)工作更加容易實(shí)現(xiàn),同時(shí)程序代碼的維護(hù)性、糾錯(cuò)性都能得到提高。采用模塊化設(shè)計(jì)時(shí),當(dāng)設(shè)計(jì)一個(gè)模塊時(shí),我們就要用到Block語句。

語法格式:BlockLabel:Block[數(shù)據(jù)對(duì)象定義部分]Begin<BlockStatementPart>EndBlock;(5)Block(塊)語句

libraryieee;useieee.std_logic_1164.all;entityexam1isport(a,b,c:instd_logic;d,e:outstd_logic);endexam1;architecturem1ofexam1isbeginBlock_1:BlockBegind<=aandb;endblock;Block_2:BlockBegine<=(aandb)orc;endblock;endm1;ABDCEBlock語句示例Component(元件)例化語句

(1)Block語句可以使VHDL程序更加模塊化、功能化。但這樣的做法要求在同一程序中,若是重復(fù)使用時(shí),必須重寫一次。Block語句解決了這樣的重復(fù)編寫問題。(2)元件也是完整的VHDL設(shè)計(jì),作為底層設(shè)計(jì),通過元件聲明,使之可在其他模塊中被調(diào)用。(3)元件聲明可放在程序包中,也可在某個(gè)設(shè)計(jì)的結(jié)構(gòu)體中聲明。

語法格式:Component元件名Port(端口定義);--同元件實(shí)現(xiàn)時(shí)的實(shí)體的port部分EndComponent;元件例化指元件的調(diào)用,它的語法格式為:Label:

元件名

PortMap(端口映射);Component(元件)例化語句

元件例化時(shí)端口映射或關(guān)聯(lián)有兩種方式:a.位置對(duì)應(yīng)方式直接由輸入信號(hào)和元件信號(hào)的對(duì)應(yīng)位置進(jìn)行映射。即:元件標(biāo)號(hào):元件名

PortMap(信號(hào)A1,信號(hào)B1,…);b.名字直接對(duì)應(yīng)我們使用=>映射符號(hào)進(jìn)行輸入信號(hào)和元件信號(hào)之間的映射,那么位置可以不對(duì)應(yīng)。即:

元件標(biāo)號(hào):元件名

PortMap(元件信號(hào)A=>信號(hào)A1,元件信號(hào)B=>信號(hào)B1,…);

注意!元件標(biāo)號(hào)是必需的。Component例化語句

Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;EntityfulladderisPort(Ci:instd_logic;a,b:instd_logic;s:outstd_logic;Co:outstd_logic);Endfulladder;Architecturem1offulladderisSignaltmp:std_logic_vector(1downto0);Begintmp<=('0'&a)+b+ci;s<=tmp(0);co<=tmp(1);Endm1;一位全加器

CibasCoLibraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;EntityadderisPort(Cin:instd_logic;x,y:instd_logic_vector(3downto0);sum:outstd_logic_vector(3downto0);Cout:outstd_logic);Endadder;四位加法器ArchitectureaofadderisSignalc:std_logic_vector(0to4);ComponentfulladderPort(ci,a,b:instd_logic;s,co:outstd_logic);endcomponent;Beginc(0)<=cin;U1:fulladderPortmap(c(0),x(0),y(0),sum(0),c(1));--U1:fulladderPortmap(ci=>c(0),a=>x(0),b=>y(0),s=>sum(0),co=>c(1));U2:fulladderPortmap(c(1),x(1),y(1),sum(1),c(2));U3:fulladderPortmap(c(2),x(2),y(2),sum(2),c(3));U4:fulladderPortmap(c(3),x(3),y(3),sum(3),c(4));Cout<=c(4);Enda;Component例化示例

For-Generate語句For-Generate語句用于生成一組信號(hào)賦值或元件例化語句。語法格式:generate_label:

--必須的forindex_variableInrangegenerate

statement;[statement;]endgenerate;則上面的四位加法器可以這樣來實(shí)現(xiàn):其它相同,上面四條賦值語句可以這樣來代替:Generate_label:ForiIn0to3GenerateBitadder:fulladder

Portmap(c(i),x(i),y(i),sum(i),c(i+1));Endgenerate;For-Generate語句Generic語句

通過引入一個(gè)參數(shù)n使得我們?cè)O(shè)計(jì)的加法器更加具有通用性,參數(shù)n代表加法器中相加的位數(shù),在VHDL中,這樣的參數(shù)稱為Generic(類屬)。

通常定義在實(shí)體描述和元件聲明中。

定義格式:Generic(參數(shù)名:數(shù)據(jù)類型[:=表達(dá)式]);例如:Generic(m:integer:=7);Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;EntityadderisGeneric(n:integer:=4);Port(Cin:instd_logic;x,y:instd_logic_vector(n-1downto0);sum:outstd_logic_vector(n-1downto0);Cout:outstd_logic);Endadder;Generic語句示例—N位全加器ArchitectureaofadderisSignalc:std_logic_vector(0ton);ComponentfulladderPort(ci,a,b:instd_logic;s,co:outstd_logic);Endcomponent;Beginc(0)<=cin;Generate_label:ForiIn0ton-1GenerateBitadder:fulladderPortmap(c(i),x(i),y(i),sum(i),c(i+1));Endgenerate;Cout<=c(n);Enda;Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;EntitynadderisPort(Cin1:instd_logic;x1,y1:instd_logic_vector(7downto0);Sum1:outstd_logic_vector(7downto0);Cout1:outstd_logic);Endnadder;帶Generic的元件例化—N位全加器ArchitectureaofnadderisComponentadderGeneric(n:integer);--也可在此進(jìn)行影射Generic(n:integer:=8);Port(cin:instd_logic;x,y:instd_logic_vector(n-1downto0);sum:outstd_logic_vector(n-1downto0);cout:outstd_logic);endcomponent;BeginNadder:adderGenericmap(n=>8)Portmap(cin1,x1,y1,sum1,cout1);Enda;

--若元件聲明時(shí)已經(jīng)賦值,則Nadder:adderPortmap(cin1,x1,y1,sum1,cout1);Genericmap(8)

(1)順序語句每一條語句的執(zhí)行都是順序進(jìn)行的。如同高級(jí)編程語言中的命令執(zhí)行方式,一次一條命令,按書寫順序由上而下執(zhí)行。(2)順序語句只能出現(xiàn)在進(jìn)程和子程序內(nèi)部。(3)由于順序語句的次序很重要,因此,順序語句要與并行語句分割開,這可以通過Process語句來實(shí)現(xiàn)。Process語句出現(xiàn)在結(jié)構(gòu)體中,它將其內(nèi)部的語句進(jìn)行封裝。第四章順序賦值語句

順序語句有三個(gè)特點(diǎn):

a.所有語句的執(zhí)行是順序進(jìn)行的;

b.每條語句的執(zhí)行和其所在的位置有關(guān);

c.順序語句的輸出不僅依賴于輸入,而且還受位置的影響。第四章順序語句(1)Process語句

(2)If-Else語句

(3)Case-When語句

(4)Null語句

(5)For-Loop語句

(6)Waituntil語句

(7)變量賦值語句

(8)Procedure(過程)調(diào)用語句

(1)Process語句Process內(nèi)的順序語句可以是:[Process-label:]Process[(Sensitivitylist)][Variabledeclarations]--變量聲明Begin[waituntilstatement][variableassignmentstatements][ifstatements][casestatements][Procedure調(diào)用語句

]EndProcess;(2)If-Else語句Ifexpression1Then

statement1;[statement;][Elsif

expression2Then

statement2;{statement;}Else

statement3;[statement;]]Endif;語法格式:If-Else語句示例例如:IfSel=“01”thenf<=x1;elsif

Sel=“10”thenf<=x2;elsef<=x3;Endif;“IF”語句可嵌套使用,即在一個(gè)IF語句中可再調(diào)用另一個(gè)“IF”語句。注意!必需在Process語句中。

(3)Case-When語句CaseexpressionIsWhenconstant-value1=>

statement1;{statement;}Whenconstant_value2=>

statement2;{statement;]Whenothers=>

statement3;{statement;}Endcase;語法格式:Case-When語句示例CaseSelIsWhen“00”=>f<=x1;When“01”=>f<=x2;When“10”=>f<=x3;Whenothers=>f<=x4;endcase;

以上是四路信號(hào)選擇器。

(4)Null語句

一般類似Case-when的語句,通常會(huì)全部列出每個(gè)可能出現(xiàn)的選擇信號(hào)值,這樣后面必須配合有命令語句。不過實(shí)際上有些情況,是不做任何處理的,這時(shí)就可以將Null語句用上。如:

Casesiswhen2|3|4=>--s=2ors=3ors=4P<=d0;when7=>P<=d1;whenothers=>

null;Endcase;(5)For-Loop語句For-Loop為循環(huán)語句,可以使其所包含的順序語句被循環(huán)執(zhí)行,它類似于并行語句中For-generate生成語句。語法格式為:[loop_label:]Forvariable_nameInrangeLoopStatement;{Statement;}EndLoop;Libraryieee;Useieee.std_logic_1164.all;Entitylpisgeneric(n:integer:=8);Port(din:instd_logic_vector(1ton);Count:outintegerrange0ton);Endlp;Architecturem1oflpisBeginprocess(din)variabletmp:integerrange0ton;begintmp:=0;forjin1tonloopifdin(j)='1'thentmp:=tmp+1;endif;endloop;count<=tmp;endprocess;endm1;統(tǒng)計(jì)一個(gè)多位信號(hào)中1的個(gè)數(shù)

(6)Waituntil語句

語法格式:Waituntil條件式;Libraryieee;Useieee.std_logic_1164.all;EntitywtisPort(clk,D:instd_logic;Q:outstd_logic);Endwt;Architecturem1ofwtisbeginprocessbeginwaituntilclk='1';Q<=D;endprocess;endm1;Architecturem2ofwtisbeginprocess(clk)beginifclk'eventandclk='1'thenQ<=D;endif;endprocess;endm2;(7)變量賦值語句

由于變量賦值是立即起作用的,所以在進(jìn)程中變量賦值是順序語句。例如:Processvariablea,b:integer;begina:=30;b:=40;a:=b;b:=a;endprocess;由于變量的賦值是順序進(jìn)行的,所以運(yùn)行結(jié)果是a=b=40。

(8)Procedure調(diào)用語句

語法格式:Procedure過程名(輸入輸出參數(shù)表)IS[變量定義語句;]Begin順序語句;End過程名;

Libraryieee;Useieee.std_logic_1164.all;EntitypdisPort(D1:instd_logic;D2:instd_logic;Do:outstd_logic);Endpd;Architectureaofpdisbeginprocessprocedureand2(a,b:instd_logic;y:outstd_logic)isbeginy:=aandb;endand2;variabletmp:std_logic;beginlabel0:and2(a=>d1,b=>d2,y=>tmp);do<=tmp;endprocess;Enda;二位與的過程

第五章

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

任一時(shí)刻的輸出僅僅取決于當(dāng)時(shí)的輸入,與電路原來的狀態(tài)無關(guān),這樣的數(shù)字電路叫做組合邏輯電路。

5-1常用組合邏輯電路設(shè)計(jì)

(1)編碼器(2)譯碼器(3)比較器(4)數(shù)據(jù)選擇器(5)三態(tài)輸出電路

(1)編碼器A6A7A5A4A3A2A1A0Y2Y1Y08×3編碼器ENA7A6A5A4A3A2A1A0Y2Y1Y00000000100000000010001000001000100000100001100010000100001000001010100000011010000000111libraryieee;useieee.std_logic_1164.all;entitybmqisport(A:instd_logic_vector(7downto0);En:instd_logic;Y:outstd_logic_vector(2downto0));endbmq;architecturem1ofbmqissignalsel:std_logic_vector(8downto0);beginProcess(En,A)BeginIfEn='1'thenifA="00000001"thenY<="000";elsifA="00000010"thenY<="001";elsifA="00000100"thenY<="010";elsifA="00001000"thenY<="011";elsifA="00010000"thenY<="100";elsifA="00100000"thenY<="101";elsifA="01000000"thenY<="110";elseY<="111";endif;ElseY<="000";endif;endprocess;endm1;libraryieee;useieee.std_logic_1164.all;entitybmqisport(A:instd_logic_vector(7downto0);En:instd_logic;Y:outstd_logic_vector(2downto0));endbmq;architecturem1ofbmqissignalsel:std_logic_vector(8downto0);beginsel<=En&A;withselselectY<="000"when"100000001","001"when"100000010","010"when"100000100","011"when"100001000","100"when"100010000","101"when"100100000","110"when"101000000","111"when"110000000","000"whenothers;endm1;(2)譯碼器3×8譯碼器A6A7A5A4A3A2A1A0Y2Y1Y0ENa.3×8譯碼器libraryieee;useieee.std_logic_1164.all;entityymqisport(Y:instd_logic_vector(2downto0);EN:instd_logic;A:outstd_logic_vector(7downto0));endymq;architecturem1ofymqissignalsel:std_logic_vector(3downto0);beginsel<=En&Y;withselselectA<="00000001"when"1000","00000010"when"1001","00000100"when"1010","00001000"when"1011","00010000"when"1100","00100000"when"1101","01000000"when"1110","10000000"when"1111","11111111"whenothers;endm1;下面的程序設(shè)計(jì)為:四位二進(jìn)制->BCD碼,然后將BCD碼->七段顯示器碼。(1)當(dāng)輸入為0~9的數(shù)時(shí),其十位數(shù)為0,個(gè)位數(shù)=輸入。當(dāng)輸入為10~15的數(shù)時(shí),其十位數(shù)為1,個(gè)位數(shù)=輸入-10。(2)然后將十位和個(gè)位的BCD碼轉(zhuǎn)換為七段顯示器碼。

(2)譯碼器b.碼制轉(zhuǎn)換

注:數(shù)碼管為共陰極數(shù)碼管。Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;EntitybcdisPort(A:instd_logic_vector(3downto0);bcd0,bcd1:outstd_logic_vector(3downto0);seven0,seven1:outstd_logic_vector(6downto0));Endbcd;Architectureaofbcdissignaltmp:std_logic_vector(3downto0);Beginprocess(A)--二進(jìn)制轉(zhuǎn)換為十進(jìn)制beginifA<10thenbcd1<="0000";bcd0<=A;seven1<=“0111111”;--十位數(shù)顯示0tmp<=A;elsebcd1<="0001";bcd0<=A-10;seven1<=“0000110”;--十位數(shù)顯示1

溫馨提示

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

評(píng)論

0/150

提交評(píng)論