CH2-VHDL-资料物件、资料型态及运算子_第1页
CH2-VHDL-资料物件、资料型态及运算子_第2页
CH2-VHDL-资料物件、资料型态及运算子_第3页
CH2-VHDL-资料物件、资料型态及运算子_第4页
CH2-VHDL-资料物件、资料型态及运算子_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第二章VHDL資料物件、資料型態及運算子2-1

資料物件2-1-1

常數物件宣告2-1-2

變數物件宣告2-1-3

信號物件宣告2-1-4檔案物件宣告2-1-5

其他宣告

12-2

資料型態2-2-1

純量型態2-2-2

合成型態2-2-3

存取型態2-2-4檔案型態2-2-5次資料型態2-3運算子

2-3-1邏輯運算子2-3-2關係運算子2-3-3位移運算子2-3-4加法運算子2-3-5乘法運算子2-3-6其他22-4

型態及物件屬性2-4-1

數值屬性2-4-2

函數屬性2-4-3

信號屬性2-4-4型態屬性2-4-5範圍屬性3本章主要目的為討論VHDL語言的根本資料物件(DataObject)、資料型態(DataType)及運算子(Operator)。VHDL是一個十分重視資料型態之語言。以下為本章討論之重點:第一、資料物件之種類及其宣告方式:VHDL語言使用物件來代表實際電路連線、檔案或者協助描述電路。物件之宣告需要已定義之資料型態,且不同用途之物件需要不同之宣告方式。第2.1節即為討論資料物件之種類及其宣告之方式。第二、資料型態之種類及其定義之方式:VHDL語言提供了豐富種類之資料型態以利程式撰寫,然而所有的資料型態均需定義後才能使用。有些資料型態已預先為語言所定義,有些則需要在程式中定義之。第2.2節主要為說明資料型態之種類及其定義之方式。4第三、運算子之使用方式:VHDL語言要求在使用運算子執行運算時,所有的運算元(Operand)必須為已宣告之物件,且其型態及相關語法需符合VHDL之規定。運算子之相關使用規定於第2.3節討論之。第四、型態及物件屬性(Attribute)之涵義:VHDL語言之資料型態及物件可以附有一些屬性以方便及簡化程式設計。屬性裏包含了型態及物件之特性、狀態及參數。第2.4節討論了一些常用的屬性之含義及其使用方式。5資料物件資料物件為一個VHDL程式的根本元件,在一個資料物件內含有一個數值,其具有特定之資料型態。資料物件可在程式中藉由宣告的步驟而產生,以下即為一個宣告的例子:variablecount:integer;此一宣告會產生一個資料物件其名稱為count,且此物件只能包含有整數(Integer)。值得注意的是此物件宣告為變數(Variable)類別,而在VHDL程式中我們可使用以下四種類別之一種來完成物件之宣告:1.常數(Constant)2.變數(Variable)3.信號(Signal)4.檔案(File)2-16在上面四種類別中,信號類別是VHDL語言中特有的物件,此物件並不存在於一般高階語言如C或Pascal語言中。在程式中被宣告為信號之物件代表實際數位電路中之連線。常數以及變數物件的含義則與一般高階語言之常數及變數物件之含義類似,在VHDL語言中我們使用這些類別來協助描述數位電路的架構,但它們並不代表實際的信號及連線。檔案物件則通常使用來代表工作環境中的檔案,此類別可有效協助執行電路模擬。我們將這四種物件之根本宣告方式討論如下:2-1-1常數物件宣告根本的常數物件宣告方式為:constant資料物件名稱:資料型態:=常數值;其中資料物件名稱、資料型態及常數值皆可由我們指定之。然而在指定資料型態前,假设該型態並非是VHDL預先定義的型態,則我們必需先在程式中定義,而定義資料型態的方式我們將在下一節討論之。7以下為一些常數宣告的例子:constantbus_width:integer:=8;constantregister_a:std_logic_vector(3downto0):="0101";在第一個例子裏我們宣告一個常數物件,其名稱為bus_width,其型態為integer且其常數值為8。在第二個例子裏我們宣告了一個名稱為register_a的物件,其型態為一個含有4個元素的std_logic_vector矩陣,且其常數值為“0101”。值得注意的是常數物件在經過宣告後其值為固定,不能在程式執行過程中改變。82-1-2變數物件宣告根本的變數物件宣告方式為:variable資料物件名稱:資料型態:=初始值;一些變數物件宣告的範例如下:variablefound,done:boolean;variableresult:bit:='1';在第一個例子中我們宣告兩個變數found及done,其型態為boolean,但未給予其初始值。而第二個例子宣告了變數result,其型態為bit且其初始值為1。變數之值可在程式執行中改變之,其方式為使用運算子:=。延續上面的實例,假设欲改變物件result之值為‘0’,則我們可使用以下方式:result:='0';92-1-3信號物件宣告根本的信號物件宣告方式為:signal資料物件名稱:資料型態;信號物件也可以在宣告時予以初始化,然而給予信號初始值僅適用於電路模擬的情況,在實際執行電路合成時則可能不適用。一些信號物件宣告的例子為:signaldata_bus:std_logic_vector(7downto0);signalclock:bit;假设欲在程式執行中設定或改變信號之值,其方式為使用運算子<=,而非運算子:=。延續上面的實例,假设欲設定物件clock之值為‘0’,則我們可使用以下方式:clock<='0';信號物件是VHDL語言中特有的物件,其與其他物件雖然宣告的方式類似,但是信號物件代表實際數位電路的連線而其他物件則否,因此VHDL程式處理信號物件的方式與其它物件不同。例如VHDL允許信號物件執行延遲的動作,但變數物件則否。10我們可以在執行電路模擬時使用下面敘述句來設定信號:clock<='0'after10ns;此敘述句可讓模擬器在10ns後才將信號物件clock設定為‘0’,但此敘述句並不適用於變數物件上。2-1-4檔案物件宣告最簡單的檔案物件宣告方式為file資料物件名稱:資料型態;由於檔案物件是用來代表工作平台中的一個檔案,有些情況下可能需要在宣告時指定檔案路徑及名稱,以及此檔案是供讀入或寫出。此時宣告方式為file資料物件名稱:資料型態is輸出入模式"完整檔案路徑及名稱";其中輸出入模式可為in或out,假设in則我們使用該檔案來讀入資料,假设out則我們使用該檔案來寫出資料。11檔案宣告的舉例如下filemy_input_file:my_file_typeisin"/MyDoc/MyVHDL/test.dat";在此一例子中我們宣告了一檔案物件,其名稱為my_input_file,型態為my_file_type,輸出入模式為in,且該物件代表了位於路徑/MyDoc/MyVHDL上之檔案test.dat。另外一種宣告方式為file資料物件名稱:資料型態open開啟模式is"完整檔案路徑及名稱";其中開啟模式可為read_mode或write_mode,假设read_mode則我們使用該檔案來讀入資料,假设write_mode則我們使用該檔案來寫出資料。12在VHDL語言中並不是所有的物件都由上述方式宣告,以下為一些例外情況:1.在執行單體宣告時宣告物件(參考第3章及第6章)2.在執行副程式宣告時宣告物件(參考第7章)另外在一些迴路敘述句中,如for...loop及for...generate敘述句允許迴路識別字不經明確宣告即可直接使用(參考第4章及第6章)。2-1-5其他宣告13資料型態資料物件所含之數值皆有資料型態,而資料型態事實上為一群數值的集合。根據這些數值的特性,在VHDL程式中資料型態可分為四類:純量(Scalar)、合成(Composite)、存取(Access)及檔案(File)。圖2.1顯示本節擬討論的所有資料型態及其所屬之類別。2-2圖2.1VHDL語言之資料型態14純量資料型態可再分為四類:列舉(Enumeration)、整數(Integer)、物理(Physical)及浮點(Floating),其中我們稱呼整數、物理及浮點資料型態為數字(Numeric)型態,因為這些資料型態之數值皆為數字。我們也稱呼列舉及整數資料型態為離散(Discrete)型態,因為這些資料型態之數值為可數(Countable)。2-2-1純量型態152-2-1-1列舉型態以下為在VHDL程式中定義一個列舉資料型態的方式:type型態名稱is(列舉之元素);舉例如下:typecar_stateis(STOP,SLOW,MEDIUM,FAST);typelogic_stateis('0','1','Z');在第一個例子裏我們定義了資料型態car_state,其元素為STOP、SLOW、MEDIUM及FAST,而在第二個例子裏定義了資料型態logic_state,其元素為‘0’、‘1’、及‘Z’。因此,假设我們宣告了如下之兩個物件:variablemy_car:car_state;variablemy_logic:logic_state;則my_car物件所含之數值必須為STOP、SLOW、MEDIUM或FAST,而my_logic物件所含之數值必須為‘0’、‘1’、或‘Z’。假设欲分別設定my_car及my_logic之值為SLOW及‘0’,則可用以下指令:car_state:=SLOW;my_logic:='0';16在VHDL語言中有許多已是預先定義的列舉型態,其中bit、boolean及character為最常被使用的三種。型態bit之元素為‘0’及‘1’,型態boolean之元素為TRUE及FALSE,而型態character則包含了191個字元。這些型態的定義已列在標準套件(StandardPackage)中(請參考附錄B),因此在使用這些已預先定義的資料型態時,我們不需要在程式中重新定義之。另外一個常用的列舉型態為std_logic,此列舉型態是定義在IEEEstd_logic_1164套件中(請參考附錄D),而非在標準套件裏,因此在使用此一列舉型態時必須要將std_logic_1164套件包含於程式中,我們可使用以下指令來完成:libraryieee;useieee.std_logic_1164.all;列舉型態std_logic的元素為'U','X','0','1','Z','W','L','H'及'-‘這些元素的含義如下:'U':未設定起始狀態(Un-Initialized)'X':強制為未知狀態(ForcingUnknown)'0':強制為低準位(Forcing0)17

'1':強制為高準位(Forcing1)

'Z':高阻抗(HighImpedance)

'W':弱未知狀態(WeekUnknown)

'L':弱低準位(WeekLow)

'H':弱高準位(WeekHigh)

'-':可忽略(Don'tCare)考慮一信號物件my_signal其宣告及設定如下signalmy_signal:std_logic;my_signal<='Z';則my_signal之數值為高阻抗'Z'。18整數型態是一個所有數值皆位於整數某一範圍的資料型態,其定義的方法為:type型態名稱isrange數值起始值to數值終止值;type型態名稱isrange數值終止值downto數值起始值;其中數值起始值及數值終止值皆需為整數,舉例如下:typemy_indexisrange0to15;typeword_lengthisrange31downto3;在第一個例子裏我們定義了資料型態my_index,其為整數型態且其數值範圍為0至15,而在第二個例子裏定義了資料型態word_length,其為整數型態且其數值範圍為3至31。在VHDL語言標準套件中預先定義的整數型態是integer,此型態的數值範圍可能會隨我們所使用的編譯器不同而不同,但至少應是-231+1至231–1。2-2-1-2整數型態19浮點型態是一個所有數值皆位於實數某一範圍的資料型態,其定義的方法為:type型態名稱isrange數值起始值to數值終止值;type型態名稱isrange數值終止值downto數值起始值;其中數值起始值及數值終止值皆需為實數,舉例如下:typemy_real_dataisrange0.0to4.5;typemy_float_dataisrange2.3E-5to5.0E4;在第一個例子裏我們定義了資料型態my_real_data,其為浮點型態且其數值範圍為0.0至4.5。值得注意的是我們可用指數的方式來代表浮點數值,舉例說明2.3×10-5,及5.0×104可分別用2.3E-5及5.0E4表達之。因此在第二個例子裏my_float_data為浮點型態且其數值範圍為2.3×10-5至5.0×104。在VHDL語言標準套件中預先定義的浮點型態是real,此型態的數值範圍也可能會隨我們所使用的編譯器不同而不同,但至少應是–1.0E38至1.0E38。2-2-1-3浮點型態20物理型態包含了具有物理含義的數值,例如時間、電壓及電流等。物理型態的定義方式為type型態名稱isrange數值起始值to數值終止值units根本單位名稱;延伸單位名稱1=與根本單位之關係;延伸單位名稱2=與根本單位(或與延伸單位名稱1)之關係;……延伸單位名稱n=與根本單位(或與延伸單位名稱n-1)之關係;endunits;我們舉一個定義電流資料型態的例子如下typeCURRENTisrange0to1E9unitsnA;uA=1000nA;mA=1000uA;Amp=1000mA;endunits;2-2-1-4物理型態21在這個例子中CURRENT為一物理資料型態,其根本單位為nA,而uA、mA及Amp為其延伸單位。此資料型態之範圍為0nA至1E9nA。假设宣告一物件my_current為variablemy_current:CURRENT:=10uA;則CURRENT之數值為10uA=10000nA。在VHDL語言標準套件中預先定義的物理型態是time,其定義如下:typetimeisrange-9223372036854775808to9223372036854775807unitsfs;ps=1000fs;ns=1000ps;us=1000ns;ms=1000us;sec=1000ms;min=60sec;hr=60min;endunits;由上述定義可知time之根本單位為fs,但我們也可使用ps、ns、us、ms、sec、min及hr等延伸單位來設定time之數值。22上述的列舉、整數、浮點及物理等純量型態最大的共通點為其數值皆為純量,亦即其數值並非其他數值的集合,合成型態則允許其數值為某些數值的集合。合成型態又可分兩類:矩陣(Array)型態及記錄(Record)型態。2-2-2合成型態23在矩陣型態裏每一數值均代表一個集合,而該集合內所有元素需為同一類型。一維矩陣型態的定義方式如下所示:type型態名稱isarrayof(矩陣起始值to矩陣終止值)of元素類型;type型態名稱isarrayof(矩陣終止值downto矩陣起始值)of元素類型;其中矩陣起始值及矩陣終止值需為整數,而元素類型則可為純量型態或者甚至為另外一個合成型態。以下為一些矩陣型態宣告的例子:typeADDRESS_WORDisarrayof(0to63)ofbit;typemy_std_logicisarrayof(7downto0)ofstd_logic;在第一個例子裏ADDRESS_WORD是一個矩陣型態,其數值為一個含有64個bit元素之矩陣。而在第二個例子裏my_std_logic也是一個矩陣型態,其數值為一個含有8個std_logic元素之矩陣。2-2-2-1矩陣型態24有些矩陣型態在定義時並未指明矩陣起始值和矩陣終止值,此種矩陣型態我們稱之為無限制矩陣(UnconstrainedMatrix)型態。此種無限制矩陣之根本定義法為:type型態名稱isarrayof(整數型態<>)of元素類型;舉例說明typeMY_VECTOR_TYPEisarrayof(integer<>)ofbit;在此一實例中我們定義了一個無限制矩陣型態MY_BIT_VECTOR,其數值為含有bit元素之矩陣,而該矩陣之範圍可在物件宣告時決定之。繼續上面的例子,假设我們宣告一物件如下signalmy_vector:MY_VECTOR_TYPE(-127to127);則物件my_vector為一個型態為MY_BIT_VECTOR之矩陣,而其範圍為-127至127,因此只包含有255個bit元素。在VHDL語言標準套件中預先定義的無限制矩陣型態為string及bit_vector,其中string為由character所構成之無限制矩陣型態,而bit_vector為由bit所構成之無限制矩陣型態。25考慮以下的物件宣告:variablemy_message:string(1to6);signalOP_CODE:bit_vector(1to5);我們可用以下的方式來設定或改變my_message及OP_CODE之值:my_message:="Hello!";OP_CODE<="10011";由於my_message是變數,所以我們用運算子:=來設定my_message之值。根據my_message之宣告我們可知其為17個character所組成之矩陣,因此我們使用了6個字元“Hello!”設定之。另一物件OP_CODE則為信號,因此我們用運算子<=設定OP_CODE之值。OP_CODE為5個bit所組成之矩陣,因此我們用5個位元“10011”設定之。除了設定整體矩陣之值外,我們也可以單獨設定矩陣個別元素之值,如下所示OP_CODE(2)<='1';此設定OP_CODE第二個元素之值為1。另外一個常用的矩陣型態為std_logic_vector,此型態為由std_logic所構成之無限制矩陣型態,且定義在IEEEstd_logic_1164套件中。26

現在考慮以下兩個宣告:signalareg:bit_vector(0to6);signalbreg:bit_vector(6downto0);因此areg及breg具有相同之矩陣範圍,然而其元素排列方式為相反。為了加詳細的比較此二宣告之不同,圖2.2顯示了areg及breg元素排列之情況。由圖可知areg內之元素為依序從左至右排列,而breg則依序從右至左排列。因此我們假设執行以下之設定:register_a<="0000001";register_b<="0000001";則areg(6)=‘1’,而areg之其他元素值為‘0’。另一方面,breg(0)=‘1’,而breg之其他元素值為零。一般而言breg之元素排列情況比較符合我們的習慣用法。圖2.2areg及breg元素排列之情況27紀錄型態與矩陣型態類似的地方是在紀錄型態裏每一數值也是代表一個集合,然而在紀錄型態數值內所有元素不需為同一類型。紀錄型態與C語言之struct型態十分類似,其定義方式為type型態名稱isrecord物件宣告1;物件宣告2;…物件宣告n;endrecord;在上述的定義裏每個數值皆有n個欄位,而每一欄位皆為一個物件。不同欄位之物件可以不同。2-2-2-2紀錄型態28以下為一個定義紀錄型態的例子typeMODULEisrecordsize:integer;critical_dly:time;no_inputs:integer;no_outputs:integer;endrecord;我們可用以下的方式來宣告及設定型態為MODULE之矩陣:variableNAND_COMP:MODULE;NAND_COMP:=(20,15ns,2,3);在上例中NAND_COMP中之size、critical_dly、no_inputs及no_outputs分別被設定為20、15ns、2及3。我們也可以個別設定NAND_COMP內每一欄位之值:NAND_COMP.size:=20;NAND_COMP.critical_dly:=15ns;29存取型態事實上與C語言裏的指標(Pointer)型態十分類似,在存取型態裏的數值即為指向其他型態之指標。存取型態之定義方法如下:type名稱1isaccess名稱2;

在此一定義中名稱1為此存取型態之名稱,其數值為一指標,且指向型態為名稱2之物件。以下實例定義了一存取型態PTR其指向型態為MODULE之物件,並宣告二物件MOD1PTR及MOD2PTR其具有PTR型態:

typePTRisaccessMODULE;variableMOD1PTR,MOD2PTR:PTR;

值得注意的是在上述之宣告只決定物件MOD1PTR及MOD2PTR之型態,但並未指定MOD1PTR及MOD2PTR所指相向之物件。考慮以下之指令:MOD1PTR:=newMODULE'(5,12ns,3,4);MOD2PTR:=MOD1PTR;

第一個指令產生一物件,其size、critical_dly、no_inputs及no_outputs分別被設定為5、12ns、3及4,且MOD1PTR為一指標其指向該物件。第二指令則讓MOD2PTR指向MOD1PTR所指之物件。2-2-3存取型態30檔案型態可以使用如下的方式定義之:type名稱1isfileof名稱2;

其中名稱1為此檔案型態之名稱,而此檔案型態所代表之檔案則由型態為名稱2之物件所組成。舉例如下typeVECTORSisfileofbit_vector;typeNAMESisfileofstring;

在上面的第一個例子中我們定義一檔案型態VECTORS,其所代表之檔案是由型態為bit_vector之物件所組成。於第二個例子中我們定義一檔案型態NAMES,其所代表之檔案是由型態為string之物件所組成。2-2-4檔案型態31次資料型態(subtype)代表一個資料型態的子集合,其定義的方式如下所示:subtype次型態名稱is母檔案名稱範圍;以下為一些定義次資料型態之實例subtypemy_integerisintegerrange0to20;typeDIGITis('1','2','3','4','5','6','7','8','9');subtypeMIDDLEisDIGITrange'3'to'7';

在第一個例子中my_integer是一個由integer所導引出之次型態,其範圍是0至20,而第二個例子中我們先定義DIGIT資料型態,然後MIDDLE次型態則為DIGIT型態之子集合,其範圍為'3'、'4'、'5'、'6'及'7'。2-2-5次資料型態32運算子在程式語言中,我們以運算子代表執行運算的動作,且用運算元代表參與運算之物件。VHDL語言之運算子可分為以下六類:1.邏輯運算子2.關係運算子3.位移運算子4.加法運算子5.乘法運算子6.其他我們將每一類運算子之涵義及其對運算元型態之要求簡述如下:2-333VHDL語言有七個邏輯運算子:andornandnorxorxnornot邏輯運算子之運算元需為bit、std_logic或boolean,由這些資料型態所構成之矩陣(如bit_vector或者是std_logic_vector)也可作為邏輯運算子之運算元。所有運算元及運算結果之資料型態皆需相同。2-3-1邏輯運算子34VHDL語言共有以下之關係運算子:=/=<<=>>=每一個關係運算子之含意簡列如下:=測試其兩個運算元之數值是否相等/=測試其兩個運算元之數值是否不相等<測試其左邊運算元之數值是否小於右邊運算元之數值<=測試其左邊運算元之數值是否小於或等於右邊運算元之數值>測試其左邊運算元之數值是否大於右邊運算元之數值>=測試其左邊運算元之數值是否大於或等於右邊運算元之數值2-3-2關係運算子35關係運算子運算結果之型態一定為boolean。對於運算子=及/=而言,其運算元之型態可以為除了檔案型態外之任何型態。其他之關係運算子則要求其運算元需為純量型態或者為離散之舉矩陣型態(亦即為矩陣型態但其數值之元素需為整數或列舉型態)。假设運算元為純量型態中之列舉型態,則在型態宣告時位於左邊之元素其值小於位於右邊之元素,舉例說明,假设定義一列舉型態為typeMVLis('0','1','2','U');則MVL'('0')<MVL'('U')為true,因為'0'位於'U'之左側。假设運算元為離散矩陣型態,則比較\之進行方式為從最左邊之元素開始,一次僅比較一個元素。假设可以判斷比較結果則終止,否則比較則持續到最右邊之元素完成為止。舉例說明BIT_VECTOR'('0','1','1')<BIT_VECTOR'('1','0','1')為true,因為左側矩陣之最左邊元素小於右側矩陣之最左邊元素。36以下為VHDL語言之位移運算子sllsrlslasrarolror這些運算子之左側運算元型態需為bit、std_logic或boolean所構成之矩陣,而右側運算元型態需為整數。每一個位移運算子之含意簡列如下:

sllshiftleftlogic(邏輯向左位移)

srlshiftrightlogic(邏輯向右位移)

slashiftleftarithmetic(算術向左位移)

srashiftrightarithmetic(算術向右位移)

rolrotateleft(向左旋轉)

rorrotateright(向右旋轉)2-3-3位移運算子37邏輯位移之特點為將因位移而空出之位置補0。算數位移則根據位移前最左邊或最右邊之位元值來補空出位置之值,假设向右位移則根據最左邊之值補空出位置之值,假设向左位移則根據最右邊之值補空出位置之值。旋轉則將移出之位元值填補空出之位置。以下為一些實例:"1001010"sll2之結果為"0101000""1001010"srl3之結果為"0001001""1001010"sla2之結果為"0101000""1001010"sra3之結果為"1111001""1001010"rol2之結果為"0101010""1001010"ror3之結果為"0101001""1001010"ror–2之結果為"0101010""1001010"sra–2之結果為"0101000"38加法運算子共有以下三種:+-&每一個關係運算子之含意簡列如下:+執行其左側及右側運算元之相加(Addition)動作-執行其左側及右側運算元之相減(Substraction)動作&執行其左側及右側運算元之合併(Concatenation)動作對於運算子+及-而言,其運算元需為數字型態,且其所有運算元及運算結果皆有相同型態。另外一個運算子&之運算元則為列舉或單維矩陣型態,其結果則為矩陣型態。舉例說明'0'&'1'之結果為"01",而"BA"&"LL"之結果為"BALL"。2-3-4加法運算子39根本之乘法運算子共有以下兩種:*/其中運算子*執行其兩個運算元之乘法,而運算子/執行其兩個運算元之除法。這些運算子之運算元及運算結果之型態需共同為整數或浮點。除了上述的運算子外,其他還有兩個常用之運算子:abs**運算子abs只有一個運算元,其目的為求取其運算元之決對值,而運算元之型態可為任何之數值型態。運算子**計算其運算元之指數值,其左側運算元為指數基底,而右側運算元為次方值。左側型態為整數或浮點型態,右側只能為整數。2-3-5乘法運算子2-3-6其他40型態及物件屬性屬性為VHDL語言裏很大的一個特色,該語言允許在程式裏的某些名稱擁有屬性以簡化程式設計。可以擁有屬性之名稱包括單體名稱、架構名稱、型態名稱及物件名稱等,而屬性則可以為一數值、函數、信號、型態或者範圍。VHDL語言提供了許多預先定義之屬性,同時也允許我們自定屬性。雖然屬性是一個很有用之工具,但為了能快速了解屬性之基本應用,在本節中我們只討論型態及物件的屬性,其可分為:1.數值屬性(ValueAttributes)2.函數屬性(FunctionAttributes)3.信號屬性(SignalAttributes)4.型態屬性(TypeAttributes)5.範圍屬性(RangeAttribute)我們將每種屬性簡述如下:2-441假设我們呼叫一個數值屬性則可取得一個常數值。假設T為一個型態或者為次型態,以下為T的一些根本數值屬性:T'LEFT:T型態之最左邊數值T'RIGHT:T型態之最右邊數值T'HIGH:T型態之最大數值T'LOW:T型態之最小數值考慮型態allowed_value,week_day及work_day其定義如下typeallowed_valueisrange15downto0;typeweek_dayis(SUN,MON,TUE,WED,THU,FRI,SAT)subtypework_dayisweek_dayrangeFRIdowntoMON;2-4-1數值屬性42則以下為這些型態數值屬性之值allowed_value'LEFT為15allowed_value'RIGHT為0allowed_value'HIGH為15allowed_value'LOW為0week_day'LEFT為SUNweek_day'RIGHT為SATweek_day'HIGH為SATweek_day'LOW為SUNwork_day'LEFT為FRIwork_day'RIGHT為MONwork_day'HIGH為FRIwork_day'LOW為MON

數值屬性的應用很廣,以下為一實例其將該屬性用來定義次型態:考慮在標準套件中預先定義之次型態positive及natural,其之定義實際為subtypepositiveisintegerrange1tointeger'HIGH;subtypenaturalisintegerrange0tointeger'HIGH;43因此次型態positive包含了所有型態integer中之正整數,而natural包含型態integer中之正整數及0。假設T是一個矩陣型態,則T‘LENGTH代表矩陣之長度。舉例說明:typemy_databusisarray(2to8)ofbit;typemy_addrbusisarray(10downto3)ofstd_logic;則

my_databus'LENGTH為7my_addrbus'LENGTH為844函數屬性本身即為一函數,當我們呼叫函數屬性後它會回傳一數值。以下我們討論兩類常用之函數屬性:型態之函數屬性與信號物件之函數屬性。假設T是一個離散型態或物理行型態或這些型態之次型態,則

T'POS(V):回傳數值V在型態T中之位置。

T'VAL(P):回傳型態T中於位置P之數值。

T'SUCC(V):回傳在型態T中位於數值V後一個位置之數值。

T'PRED(V):回傳在型態T中位於數值V前一個位置之數值。

T'LEFTOF(V):回傳在型態T中位於數值V左邊一個位置之數值。

T'RIGHTOF(V):回傳在型態T中位於數值V右邊一個位置之數值。2-4-2函數屬性2-4-2-1型態之函數屬性45考慮以下實例typeCOLORis(red,orange,yellow,green,blue,purple);subtypereverse_COLORisCOLORrangepurpledowntored;則COLOR'VAL(4)為green,COLOR'POS(red)為1,且COLOR'SUCC(yellow)為greenCOLOR'PRED(yellow)為orangeCOLOR'RIGHTOF(yellow)為greenCOLOR'LEFTOF(yellow)為orangereverse_COLOR'SUCC(yellow)為orangereverse_COLOR'PRED(yellow)為greenreverse_COLOR'RIGHTOF(yellow)為orangereverse_COLOR'LEFTOF(yellow)為green46假設S為一信號物件,以下為S的一些根本函數屬性:S'EVENT:回傳一boolean數值,其顯示信號物件S在執行呼叫S'EVENT之delta時間內是否有數值發生變化。假设有變化則回傳true,假设無則回傳false。S

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论