VHDL與數字電路設計課件_第1頁
VHDL與數字電路設計課件_第2頁
VHDL與數字電路設計課件_第3頁
VHDL與數字電路設計課件_第4頁
VHDL與數字電路設計課件_第5頁
已閱讀5頁,還剩269頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

VHDL的程序結構和軟件操作

1-1VHDL程序的基本結構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程序的基本結構(1)LIBRARY和PACHAGE聲明區;(2)ENTITY定義區;(3)ARCHITECTURE定義區;(4)CONFIGURATION定義區。Library(庫)是用于存放預先編譯好的Package(程序包)。Package(程序包)中定義了基本的常數,數據類型,元件及子程序等。

作用:聲明在實體和結構體定義中將用到的數據類型、元件或子程序等。聲明格式:

Library

庫名;

Use

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

作用:

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

實體名

is

Port(a:

inbit;

b:inbit;

c:outbit);End

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

IN;OUT;INOUT;BUFFER

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

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

定義了實體的實現。即電路的具體描述,說明電路執行什么動作或實現功能。定義格式:

Architecture結構體名

of實體名

is

[聲明語句;(內部信號、變量、常數,元件,子程序聲明)]Begin并行描述語句;End

結構體名;(4)CONFIGURATION定義區

一個完整VHDL電路設計必須有一個實體和對應的結構體,即實體和結構體對構成一個完整的VHDL設計。一個實體可對應一個結構體或多個結構體,即一個實體可以有不同的描述方式。作用:當實體有多個結構體時,系統默認實體選用最后一個結構體,利用CONFIGURATION語句可以任意選擇采用哪一個結構體。

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

of實體名

isfor選用的結構體名endfor;endconfiguration配置名;二輸入與門電路設計范例

abc電路真值表abc000100010111二輸入與門電路設計范例Librarystd;Usestd.standard.all;Entityand2is

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

雙減號--為VHDL程序的注釋符,類似C語言中的//注釋符。二輸入與門電路設計范例ArchitectureNaofand2isBegin

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

EndNa;--結構體NaArchitectureNbofand2is

Beginc<=aandb;--and

為邏輯與操作EndNb;

--結構體Nb二輸入與門電路設計范例Configurations1ofand2isfornaendfor;endconfigurations1;--結構體配置結束。1-2Max+plusⅡ系統的操作

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

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

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

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

File/Project/SetProjecttoCurrentFile,c.打開編譯器;點擊主菜單MAX+plusⅡ/Compiler選項。

d.選定VHDL源文件的版本

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

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

;b.將實體定義的端口名字和下載芯片的管腳進行具體對應;在NodeName框中輸入我們定義的實體端口名字,然后在Pin列表選項框中輸入下載芯片的管腳序號,再點擊對話框右下角的Add按鈕,將所有端口設置完成以后,點擊Ok按鈕,則實現實體端口和下載芯片的管腳的對應;

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

;

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

c.下載方式選擇;d.選擇下載的芯片類型和要下載的文件(選擇JTAG/MutiDevicJTAGChainSetup)。e.點擊Configure進行下載,將程序寫入芯片中。第二章

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

2-1-1邏輯數據類型

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

(4)標準邏輯型(Std_Logic);

TypeSTD_LOGICis(‘U’,

--Uninialized;未初始化

‘X’,

--Forcingunknown;浮接不定

‘0’,

--Forcing0;低電位

‘1’,

--Forcing1;高電位

‘Z’,

--HighImpedance;高阻抗

‘W’,

--WeakUnknown;弱浮接

‘L’,

--Weak0;弱低電位

‘H’,

--Weak1;弱高電位

‘-’,

--Don’tcare;不必理會

);(5)標準邏輯數組類型(Std_Logic_vector);在ieee庫的std_logic_1164程序包中定義。TYPEstd_logic_vectorISARRAY(NATURALRANGE<>)OFstd_logic;

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

a.正整數(POSITIVE)

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

的最高位為符號位,其余位為數值位,數值位為補碼形式。如:符號數”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;當定義成無符號類型時,若a<=”1000”,b=’0001’,即a=8,b=1則結果c=’0’;當定義成有符號類型時,若a<=”1000”,b=’0001’,則a=-8,b=1,則結果c=’1’。

2-1-3列舉和數組數據類型

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

在VHDL語言里,不同類型的數據信號之間不能互相賦值。當需要不同類型數據之間傳遞信息時,就需要類型轉換函數將其中的一種類型數據轉換為另一中數據類型后,再進行信號的傳遞。例如:SignalY:Std_logic_vector(7downto0);

SignalX:Integerrange0to255;Y<=CONV_STD_LOGIC_VECTOR(X,8);轉換函數有兩個參數,被轉換的對象和轉換后的位數。

常用的數據類型轉換函數CONV_INTEGER

將數據類型UNSIGNED,SIGNED轉換為INTEGER類型.

CONV_UNSIGNED

將數據類型INTEGER,SIGNED轉換為UNSIGNED類型.CONV_SIGNED

將數據類型INTEGER,UNSIGNED轉換為SIGNED類型. CONV_STD_LOGIC_VECTOR

將數據類型INTEGER,UNSIGNED,SIGNED,STD_LOGIC轉換為STD_LOGIC_VECTOR類型.在庫ieee的程序包std_logic_arith中定義2-2

數據對象的定義常用的數據對象有三種:常數(Constant)信號(Signal)變量(Variable)

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

Constant

常數名:數據類型:=常數值;

如:ConstantD1:Integer:=3;注意!常數定義的同時進行賦初值。常數的應用示例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信號的定義(1)“信號”數據對象,代表電路內部信號或連接線路,其在元件之間起互連作用。注意!信號定義的時候盡管可以直接賦初值,但系統往往忽略。建議信號對象定義后再進行賦值。(2)信號為全局量。(3)在實體說明、結構體描述和程序包說明中使用。(4)信號的定義格式:Signal信號名:數據類型;(5)信號賦值的語法格式為:信號名<=表達式;如:SignalS1:Std_logic_vector(3Downto0);S1<=“0000”;2-2-3變量的定義(1)“變量”數據對象,它用于對中間數據的臨時存儲,并不一定代表電路的某一組件。注意!變量定義的時候盡管可以直接賦初值,但系統往往忽略。建議變量對象定義后再進行賦值。(2)變量為局部量。(3)僅限于進程(Process)或子程序中使用。(4)變量的定義格式:Variable變量名:數據類型;

(5)變量賦值的語法格式為:目標信號值:=表達式;如: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例一結果: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為時鐘脈沖

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

(1)信號和變量的對應關系不同:信號代表電路內部信號或連接線路;而變量則不是。

(2)信號和變量聲明的位置不同:信號聲明在子程序、進程的外部;而變量聲明在子程序、進程的內部。

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

(4)在一個進程中多次為一個信號賦值時,只有最后一個值會起作用;而變量則不同,每次賦值都會改變它的值。(5)賦值不同。在進程中,信號賦值只有在進程結束時起作用,而變量賦值是立即進行的。而且賦值符號不同:信號賦值為“<=”,變量賦值為“:=”。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;--常數定義signalbinadd:std_logic_vector(4downto0);--信號

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

2-3信號運算符

VHDL提供了四種類型運算符號:邏輯運算符關系運算符算術運算符連接運算符VHDL運算符——邏輯運算符

and

邏輯與

or

邏輯或

nand

與非

nor

或非

xor

異或

xnor

同或

not

邏輯非上述邏輯運算在庫ieee的程序包std_logic_1164中定義。

VHDL運算符——關系運算符

= 等于

/= 不等于

< 小于

<= 小于或等于

> 大于

>= 大于或等于

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

+ 加

- 減

* 乘

/ 除

** 乘方

mod 求模

rem

求余

abs 求絕對值

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

VHDL運算符——連接運算符

&

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

left表示數組的左邊界;

right表示數組的右邊界;

low表示數組的下邊界;

high表示數組的上邊界;

length表示數組的長度。2-4數據對象屬性如:SignalA:std_logic_vector(7downto0);SignalB:std_logic_vector(0to3);則這兩個信號的屬性值分別為:

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表示數組的左邊界;

right表示數組的右邊界;

low表示數組的下邊界;

high表示數組的上邊界;

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

2-4數據對象屬性(2)‘Event屬性:例如:時鐘邊沿表示

signalclk:in

std_logic;

則clk’event

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

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

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

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

并行賦值語句

第三章

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

同時執行d<=aorb;

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

每條語句的執行和其所在的位置無關。

ABCD(2)When-Else條件式信號設置語句它的語法格式為:[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選擇式信號設置語句[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”,--注意結束為“,”不是“;”'1'when"10",'0'whenothers;Enda;ZXYWhen-else和With-select-When語句的區別

(1)With-select-When語句中When后的constant_value必須是互不相同的;(2)而When-else語句中When后的logic_expression則不需要這樣的嚴格條件;(3)When-else語句中When后的logic_expression的優先權次序為由先到后排列。優先編碼器示例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”;如果三個輸入都為0,f=”00”。r1r3r2f(4)Process語句(1)一個結構體當中可以有多個Process語句,Process語句是同時執行的并行語句。(2)Process內的語句卻是順序執行的順序語句。(3)多進程之間的信息通過信號對象來傳遞。Process語句的格式為:[Processlabel:]Process[(Sensitivitylist)][Variabledeclarations]Begin順序語句;EndProcess[Processlabel];

(4)Process語句

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

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

當我們設計一個比較復雜的電路時,為了使設計簡單化,可以將其分為幾個部分分別進行設計,每個部分設計完成后,再將其組合成我們需要的電路。這種方法稱為模塊化設計方法。這樣,使得整個設計工作更加容易實現,同時程序代碼的維護性、糾錯性都能得到提高。采用模塊化設計時,當設計一個模塊時,我們就要用到Block語句。

語法格式:BlockLabel:Block[數據對象定義部分]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程序更加模塊化、功能化。但這樣的做法要求在同一程序中,若是重復使用時,必須重寫一次。Block語句解決了這樣的重復編寫問題。(2)元件也是完整的VHDL設計,作為底層設計,通過元件聲明,使之可在其他模塊中被調用。(3)元件聲明可放在程序包中,也可在某個設計的結構體中聲明。

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

元件名

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

元件例化時端口映射或關聯有兩種方式:a.位置對應方式直接由輸入信號和元件信號的對應位置進行映射。即:元件標號:元件名

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

元件標號:元件名

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

注意!元件標號是必需的。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語句用于生成一組信號賦值或元件例化語句。語法格式:generate_label:

--必須的forindex_variableInrangegenerate

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

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

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

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

定義格式:Generic(參數名:數據類型[:=表達式]);例如: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);--也可在此進行影射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;

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

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

順序語句有三個特點:

a.所有語句的執行是順序進行的;

b.每條語句的執行和其所在的位置有關;

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

(2)If-Else語句

(3)Case-When語句

(4)Null語句

(5)For-Loop語句

(6)Waituntil語句

(7)變量賦值語句

(8)Procedure(過程)調用語句

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

]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”語句可嵌套使用,即在一個IF語句中可再調用另一個“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;

以上是四路信號選擇器。

(4)Null語句

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

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

null;Endcase;(5)For-Loop語句For-Loop為循環語句,可以使其所包含的順序語句被循環執行,它類似于并行語句中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;統計一個多位信號中1的個數

(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)變量賦值語句

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

(8)Procedure調用語句

語法格式:Procedure過程名(輸入輸出參數表)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;二位與的過程

第五章

組合邏輯電路的設計

任一時刻的輸出僅僅取決于當時的輸入,與電路原來的狀態無關,這樣的數字電路叫做組合邏輯電路。

5-1常用組合邏輯電路設計

(1)編碼器(2)譯碼器(3)比較器(4)數據選擇器(5)三態輸出電路

(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;下面的程序設計為:四位二進制->BCD碼,然后將BCD碼->七段顯示器碼。(1)當輸入為0~9的數時,其十位數為0,個位數=輸入。當輸入為10~15的數時,其十位數為1,個位數=輸入-10。(2)然后將十位和個位的BCD碼轉換為七段顯示器碼。

(2)譯碼器b.碼制轉換

注:數碼管為共陰極數碼管。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)--二進制轉換為十進制beginifA<10thenbcd1<="0000";bcd0<=A;seven1<=“0111111”;--十位數顯示0tmp<=A;elsebcd1<="0001";bcd0<=A-10;seven1<=“0000110”;--十位數顯示1

溫馨提示

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

評論

0/150

提交評論