




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第二章VHDL語言的基本要素及基本結構1.第二章VHDL語言的基本要素及基本結構1.第二章VHDL的語言要素及基本結構要求:1.掌握:VHDL的命名規則:基本標示符、下標名、段名及注釋;VHDL對象(客體)分類定義及其性質;VHDL語言的數據類型:位、位矢量、整形數;枚舉類型;IEEE標準的STD_LOGIC、STD_LOGIC_VECTOR;運算操作符;VHDL程序的組成VHDL語言設計的基本單元及其構成VHDL構造體描述的幾種方法庫及IEEE庫中包集合的使用2.熟悉:VHDL語言的其它數據類型、子程序、包集合及配置3.了解:標示符:擴展標識符;數據類型轉換
2.2022/11/26第二章VHDL的語言要素及基本結構要求:2.2022/11VHDL語言程序通常包含5部分:實體說明:entity:描述所設計系統的外部接口信號,是可見的。構造體:architecture描述所設計系統的內部的結構和行為,是不可見的。配置:configuration選取所需單元組成系統的不同版本包集合:package存放各設計模塊都能共享的數據類型、常數、子程序和函數。庫:library存放已經編譯好的實體、構造體、包集合和配置VHDL語言程序最基本組成是實體說明和構造體3.2022/11/26VHDL語言程序通常包含5部分:實體說明:entity:描述VHDL的語言要素VHDL的語言要素包含客體(或對象)數據類型操作數運算操作符VHDL規定:(1)不區分大小寫(“”和‘’內的字符除外);(2)每條語句以一個分號;結束;(3)不是所有語句前都可以加標號;(4)一條語句后可以加注釋,在注釋內容前加兩個短劃線。
4.2022/11/26VHDL的語言要素VHDL的語言要素包含客體(或對象)數據類§2.1VHDL語言的命名規則2.1.1數字型文字(1)整數文字 (2)實數文字(3)以數制基數表示的文字 格式:數制#數值#[指數值]
例如:10#170#E1---------十進制1700 16#FE#------------十進制254 2#1101_0001#--十進制209 8#376#------------十進制25416#E#E1---------(十六進制數表示,14*161等于224)(4)物理量文字(VHDL綜合器不接受此類文字)。60s(60秒),100m(100米),kΩ(千歐姆),177A(177安培)5.2022/11/26§2.1VHDL語言的命名規則2.1.1數字型文字5.22.1.2字符串型文字字符串型文字包含文字字符串、數位字符串數位字符串:位矢量,由數據類型為BIT的元素組成的一維數組書寫格式:基數符“數值”基數符:B—二進制數;O—八進制數;X—十六進制數例如:data1<=B“1_1101_1110”;data2<=O“15”;data3<=X“AD0”;data4<=B“101_010_101_010”;data5<=“101_010_101_010”;--表達錯誤,缺B;data5<=“101010101010”;--表達正確,沒有“_”默 認為二進制數;data6<=“0AD0”;--表達錯誤,缺X
6.2022/11/262.1.2字符串型文字字符串型文字包含文字字符串、數位字2.1.3標識符用來定義實體、結構體、對象(常數、變量、信號)、端口、子程序、語句標號或參數的名字。VHDL的基本標識符書寫遵循規則:由26個大小寫英文字母、數字0~9以及下劃線“_”組成;以英文字母開頭;不連續使用下劃線“_”,不以下劃線“_”結尾的;標識符中的英語字母不分大小寫;VHDL的保留字(或關鍵字)不能作為標識符使用。VHDL’93標準還支持擴展標識符,但是目前仍有許多VHDL工具不支持擴展標識符。由一對反斜杠之間的任何字符序列組成,取消了標準標示符的所有限制。合法標示符:Decoder_1,FFT,Sig_N,Not_Ack,State0,Idle
非法標識符:
_Decoder_1,
2FFT,Sig_#N,Not-Ack,RyY_RST_,data__BUS,return7.2022/11/262.1.3標識符用來定義實體、結構體、對象(常數、變量、2.1.4下標名下標名指的是數組型變量或信號的某一個元素。格式:標示符(表達式)標識符必須是數組型的變量或信號的名字,表達式所代表的值必須是數組下標范圍中的一個值,這個值將對應數組中的一個元素。例如:SIGNALa,b:BIT_VECTOR(0TO3);
SIGNALm:INTEGERRANGE0TO3;
SIGNALy,z:BIT;
y<=a(m);--
不可計算型下標表示
z<=b(3);--可計算型下標表示8.2022/11/262.1.4下標名下標名指的是數組型變量或信號的某一個元素2.1.5段名段名是多個下標名的組合,對應數組中某一段的元素格式:標示符(表達式方向表達式)方向:TO
或DOWNTOSIGNAL
a,z:BIT_VECTOR(0TO7)
;
Signal
b:bit_vector(4
downto
0);
z(0TO
3)<=a(4TO7);--z(0)<=a(4)、z(1)<=a(5)…9.2022/11/262.1.5段名段名是多個下標名的組合,對應數組中某一段的§2.2VHDL的數據類型及運算操作符VHDL語言同其它語言一樣有多種數據類型和運算符,且它們的定義也大多相同。VHDL語言的特點是用戶可以自己定義數據類型。如:typecountisintegerRANGE0to10;10.2022/11/26§2.2VHDL的數據類型及運算操作符VHDL語言同其它語2.2.1VHDL客體(對象)及其分類客體(對象):可以賦予一個值的對象或者是數據類型所定義的對象。客體主要包括3類信號:變量:常數:代表元件間的硬件連接線—全局變量代表暫存某一值的載體—局部變量數字電路中的電源和地等—全局變量物理意義11.2022/11/262.2.1VHDL客體(對象)及其分類客體(對象):可1、VHDL語言對象(客體)—常數一般某一值在程序中多處用到,為了增加程序的可讀性、可修改性,給該常數定義一個常數名,在書寫程序時用定義的常數名代替該常數。可以在實體、結構體、程序包、塊、進程和子程序中定義(說明)。在包集合中定義的常量可以暫不設具體數值,它可以在包體中設定。常量的使用范圍取決于它被定義的位置程序包:實體:構造體:塊:由調用該程序包中的任何實體、構造體引用僅作用于該實體僅作用于該構造體僅作用于該塊進程:僅作用于該進程子程序:僅作用于該子程序12.2022/11/261、VHDL語言對象(客體)—常數一般某一值在程序中多處用到1、VHDL語言對象(客體)—常數常數說明的一般格式:CONSTANT常量名:數據類型﹕=表達式;如:CONSTANTFBUS﹕BIT_VECTOR﹕=“0101”;CONSTANT
VCC﹕REAL﹕=5.0;CONSTANTDELY﹕TIME﹕=25ns;注意:常數被賦值的類型一定要和定義的數據類型一致,如第二條語句中的5.0若變為5則不正確。13.2022/11/261、VHDL語言對象(客體)—常數常數說明的一般格式:13.2、VHDL語言客體—變量是一個局部量,只能在進程和子程序(過程和函數)中定義和使用。變量不能將信息帶出對它作出定義的當前設計單元。變量在硬件中沒有明確的對應物,只是對數據暫存。變量的賦值是立即發生,不存在任何延時的行為。常用在實現某種算法的賦值語句中,賦值符號為“:=”變量說明語句格式:
variable變量名1[,變量名2,···]:數據類型
[約束條件:=表達式];注意:1、語句中用[]括起部分可有可無2、表達式:給變量賦初值3、變量賦值符號為“:=”4、變量賦值立即生效,因此變量賦值不能夠加延時條件5、邏輯綜合時初值無效6、多個變量具有相同的數據類型和約束條件時可以在同一條變量定義語句中定義14.2022/11/262、VHDL語言客體—變量是一個局部量,只能在進程和子程序(變量定義賦值舉例Variablex,y:integer;Variablex:integerrange0to255:=10;Variabletemp1,temp2:integer;變量賦值語句:變量定義語句:Temp1:=temp2;Temp1:=temp2after10ns;此語句對嗎?15.2022/11/26變量定義賦值舉例Variablex,y:integer;V3、VHDL語言客體—信號信號可以作為模塊間的信息交流通道,與硬件中互連元件端口的的連線相對應;信號及其相關的語句描述了硬件系統的基本特征;如硬件系統運行的并行性;信號傳輸過程中的慣性延時特性;多驅動源的總線行為等。信號賦值不立即生效信號的定義格式如下:SIGNAL信號名:數據類型約束條件﹕=初始值;初始值僅在VHDL的行為仿真中有效,邏輯綜合無效信號代入符號為“<=”,但是賦初值符號為“:=”信號賦值不立即生效,因此信號代入能夠加延時條件多個信號具有相同的數據類型和約束條件時可以在同一條信號定義語句中定義具有全局性特性,可以在以下區域定義和使用:實體:作用于該實體中所有的結構體結構體:作用于整個結構體包集合:作用于調用此包集合的所有實體除了沒有方向說明以外,信號與實體的端口(PORT)概念是一致的。16.2022/11/263、VHDL語言客體—信號信號可以作為模塊間的信息交流通道,VHDL語言客體—信號SIGNALSys_clk:bit﹕=‘0’;--定義了一個位BIT的信號S1,初始值為低電平SIGNALground:BIT=‘0’;--定義了一個位BIT的信號ground,初始值為低電平以上兩條信號定義語句可以改寫成一條信號定義語句:SignalSys_clk,ground:STD_LOGIC﹕=‘0’;SIGNALS4:STD_LOGIC_VECTOR(15DOWNTO0);--定義了一個標準邏輯位矢量(數組、總線)信號,共有16個元素SIGNALS5:integerrange0to9;;--定義了一整型數據類型的信號s5,其取值只能是0到9的整數信號賦值可以加延時條件:SIGNALS1﹕bit;SIGNALs2:bit;S2<=s1after10ns;17.2022/11/26VHDL語言客體—信號SIGNALSys_clk:bit﹕4、信號、變量、常量的比較從硬件電路系統來看常量相當于電路中的恒定電平,如GND或VCC接口變量和信號則相當于組合電路系統中門與門間的連接及其連線上的信號值。從行為仿真和VHDL語句功能上看信號可以設置延時量,而變量則不能;變量只能作為局部的信息載體,而信號則可作為模塊間的信息載體。變量的設置有時只是一種過渡,最后的信息傳輸和界面間的通信都靠信號來完成。18.2022/11/264、信號、變量、常量的比較從硬件電路系統來看18.2022/信號、變量、常量的比較從綜合后所對應的硬件電路結構來看信號將對應更多的硬件結構,變量在硬件上一般沒有對應實物。VHDL綜合器并不理會它們在接受賦值時存在的延時特性。VHDL仿真器允許變量和信號設置初始值,但在實際應用中,VHDL綜合器并不會把這些信息綜合進去。因為實際的FPGA/CPLD芯片在上電后,并不能確保其初始狀態的取向。因此,對于時序仿真來說,設置的初始值在綜合時是沒有實際意義的。19.2022/11/26信號、變量、常量的比較從綜合后所對應的硬件電路結構來看19.D觸發器的四種不同描述Entitydff1isport(clk,d:inbit;q:outbit);Enddff1;Architecturebhvofdff1isBeginD1:process(clk)variableqq:bit;Beginifclk’eventandclk=‘1’thenqq:=d;q<=qq;endif;Endprocess;Endbhv;Entitydff2isport(clk,d:inbit;q:outbit);Enddff2;Architecturebhvofdff2issignalqq:bit;BeginD1:process(clk)Beginifclk’eventandclk=‘1’thenqq<=d;endif;Endprocess;q<=qq;Endbhv;dclkqDff1dclkqDff2dff1綜合后的結果dff2綜合后的結果20.2022/11/26D觸發器的四種不同描述Entitydff1isEntitD觸發器的四種不同描述Entitydff3isport(clk,d:inbit;q:outbit);Enddff3;Architecturebhvofdff3isBeginD1:process(clk)variablea,b:bit;Beginifclk’eventandclk=‘1’thena<=d;b:=a;q<=b;endif;Endprocess;Endbhv;dclkqDff3Dff4Entitydff4isport(clk,d:inbit;q:outbit);Enddff4;Architecturebhvofdff4issignala,b:bit;BeginD1:process(clk)Beginifclk’eventandclk=‘1’thena<=d;b<=a;q<=b;endif;Endprocess;Endbhv;dclkqdclkqdclkqabDff3綜合后結果Dff4綜合后結果21.2022/11/26D觸發器的四種不同描述Entitydff3isdclkq5、信號和變量使用的區別賦值(代入)語句的符號不同::=變量賦值符號<=信號代入符號操作過程不同:變量在上一條語句賦值,下一條語句即可使用。變量不能列入進程語句的敏感表。信號代入語句的處理和代入過程是分開進行的。信號語句即使被處理也不會立即發生代入,下一條語句用到該信號,仍使用原來的信號值。在進程語句中,當進程結束或遇到wait語句時,信號代入過程才被執行。信號可以列入進程的敏感表22.2022/11/265、信號和變量使用的區別賦值(代入)語句的符號不同::=例2-5Process(A,B,C,D)Begin D<=A;
X<=B+D; D<=C;
Y<=B+D;Endprocess;Process(A,B,C)VariableD:std_logic_vector(3downto0);Begin D:=A; X<=B+D; D:=C; Y<=B+DEndprocess;例1結果:X=B+C;
Y=B+C;例2結果:X=B+A;
Y=B+C;WAITFOR10nsWAITFOR10ns注意:在同一個進程中,同一信號賦值目標有多個賦值源時,只獲得最后一個賦值源的賦值。
加入WAIT語句后,信號賦值立即生效。結果同例2結果。23.2022/11/26例2-5Process(A,B,C,D)Proce2.2.2VHDL中的數據類型1、VHDL語言的數據類型的載體:常數、變量、信號VHDL是一種強類型語言,要求設計實體中的每一個常數、信號、變量等都必須具有確定的數據類型,并且相同數據類型及量才能互相傳遞和作用。VHDL作為強類型語言的好處是使VHDL編譯或綜合工具很容易地找出設計中的各種常見錯誤。VHDL中的數據類型可以分成三大類。(不同書分類方法不完全一致)三類標準數據類型:10種用戶自定義數據類型:8種IEEE預定義標準邏輯位與矢量24.2022/11/262.2.2VHDL中的數據類型1、VHDL語言的數據類型的1、標準數據類型標準數據類型是最基本的數據類型,包括:實數類型、整數類型、位類型、字符類型和時間類型等,共10種。重點:整數類型和位類型這些數據類型都已在VHDL的標準程序包standard和std_logic_1164及其他的標準程序包中作了定義,并可在設計中隨時調用。25.2022/11/261、標準數據類型標準數據類型是最基本的數據類型,包括:實數類1)標準數據類型——整數(INTEGER)型取值范圍是-21473647~+21473647范圍:–(231–1)~
(231–1)32位對于VHDL仿真器,整數作為有符號數;對于VHDL綜合器,整數作為無符號數處理;要求用RANGE子句為所定義的數限定范圍,然后據此決定表示此信號或變量的二進制數的位數。如語句“SIGNALA﹕INTEGERRANGE0TO15;”規定信號A的取值范圍是0~15共16個整數值,可用4位二進制數來表示,因此A將被綜合成由四條信號線構成的信號。整數常量的書寫方式:2--十進制整數10E4--十進制整數16#D2#--十六進制整數2#11011010#--二進制整數26.2022/11/261)標準數據類型——整數(INTEGER)型取值范圍是-212)標準數據類型——實數(REAL)型類似于數學上的實數,或稱浮點數。取值范圍為-1.0E38~+1.0E38。通常情況下,僅能在VHDL仿真器中使用VHDL綜合器不支持實數,因為實數類型的實現相當復雜,目前在電路規模上難以承受。實數常量的書寫方式舉例如下:65971.333333--十進制浮點數43.6E-4--十進制浮點數27.2022/11/262)標準數據類型——實數(REAL)型類似于數學上的實數,3)標準數據類型——位(BIT)型取值只能是1或0;位值的表示方法是:‘0’或‘1’;位數據類型的數據對象,如變量、信號等,可以參與邏輯運算,運算結果仍是位的數據類型。VHDL綜合器用一個二進制位表示BIT。28.2022/11/263)標準數據類型——位(BIT)型取值只能是1或0;28.24)標準數據類型——位矢量(BIT_VECTOR)型位矢量是基于BIT數據類型的數組STANDARD程序包中BIT_VETOR類型定義如下:TYPE
BIT_VETOR
IS
ARRAY(NATURALRANGE<>)OF
BIT;使用位矢量必須注明位寬----數組中的元素個數和排列方向;例如:SIGNALA﹕BIT_VECTOR(7DOWNTO
0);信號A被定義為一個具有8位位寬的矢量,它的最左位是A(7),最右位是A(0)。例如:SIGNALA﹕BIT_VECTOR(0TO
7);信號A被定義為一個具有8位位寬的矢量,它的最左位是A(0),最右位是A(7)。位矢量的表示方法是:雙引號括起來的一組位數據,如:“01100”或x“00bb”十六進制表示前加x。29.2022/11/264)標準數據類型——位矢量(BIT_VECTOR)型位矢量是5)標準數據類型——布爾(BOOLEAN)型定義布爾數據類型的源代碼如下:TYPEBOOLEANIS(FALSE,TRUE);取值有FALSE和TRUE兩種。綜合器將用一個二進制位表示BOOLEAN型變量或信號。例如,當A大于B時,在IF語句中的關系運算表達式(A>B)的結果是布爾量TRUE,反之為FALSE。綜合器將其變為1或0信號值,對應于硬件系統中的一根線布爾類型的變量或信號只可以進行關系運算。例如:SIGNALflag:boolean;flag<=false;30.2022/11/265)標準數據類型——布爾(BOOLEAN)型定義布爾數據類型6)標準數據類型——字符(CHARACTER)型字符類型通常用單引號引起來如‘A’字符類型區分大小寫如‘B’不同于‘b’用于仿真,不能被邏輯綜合。31.2022/11/266)標準數據類型——字符(CHARACTER)型字符類型通常7)標準數據類型——字符串(STRING)型字符串數據類型是字符數據類型的一個非約束型數組,或稱為字符串數組。用于仿真,不能被邏輯綜合。字符串必須用雙引號標明。如:VARIABLESTRING_VAR﹕STRING(1TO7);…STRING_VAR:=“ABCD”;此數組中各元素的值:STRING_VAR(1)=‘A’;STRING_VAR(2)=‘’;STRING_VAR(3)=‘B’;STRING_VAR(4)=‘’;STRING_VAR(5)=‘C’;STRING_VAR(6)=‘’;STRING_VAR(7)=‘D’;32.2022/11/267)標準數據類型——字符串(STRING)型字符串數據類型9)標準數據類型——自然數(NATURAL)和正整數(POSITIVE)自然數整數的一個子類型,非負的整數,即零和正整數。STANDARD程序包中NATURAL類型定義如下:SUBTYPENATURALISINTEGERRANGE0TOINTEGER'HIGH;正整數是整數的一個子類型,它包括整數中非零和非負的數值。STANDARD程序包中NATURAL類型定義如下:SUBTYPEPOSITIVEISINTEGERRANGE1TOINTEGER‘HIGH;33.2022/11/269)標準數據類型——自然數(NATURAL)和正整數(POS8)標準數據類型——時間(TIME)型VHDL中惟一的預定義物理類型。用于仿真系統,實際運行情況不能被邏輯綜合。完整的時間類型包括整數和物理量單位兩部分,整數和單位之間至少留一個空格。55ms,20ns如無空格,有的仿真器給出警告。34.2022/11/268)標準數據類型——時間(TIME)型VHDL中惟一的預定標準數據類型——時間(TIME)型STANDARD程序包中時間類型定義如下:TYPETIMEISRANGE-2147483647TO2147483647unitsfs;--飛秒,VHDL中的最小時間單位
ps=1000fs;--皮秒
ns=1000ps;--納秒
us=1000ns;--微秒
ms=1000us;--毫秒
sec=1000ms;--秒
min=60sec;--分
hr=60min;--時enduntis;35.2022/11/26標準數據類型——時間(TIME)型STANDARD程序包10)標準數據類型——錯誤等級(SEVERITY_LEVEL)在VHDL仿真器中,錯誤等級用來指示設計系統的工作狀態,共有四種可能的狀態值:note(注意)、warning(警告)、error(出錯)、failure(失敗)。在仿真過程中,可輸出這四種值來提示被仿真系統當前的工作情況。不能被邏輯綜合。36.2022/11/2610)標準數據類型——錯誤等級(SEVERITY_LEVEL可以由用戶自定義的數據類型有8種。枚舉類型整數類型實數類型數組類型記錄類型時間類型存取類型文件類型
用戶自定義的數據類型以及子類型,其基本元素一般仍屬VHDL的標準(預定義)數據類型。
VHDL仿真器支持所有的數據類型,但VHDL綜合器并不支持所有的標準(預定義)數據類型和用戶自定義數據類型。如real、time、file、access等數據類型。在綜合中,它們將被忽略或宣布為不支持。枚舉類型、整數類型、一維數組肯定能被邏輯綜合。2、用戶定義的數據類型37.2022/11/26可以由用戶自定義的數據類型有8種。枚舉類型整數類型實數類型數自定義數據類型的書寫格式type
數據類型名
is
數據類型定義[of基本數據類型];設計者自定,可以是任一標示符描述所定義的數據類型的表達方式和表達內容可有可無指數據類型定義中所定義的元素的基本數據類型,一般都是取已有的預定義數據類型,如bit、std_logic或integer等38.2022/11/26自定義數據類型的書寫格式type數據類型名is數據1)用戶自定義類型——枚舉類型枚舉:將變量的值一一列舉出來,變量的值只限于列舉出來的值的范圍。VHDL中的枚舉數據類型是用文字符號來表示一組實際的二進制數的類型(若直接用數值來定義,則必須使用單引號)。type
M_state
is
(state1,state2,state3,state4,state5);signalcurrent_state,next_state:M_state;枚舉類型數據的定義格式如下:Type
數據類型名
is(元素1,元素2,……);信號current_state和next_state的數據類型定義為M_state,從state1~state5共5個取值。例如:39.2022/11/261)用戶自定義類型——枚舉類型枚舉:將變量的值一一列舉出來,用戶自定義類型——枚舉類型在綜合過程中自動編碼一般將第一個枚舉量(最左邊的量)編碼為0,以后的依次加1。在編碼過程中自動將枚舉元素轉變成位矢量位矢的長度將取能夠表達的所有枚舉元素的最小值用于表達5個狀態的位矢量長度應該為3位,編碼默認值為如下方式:state1=‘000’;state2=‘001’;state3=‘010’;state4=‘011’;state5=‘100’;為了某些特殊的需要,編碼順序也可以人為設置40.2022/11/26用戶自定義類型——枚舉類型在綜合過程中自動編碼40.2022例如ArchitecturebehaveofmenuisType
weekis(sun,sat,fir,thu,wed,tue,mon);Typebreakfastis(porridge,milk,egg,noodle,bread, milk,egg);Signal
today:week;Signal
eatable:breakfast;Beginprocess(pin)begincasepiniswhen“000”=>today<=sun;when“001”=>today<=sat;
:
when“111”=>today<=mon;endcase;
Casetodayiswhen”sun”=>eatable<=porridge;when”sat”=>eatable<=milk;
: :
when”mon”=>eatable<=egg;endcase; ∶Endprocess;Endbehave;41.2022/11/26例如Architecturebehaveofmenu2)用戶自定義類型——整數類型和實數類型目的:標準的程序包中的定義取值定義范圍太大,綜合器綜合結果占有資源太多。用戶根據實際的需要限定其取值范圍,以便能使綜合器更好的綜合。定義格式:TYPE數據類型名IS數據類型定義約束范圍;約束范圍:range(數據范圍)如:TYPEdigitISINTEGERRANGE0TO9;如:TYPEcurrentISREALRANGE-1E4TO1E4;42.2022/11/262)用戶自定義類型——整數類型和實數類型目的:42.20223)用戶自定義類型——數組類型數組:是將一組具有相同數據類型的元素集合在一起,作為一個數據對象來處理的數據類型。可以是一維(每個元素只有一個下標)或多維(每個元素有多個下標)。VHDL仿真器都支持,但VHDL綜合器只支持一維數組。VHDL允許定義兩種不同類型的數組:限定性數組和非限定性數組限定性數組:下標的取值范圍在數組定義時就被確定;非限定性數組:下標的取值范圍需留待隨后根據具體數據對象再確定。43.2022/11/263)用戶自定義類型——數組類型數組:43.2022/11/2限定性數組定義語句格式如下:type數據類型名isarray
范圍of
原數據類型;如:TYPEwordISARRAY(1TO8)OFSTD_LOGIC;數據類型名稱是word,8個元素,下標排序是1,2,3,4,5,6,7,8,各元素的排序是word(1),word(2),…,word(7),word(8)。每個元素的數據類型為std_logic。注意:若范圍一項的數據類型沒有,則默認integer類型若用其它數據類型指定范圍,應在指定范圍前加數據類型名新定義的限定性數組類型的名稱,可以是任何標識符;指出數組元素數量和排序方式,一般用整數來表示其范圍;指數組各元素的數據類型用戶自定義類型——數組類型:限定性數組44.2022/11/26限定性數組定義語句格式如下:type數據類型名isa用戶自定義類型——數組類型:限定性數組用其它的數據類型指定范圍舉例:TYPEinstructionIS(ADD,SUB,INC,SRL,SRF,LDA,LDB,XFR);SUBTYPEdigitISINTEGERrange0TO9;TYPEinsflagISARRAY(instructionADDTOSRF)OFdigit;這數組有五個元素,元素的下標是ADD到SRF,每個元素數據類型是digit。數組常在總線、ROM和RAM中使用。例如:設計一個256×8的ROM存儲器Subtypewordis
std_logic_vector(7dowmto0);Typememoryisarray(0to255)
ofword;Varaiblerom:memory;45.2022/11/26用戶自定義類型——數組類型:限定性數組用其它的數據類型指定范用戶自定義類型——數組類型:非限制性數組格式:TYPE數組名ISARRAY(數組下標類型RANGE<>) OF數據類型;TYPESTD_LOGIC_VECTORISARRAY(NATURAL RANGE<>)OFSTD_LOGIC;VARABLEVA:STD_LOGIC_VECTOR(0TO6);(具體數據對象)46.2022/11/26用戶自定義類型——數組類型:非限制性數組格式:TYPE數組二維數組定義格式:Type
數據類型名isarray(行范圍,列范圍)
of
原數據類型;例如:TYPEmemoryISARRAY(0TO5,7DOWNTO0)OFSTD_LOGIC;CONSTANTromdata:memory:= ((‘0’,‘0’,‘0’,‘0’,‘0’,‘0’,‘0’,‘0’), (‘0’,‘1’,‘1’,‘1’,‘0’,‘0’,‘0’,‘1’), (‘0’,‘0’,‘0’,‘0’,‘0’,‘1’,‘0’,‘1’), (‘1’,‘0’,‘1’,‘0’,‘1’,‘0’,‘1’,‘0’), (‘1’,‘1’,‘0’,‘1’,‘1’,‘1’,‘0’,‘0’) (‘1’,‘1’,‘1’,‘1’,‘1’,‘1’,‘1’,‘1’));Signaldata_bit:STD_LOGIC;Data_bit<=romdata(3,7);47.2022/11/26二維數組定義格式:47.2022/11/254)用戶自定義類型——記錄類型由已定義的、數據類型不同的對象元素構成的數組語句格式:TYPE記錄類型名ISRECORD
元素名:元素數據類型;元素名:元素數據類型;
…ENDRECORD[記錄類型名];48.2022/11/264)用戶自定義類型——記錄類型由已定義的、數據類型不同的對象用戶自定義類型——記錄類型舉例TYPEbankISRECORD--將bank定義為四元素記錄類型
addr0﹕STD_LOGIC_VECTOR(7DOWNTO0);
addr1﹕STD_LOGIC_VECTOR(7DOWNTO0);
r0﹕INTEGER; inst﹕instruction;(假設是以前定義好的枚舉數據類型)ENDRECORD;SIGNALaddbus1,addbus2:STD_LOGIC_VECTOR(7 DOWNTO0);SIGNALresult:INTEGER;SIGNALalu_code:instruction;SIGNALr_bank:bank:=(“00000000”,”00000000”,0,ADD);…addbus1<=r_bank.addr1;r_bank.inst<=alu_code;49.2022/11/26用戶自定義類型——記錄類型舉例TYPEbankISRE3、用戶定義的子類型子類型是由用戶對已定義的原數據類型做一些范圍限制而形成的一種新的數據類型。子類型SUBTYPE的語句格式如下:Subtype
子類型名
is
基本數據類型名[范圍];例如:subtypeabus
is
std_logic_vector(7downto0);
signal
aio:std_logic_vector(7downto0);
signalbio:std_logic_vector(15downto0);
signalcio:abus;
aio<=cio;
bio<=cio; 對嗎?50.2022/11/263、用戶定義的子類型子類型是由用戶對已定義的原數據類型做一些5、數據類型的限定數據類型可以根據所描述的文字的上下關系來判斷SIGNALa:STD_LOGIC_VECTOR(7DOWNTO0);a<=“01101010”;--STD_LOGIC_VECTOR有時判斷不出來CASE(a&b&c)IS--無法斷定(a&b&c)的類型WHEN“001”=>Y<=“01111111”;WHEN“010”=>Y<=“10111111”;…ENDCASE;限定方法SUBTYPESTD3BITISSTD_LOGIC_VECTOR(0TO2);CASESTD3BIT’(a&b&c)IS--限定(a&b&c)的類型為STD3BIT--限定方法:數據類型名’對象名51.2022/11/265、數據類型的限定數據類型可以根據所描述的文字的上下關系來判6、IEEE標準STD_LOGIC和STD_LOGIC_VECTOR在IEEE庫的程序包STD_LOGIC_1164中,定義了兩個非常重要的數據類型,即標準邏輯位STD_LOGIC
和標準邏輯矢量STD_LOGIC_VECTOR。它們是對bit和bit_vector兩種數據類型的補充。Bit
只有‘0’和‘1’兩種狀態。標準邏輯位STD_LOGIC在STD_LOGIC_1164包集合中的定義的語句如下:TYPESTD_LOGICIS(‘U’,‘X’,‘0’,‘1’,‘Z’,‘W’,‘L’,‘H’,‘-’);‘U’--未初始化的,‘X’--強不定態,‘0’--強0,‘1’--強1,‘Z’--高阻態,‘W’--弱不定態,'L'--弱0,'H'--弱1,'-'--忽略標準邏輯矢量STD_LOGIC_VECTOR(二進制)他是由一組STD_LOGIC元素組成的一維數組;在STD_LOGIC_1164包集合中的定義的語句如下:TYPESTD_LOGIC_VECTORISARRAY(NATURALRANGE<>)OFSTD_LOGIC;52.2022/11/266、IEEE標準STD_LOGIC和STD_LOGIC_VE注意:(1)Bit_vector:可以是二進制數,也可以是十六進制數或八進制;還可使用“_”將二進制數隔開。(2)Std_logic_vector:只能是二進制數。(3)在使用時,必須在程序的開頭說明包含著兩種數據類型的包集合和包集合所在的庫。Libraryieee; UseIEEE.std_logic_1164.all;53.2022/11/26注意:(1)Bit_vector:可以是二進制數,也可以是十4、數據類型的轉換VHDL是一種強類型語言即使對于數據類型非常接近的數據對象,在相互操作時,也需要進行數據類型轉換。類型轉換函數通常由VHDL語言包集合提供54.2022/11/264、數據類型的轉換VHDL是一種強類型語言54.2022/1STD_LOGIC_1164包集合
中定義的數據類型轉換函數及對應的數據類型轉換如下:to_stdlogicvector(A)to_bitvector(A)to_stdlogic(A)to_bit(A)
由bit_vector轉換成std_logic_vector由std_logic_vector轉換成bit_vector由bit轉換成std_logic由std_logic轉換成bit
變換函數通常由三個包集合提供:在VHDL語言中,不同類型的數據是不能進行運算和代入的,要實現這些操作必須進行數據類型的轉換。4、數據類型的轉換(續)55.2022/11/26STD_LOGIC_1164包集合中定義的數據類型轉換函數STD_LOGIC_ARITH包集合中定義的數據類型轉換函數集對應的數據類型轉換如下:conv_std_logic_vector(A,位長)conv_integer(A)
由integer,unsigned和signed轉換成std_logic_vector由unsigned和signed轉換成integer
STD_LOGIC_UNSIGNED包集合定義的數據類型轉換函數集對應的數據類型轉換如下:conv_integer(A)
由std_logic_vector轉換成integer4、數據類型的轉換(續)56.2022/11/26STD_LOGIC_ARITH包集合中定義的數據類型轉換函數數據類型轉換舉例LIBRARY
IEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYadd5ISPORT(num:INSTD_LOGIC_VECTOR(2DOWNTO0);
…ENDadd5;ARCHITECTURErtlOFadd5ISSIGNALin_num:INTEGERRANGE0TO7;
…BEGIN
In_num<=CONV_INTEGER(num);ENDrtl;
57.2022/11/26數據類型轉換舉例LIBRARYIEEE;57.2022/12.2.3VHDL語言的運算操作符算術運算符:REM,MOD,/,*,-(取負),+(取正),-,+, **,ABSVHDL的各種表達式由操作數和操作符組成,其中操作數是各種運算的對象,而操作符則規定運算的方式VHDL語言的運算操作符分為4類:邏輯運算符:NOT,XOR,NOR,NAND,OR,AND關系運算符:>=,<=,>,<,/=,=并置運算符:&六種移位操作符號SLL、SRL、SLA、SRA、ROL和ROR是VHDL‘93標準新增的運算符。省略賦值操作符:(OTHERS=〉X)58.2022/11/262.2.3VHDL語言的運算操作符算術運算符:REM,MO運算符的優先級書P43頁表2-5中運算符一項中每一行的優先級相同。六種移位操作符號SLL、SRL、SLA、SRA、ROL和ROR優先級高于一般的關系運算符。59.2022/11/26運算符的優先級書P43頁表2-5中運算符一項中每一行的優1、邏輯運算符注意:(1)只可以對std_logic,std_logic_vector,bit,bit_vector,boolean型數據進行邏輯運算。(2)運算符的左右及代入的信號數據類型必須相同。(3)在一個語句中,若有兩個以上的邏輯表達式時,有時需在相應的表達式中加括號。例如:X<=(aandb)or(notcandd);(4)如果一個邏輯表達式中只有AND,OR,XOR運算符,括號可省略。其他不行。例如:A<=((bnandc)nandd)nande;
1011A<=bnand(cnand(dnande));因為除NOT優先級最高外,其余優先級相同。同一個表達式中,具有多個優先級相同的邏輯運算符時,先完成括號內運算,否則它們的先后順序是隨機的。60.2022/11/261、邏輯運算符注意:(1)只可以對std_logic,std2、算術運算符REM,MOD,/,*,-(取負),+(取正),-,+,**,ABS-,+(負、正):一元運算操作符,操作數可以是任何數值類型在實際使用中,取負操作數需加括號。如:Z:=X*(-Y);-,+(加、減):操作數可以是任何數值類型,操作數的類型原則上必須一致。*,/:數據類型是整數和實數。對物理類型的數據對象也可以運算操作(1)乘法和除法運算是可綜合的,但從優化綜合、節省芯片資源的角度出發,最好不要輕易使用乘除操作符。注意:(2)只有分母操作數為2乘方的常數時,才可以綜合。只有在左邊為實數時,其右邊才可以為負數。一般地,VHDL綜合器要求乘方操作符作用的操作數的底數必須是2**:左邊可以是整數或實數,但右邊必須為整數。ABS:無限制MOD,REM:操作數數據類型只能是整數,運算操作結果也是整數只有分母操作數為2乘方的常數時,才可以綜合。61.2022/11/262、算術運算符REM,MOD,/,*,-(取負),+3、關系運算符關系運算符:>=,<=,>,<,/=,=不同的關系運算符對兩邊的操作數的數據類型有不同的要求,但結果都是BOOLEAN型。
>=,<=,>,<:整數、實數、std_logic、bit及,bit_vector,std_logic_vector注意: (1)操作數的數據類型必須一致(2)位長可以不同。但可能出錯。 (3)位矢量數據比較從左到右按位比較,當比較其中一位不等,則給 出結果,不再繼續下一位的比較。例如:Signala:std_logic_vector(3downto0);Signalb:std_logic_vector(2downto0);若要進行位長不同的位矢量的關系運算必須加入語句
Libraryieee; useieee.std_logic_unsigned.all例如:a<=”1010”;b<=”111”;If(a>b)then62.2022/11/263、關系運算符關系運算符:>=,<=,>,<,/=,=例如:4、并置(連接)運算符&并置運算符&完成一維數組的連接;其操作過程是將右操作數連接在左操作數的后邊,形成一個新的一維數組;常用于位或位矢量類型對象的連接。圖2-3所示:
y(0)=b(0)anden y(1)=b(1)anden y(2)=b(2)anden y(3)=b(3)anden y(4)=a(0) y(5)=a(1) y(6)=a(2) y(7)=a(3)
從左邊可以看出a,b是四位長度的矢量,而y的位長是8位,上述情況可以表示成:
tmp_b<=bAND(en&en&en&en);
y<=a&tmp_b;
注意:(1)位連接也可以用集合體的方法,將并置符“&”換成“,”即可(2)集合體的方法,不適應于有位矢量的連接。63.2022/11/264、并置(連接)運算符&并置運算符&完成一維數組的連接;圖2并置(連接)運算符舉例例如:tmp_b<=bAND(en,en,en,en);
y<=(a,tmp_b);
對嗎?集合體可以用指定位的腳標表示:
signaltmp_c:std_logic_vector(3downto0); tmp_c<=(3=>en,2=>en,1=>en,0=>en);或 tmp_c<=(2=>’0’,others=>en);如果用此方法,others項必放最后。或 tmp_c<=(others=>en);或 tmp_c<=(3downto0=>en);64.2022/11/26并置(連接)運算符舉例例如:tmp_b<=bAND(en5、省略賦值操作符(聚合賦值符)格式:others=>’X’例如:Signald1:STD_LOGIC_VECTOR(7DOWNTO0);d1<=(others=>’0’);一般用于較多位的位矢量賦值中有多位值相同時,做省略化的賦值。65.2022/11/265、省略賦值操作符(聚合賦值符)一般用于較多位的位矢量賦值中習題1、定義一個常數,數據類型為實數,數值任意。2、定義一個變量,數據類型為16位標準邏輯位矢量,然后將二進制數1111101100110000對其賦值。3、定義一個變量,數據類型為位類型且給初始值0。4、定義一個信號,數據類型為0到255的所有整數。5、定義枚舉類型,類型名為state,包含元素為S1,S2,S3,S4,S5五個元素,然后用該數據類型定義信號now_state和next_state。6、改正下面標示符中錯誤:
#state,temp-1,signal,2apple,state__1,*Vcc,GND_7、signalA,B,C:BIT;signalD:bit_vector(0to2);signalE:bit_vector(0to5);將A、B、C連接起來賦值給D;將A、B、C、D連接起來賦值給E;66.2022/11/26習題1、定義一個常數,數據類型為實數,數值任意。將A、B、C習題續8、設計一個系統,它有3個輸入端口,它們的數據類型為std_logic;
一個輸出端口,類型為std_logic_vector(0to3)。試寫出該系統設計實體VHDL程序框架結構。要求結構體中說明信號A、B,它們為std_logic類型。功能描述用一個process語句,其中需說明變量c,為std_logic類型。所有信號均為process語句的敏感信號。67.2022/11/26習題續8、設計一個系統,它有3個輸入端口,它們的數據類型為sVHDL語言程序通常包含5部分:實體說明、構造體、配置、包集合、庫實體說明構造體配置包集合和庫68.2022/11/26VHDL語言程序通常包含5部分:實體說明、構造體、配置、包集2.3VHDL語言設計的基本單元及其構成VHDL語言設計的基本單元就是一個設計實體。庫、程序包調用說明ENTITY(實體)說明ARCHITECTURE(結構體)說明注意:庫、程序包調用說明語句不是必須的,需要則有;另外兩部分是必須有的。VHDL語言描述設計實體的一般格式:69.2022/11/262.3VHDL語言設計的基本單元及其構成VHDL語言設VHDL語言一般結構舉例Libraryieee;Useieee.std_logic_1164.all;EntityfredividerisPort(clock:instd_logic; clkout:outstd_logic);Endfredivider;Architecturebehavioroffredivideris signalclk:std_logic;BeginProcess(clock)Begin if(clock’eventandclock=‘1’)then clk<=notclk;endif;Endprocess;clkout<=clk;Endbehavior;庫包集合使用說明實體說明構造體說明70.2022/11/26VHDL語言一般結構舉例Libraryieee;庫包集合使VHDL語言基本單元組成:實體說明+構造體說明例2-11:二選一電路設計單元的VHDL描述:
ENTITYmuxIS
generic(m:time:=1ns);
PORT(d0,d1,sel:inbit;q:outbit);ENDmux;Architecturedataflow
ofmuxisBegin
process(d0,d1,sel)
variabletmp1,tmp2,tmp3:bit;
begintmp1:=d0andsel;tmp2:=d1and(notsel);tmp3:=tmp1ortmp2; q<=tmp3afterm;
endprocess;End
dataflow;d0d1selq&&≥1qd0d1sel實體說明構造體說明71.2022/11/26VHDL語言基本單元組成:實體說明+構造體說明例2-11:二2.3.1實體說明
實體說明是一個設計實體的表層設計單元,描述設計實體與外部電路的接口部分;規定設計單元的輸入輸出接口信號或引腳,是設計實體經封裝后對外的一個通信界面。實體說明用于定義電路的輸入輸出引腳,但并不描述電路的具體構造和實現的功能。ENTITYFredeviderisport(clock:instd_logic;clkout:outstd_logic);end;clockclkoutFredevider輸入輸出72.2022/11/262.3.1實體說明實體說明是一個設計實體的表1、實體說明格式(語句結構)實體說明的常用語句結構如下:
ENTITY
實體名IS[GENERIC(類屬表);][PORT(端口表);]END【實體名】;中間在方括號內的語句描述,在特定的情況下并非是必須的。例如:構建一個VHDL仿真測試基準等情況中可以省去方括號中的語句。73.2022/11/261、實體說明格式(語句結構)實體說明的常用語句結構如下:中間實體聲明格式具體說明(續)1)實體名實體名必須與文件名相同,否則編譯時會出錯。74.2022/11/26實體聲明格式具體說明(續)1)實體名74.2022/11/2
2)類屬參數
可選項。類屬(GENERIC)參數是一種端口界面常數,常以一種說明的形式放在實體說明部分。是一些信息,默認的參數值。如端口大小、總線寬度、時間等。類屬參數說明的一般書寫格式如下:
GENERIC(類屬參數名1,(類屬參數名2):數據類型[:=設定值] [;常數名n:數據類型[:設定值]]);75.2022/11/26
2)類屬參數
可選項。類屬(GENERIC)參數是
2)類屬參數(續)
例如:
ENTITYMCKIS
GENERIC(WIDTH:INTEGER:=16;
RISEW:TIME:=1ns;
FALLW:TIME:=1ns);
PORT(ADD_BUS:OUTSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0));ENDMCK;注意:(1)類屬參數值可以為本實體所屬的結構體使用。(2)
類屬參數作為常量使用,在定義它的實體內使用時不能修改。(3)該模塊被調用時從外部傳入參數值。76.2022/11/26
2)類屬參數(續)
例如:注意:76.2022/11/253)端口說明端口說明是對于一個設計實體與外部接口的描述。或者說:是CPLD/FPGA器件外部引腳信號的名稱、數據類型和傳輸方向的描述。端口說明書寫格式如下:Port
(端口名1:方向數據類型;--每個端口說明用分號隔開;端口名2{,端口名3}:方向數據類型;--每個端口說明可以 --說明多個端口
…
端口名n:方向數據類型);--最后一個端口說明不用分號a)端口名:是設計者為實體的每一個對外通道所取的名字;即實現該設計程序的器件外部引腳的名稱——標示符77.2022/11/263)端口說明端口說明是對于一個設計實體與外部接口的描述。Pob)端口方向(端口模式)端口模式符號含義IN輸入OUT輸出(結構體內部不能讀取)INOUT雙向(輸入輸出)BUFFER輸出(結構體內部可讀取)端口模式:是指這些端口上的數據流動方式,如輸入或輸出 等;省略為輸入(IN)。
注意:端口均為信號,不能作為變量和常量使用。端口模式符號及其含義如下表:INOUTBUFFERINOUT78.2022/11/26b)端口方向(端口模式)端口模式符號含義IN輸入OUT輸出c)端口數據類型標準類型:BIT和BIT_VICTOR(integer不提倡用)擴展類型:STD_LOGIC和STD_LOGIC_VECTOR擴展類型需要庫和程序包的支持,并且需要在程序中指明:libararyieee;Useieee.std_logic_1164.all;注意:端口信號與類屬參數的數據類型不能在entity中定義,必須在程序包package中預先定義。79.2022/11/26c)端口數據類型標準類型:BIT和BIT_VICTOR(in4)實體聲明格式注意事項EntityfredividerisPort (clock:instd_logic; clkout:outstd_logic );Endfredivider;實體名與保存的文件名必須相同最后一個端口聲明后無分號端口名端口模式(方向)端口數據類型80.2022/11/264)實體聲明格式注意事項Entityfredivider5)實體說明舉例RS觸發器VHDL描述中的實體說明部分說明如下:
ENTITYrsffISPORT(set,reset:INBIT;q,qb:BUFFERBIT);ENDrsff;練習:寫出下面3-8譯碼器的實體說明部分。(En為一位控制端)RS觸發器元件圖RS觸
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 租賃合同注銷協議范文
- 紙箱合同協議范本大全
- 高考協議班合同
- 砼班組勞務合同范文
- 四年級下冊數學教學工作總結范文4篇
- 倉儲保管合同
- 靈活應變2024年農藝師考試應對技巧試題及答案
- 農業職業經理人考試的政策環境分析試題及答案
- 2024年花藝師考試回顧與展望試題及答案
- 2024年園藝師考試材料準備規范試題及答案
- 化妝品生產質量管理規范與流程
- 矩形的判定公開課公開課獲獎課件百校聯賽一等獎課件
- GB/T 39673.6-2024住宅和樓宇電子系統(HBES)及樓宇自動化和控制系統(BACS)第6部分:規劃和安裝要求
- 醫療機構消防安全突出火災風險和檢查要點
- 焊接工程勞務分包
- 中國礦業大學《自然辯證法》2022-2023學年期末試卷
- 化工和危險化學品重大隱患考試試題(后附答案)
- 常見皮膚病患兒的護理(兒科護理課件)
- Lesson 8 FirstSecondThird(教學設計)-2023-2024學年冀教版(三起)英語四年級下冊
- (中級)高低壓電器及成套設備裝配工技能鑒定考試題庫(含答案)
- 遼寧省部分高中2023-2024學年高一下學期4月月考化學試題【含答案解析】
評論
0/150
提交評論