版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
4.1VHDL語言概述
4.2VHDL語言的特點
4.3VHDL語言的數(shù)據(jù)類型
4.4VHDL的數(shù)據(jù)對象
4.5運算操作符
4.6實訓:設(shè)計2選1數(shù)據(jù)選擇器
習題4.1VHDL語言概述
VHDL(Very-high-speedIntegratedCircuitHardwareDescriptionLanguage)誕生于1982年,是美國國防部委托IBM和TexasInstruments聯(lián)合開發(fā)的。該語言的設(shè)計目標有兩個:一是使設(shè)計者可以用一種語言來描述他們希望描述的復雜電路;二是希望這種語言成為一種標準,使VHSIC計劃中的每一個成員都能夠按照標準格式向別的成員提供設(shè)計。
1986年,VHDL被建議作為IEEE標準,經(jīng)過了多次修改后,到1987年12月,它被接納為IEEE的標準。自IEEE公布了VHDL的標準版本——IEEE1076(簡稱87版)之后,各EDA公司相繼推出了自己的VHDL設(shè)計環(huán)境,或宣布自己的設(shè)計工具可以和VHDL接口。此后,VHDL在電子設(shè)計領(lǐng)域得到了廣泛應(yīng)用,并逐步取代了原有的非標準硬件描述語言。1993年,IEEE對VHDL進行了修訂,增加了文件類型與說明語句,增加了文件操作的功能,增加了操作符,并定義了共享變量,端口映射中可以采用常量等,從更高的抽象層次和系統(tǒng)描述能力上擴展了VHDL的內(nèi)容。?新版本的VHDL即IEEE-1076-1993版本(簡稱93版),讀者可參閱相應(yīng)的手冊?,F(xiàn)在,VHDL和VerilogHDL作為IEEE的工業(yè)標準硬件描述語言,在電子工程領(lǐng)域已成為事實上的通用硬件描述語言。有專家認為,在新的世紀中,VHDL與VerilogHDL將承擔起大部分的數(shù)字系統(tǒng)設(shè)計任務(wù)。本書主要是以87版為基礎(chǔ)編寫的,在用一些EDA工具軟件進行編譯時,要事先指定版本號,這一點請注意。
VHDL主要用于描述數(shù)字系統(tǒng)的結(jié)構(gòu)、行為、功能和接口。除了含有許多具有硬件特征的語句外,VHDL的語言形式、描述風格與句法與一般的計算機高級語言基本相同。4.2VHDL語言的特點如今,大多數(shù)EDA工具軟件都采用VHDL語言作為主要的硬件描述語言,這主要源于VHDL強大的自身功能與特點。VHDL語言有如下特點:
(1)?VHDL是工業(yè)標準的文本格式語言。VHDL已成為一種工業(yè)標準,設(shè)計者、EDA工具供應(yīng)商以及芯片生產(chǎn)廠家都要遵循這一標準。該語言是一種文本格式的語言,ASIC的設(shè)計者在設(shè)計電路時,就像編寫其他高級語言一樣,用文本來表達所要設(shè)計的電路,這樣能比較直觀地表達設(shè)計者的設(shè)計思想,并且易于修改。
(2)?VHDL具有強大的描述能力。VHDL語言既可以描述系統(tǒng)級電路,也可以描述門級電路;既可以采用行為級描述、數(shù)據(jù)流描述或結(jié)構(gòu)化描述,也可以采用三者混合的描述方式。VHDL還支持慣性延遲和傳輸延遲,可以方便地建立電子系統(tǒng)的模型,其強大的描述功能主要來自于強大的語法結(jié)構(gòu)和豐富的數(shù)據(jù)類型。
(3)?VHDL能同時支持仿真與綜合。VHDL語言是一種能夠支持系統(tǒng)仿真的語言。事實上,ASIC成功的關(guān)鍵在于生產(chǎn)前的設(shè)計,而保證設(shè)計正確性的主要手段就是系統(tǒng)仿真。目前大部分的EDA工具支持VHDL語言級仿真。這樣,設(shè)計者在ASIC生產(chǎn)前就能夠知道設(shè)計的正確與否、系統(tǒng)的性能如何等關(guān)鍵問題。
VHDL不僅僅是一種仿真語言,它的大部分語句是可綜合的,但也有一部分不支持綜合,但其中的可綜合語句足以描述一個大而完整的系統(tǒng)。目前所有的高層綜合工具所支持的綜合語句都是IEEE標準的一個子集。因此,VHDL語言可以有兩種完全不同的描述:一種是基于仿真的描述,它可以使用VHDL定義的各種語句,這類程序主要供編寫測試基準程序和各種仿真模型的工程師使用;另外一種是用于生成具體電路的可綜合描述,它只能使用VHDL中的可綜合子集,這類程序主要供從事電路設(shè)計的工程師使用,本書中主要偏重于這種類型的VHDL描述。
(4)?VHDL是一種并發(fā)執(zhí)行的語句。幾乎所有高級語言程序的執(zhí)行都是順序的,而VHDL語言執(zhí)行在總體上是并行的,這種特性符合實際邏輯電路的工作過程。
(5)?VHDL支持結(jié)構(gòu)化設(shè)計與top-down設(shè)計方法。VHDL語言是一種結(jié)構(gòu)化的語言,它提供的語句可以完成多層結(jié)構(gòu)的描述,因此VHDL語言支持結(jié)構(gòu)化設(shè)計。結(jié)構(gòu)化設(shè)計就是將一個系統(tǒng)劃分為多個模塊,而每個模塊又可以繼續(xù)劃分為更多的子模塊。EDA設(shè)計是自頂向下的,由于VHDL語言支持結(jié)構(gòu)化設(shè)計,因而就可以采用top-down設(shè)計方法,從系統(tǒng)整體要求出發(fā),自上而下地逐步將系統(tǒng)內(nèi)容細化,最后完成系統(tǒng)設(shè)計。
(6)?VHDL的描述與工藝無關(guān)。設(shè)計者在利用VHDL描述電路時并不需要關(guān)心電路最終將采用哪種工藝實現(xiàn),EDA工具可以將VHDL源代碼映射到不同的工藝庫上,提高了設(shè)計的可重用性。
VHDL語言還有共享與調(diào)用功能。利用VHDL設(shè)計的電路是文本格式的程序,易于保存與管理。4.3VHDL語言的數(shù)據(jù)類型作為一種硬件描述語言,VHDL與其它高級語言一樣,其信號、變量、常量都要指定數(shù)據(jù)類型。VHDL提供了多種標準的數(shù)據(jù)類型,還可以由用戶自定義數(shù)據(jù)類型。VHDL數(shù)據(jù)類型的定義相當嚴格,不同類型之間的數(shù)據(jù)不能直接代入,即使數(shù)據(jù)類型相同、長度不同也不能直接代入。4.3.1預(yù)定義(標準)數(shù)據(jù)類型
VHDL的預(yù)定義數(shù)據(jù)類型都是在VHDL標準的程序包STANDARD中定義的,在實際使用時,會自動包含到VHDL的源程序中,因此不必通過USE語句進行調(diào)用。
1.位(BIT)與位矢量(BIT_VECTOR)數(shù)據(jù)類型
在數(shù)字系統(tǒng)中,信號通常用一個位來表示,取值只能是“1”或“0”。如果一個量一次可取多個位值,則在VHDL語言中把它定義為位矢量。位矢量其實是基于BIT數(shù)據(jù)類型的數(shù)組。使用位矢量必須注明位長,即數(shù)組中元素的個數(shù)和排列情況。
【例4-1】SIGNAL
a:BIT_VECTOR(7DOWNTO0);
說明:信號a被定義為一個8位位長的矢量,其最左邊是a(7),最右邊是a(0)。
【例4-2】SIGNAL
a:BIT_VECTOR(0TO7);
說明:信號a被定義為一個8位位長的矢量,其最左邊是a(0),最右邊是a(7)。
位與位矢量可以按位進行訪問,也可以進行邏輯運算。
2.整數(shù)(INTEGER)數(shù)據(jù)類型
整數(shù)數(shù)據(jù)類型與算術(shù)中的整數(shù)定義相同,其取值范圍為
-(231-1)~+(231-1),可以進行加、減、乘、除等算術(shù)運算。整數(shù)的取值范圍比較大,而VHDL語言是硬件描述語言,為了確定整數(shù)的存儲空間,VHDL綜合器要求用RANGE為所定義的整數(shù)限定范圍,然后根據(jù)所限定的范圍來決定表示此信號或變量的二進制數(shù)的位數(shù)。
【例4-3】SIGNAL
abus:INTEGERRANGE0TO15;
說明:abus是一個整數(shù),其取值為0~15。
在應(yīng)用時整數(shù)不能按位訪問,并且對整數(shù)也不能用邏輯操作符。如果需要進行邏輯操作或按位訪問操作,則可以運用類型轉(zhuǎn)換函數(shù)將整數(shù)轉(zhuǎn)換成BIT_VECTOR類型的數(shù)后再進行操作。綜合器對abus綜合時可用4位二進制數(shù)來表示,因此,abus將被綜合成由4條信號線構(gòu)成的信號。
整數(shù)常量的書寫方式見例4-4。
【例4-4】?3(十進制整數(shù)),10E4(十進制整數(shù)),16#D2#(十六進制整數(shù)),2#11011010#(二進制整數(shù))。
3.布爾(BOOLEAN)數(shù)據(jù)類型
布爾數(shù)據(jù)類型只有“真”和“假”兩個狀態(tài)。布爾數(shù)據(jù)類型沒有數(shù)值含義,不能進行算術(shù)運算,但可以進行關(guān)系運算,可以在IF語句中被測試,產(chǎn)生一個布爾量。如果有一個布爾類型的信號名為BE,對其進行賦值:BE<=(5>2)(“<=”為信號賦值語句),則BE的值為TRUE;如果為BE<=(5<2),則值為FALSE。綜合器對布爾類型的數(shù)值進行綜合時,將其變?yōu)?或0信號值,對應(yīng)于硬件系統(tǒng)中的一根連線。
4.字符(CHARACTER)與字符串(STRING)數(shù)據(jù)類型
字符類型通常用單引號引起來,如'A'。一般情況下,VHDL語言對于字母的大小寫不敏感,但是對于字符量中的大小寫字符卻認為是不一樣的。字符串數(shù)據(jù)類型是字符數(shù)據(jù)類型的一個非約束型數(shù)組,或稱為字符串數(shù)組。字符串必須用雙引號標明。
【例4-5】
SINGAL
STRING_VAR:STRING(1TO7);
…
STRING<="abcd";?_?_空格也作為一個字符
5.實數(shù)(REAL)數(shù)據(jù)類型
在進行算法研究或?qū)嶒灂r,作為對硬件方案的抽象手段,常常用到實數(shù)的四則運算。通常情況下,實數(shù)僅能在VHDL仿真中使用,實數(shù)的取值范圍為-1.0E38~+1.0E38。
實數(shù)常量的書寫方式見例4-6。
【例4-6】65971.333333(十進制浮點數(shù)),8#43.6#E+4(八進制浮點數(shù)),43.6E-4(十進制浮點數(shù))。
6.時間(TIME)數(shù)據(jù)類型
VHDL中唯一預(yù)定義的物理類型是時間。完整的時間類型包括整數(shù)和物理量單位兩部分,整數(shù)和單位之間至少留一個空格,如50ms、30ns。時間類型僅在仿真中使用,使模型系統(tǒng)更逼近實際系統(tǒng)的運行情況。
STANDARD程序包中也定義了時間,參見例4-7。
【例4-7】
TYPETIMEISRANGE-2147483647TO2147483647;
UNITS
fs: --飛秒,VHDL中最小的時間單位
ps=1000fs; --皮秒
ns=1000ps; --納秒
us=1000ns; --微秒
ms=1000us; --毫秒
sec=1000ms; --秒
min=60sec; --分
hr=60min; --時
ENDUNTIS;
7.自然數(shù)(NATURAL)和正整數(shù)(POSITIVE)數(shù)據(jù)類型
自然數(shù)是整數(shù)的一個子類型,是非負的整數(shù),包括零和正整數(shù)。正整數(shù)也是一個子類型,它包括整數(shù)中非零和非負的數(shù)值。自然數(shù)和正整數(shù)在STANDARD程序包中定義的源代碼見例4-8。
【例4-8】
SUBTYPENATURALISINTEGERRANGE0TOINTEGER‘HIGH;
SUBTYPEPOSITIVEISINTEGERRANGE1TOINTEGER'HIGH;
8.錯誤等級(SEVERITY
LEVEL)
在VHDL仿真器中,錯誤等級用來指示設(shè)計系統(tǒng)的工作狀態(tài),共有4種可能的狀態(tài)值:NOTE(注意)、WARNING(警告)、ERROR(錯誤)、FAILURE(失敗)。在仿真過程中,可輸出這4種值來提示被仿真系統(tǒng)當前的工作情況。4.3.2IEEE預(yù)定義標準邏輯位與矢量
1.標準邏輯位STD_LOGIC數(shù)據(jù)類型
在數(shù)字系統(tǒng)設(shè)計中,信號值通常用一個位(BIT)來表示,事實上用BIT數(shù)據(jù)類型去描述信號狀態(tài)是不夠的,數(shù)字系統(tǒng)中狀態(tài)的取值還有高阻、不定值等。為了更好地描述數(shù)字系統(tǒng),在IEEE庫的包集合STD_LOGIC和STD_LOGIC_1164中有如下的定義:
TYPE
std_logicIS(‘U’,‘X’,‘1’,‘0’,‘Z’,‘W’,‘L’,‘H’,‘-’);
表示std_logic數(shù)值類型具有9種不同的值:U(未初始化的)、X(強未知的)、0(強0)、1(強1)、Z(高阻態(tài))、W(弱未知的)、L(弱0)、H(弱1)、-(忽略)。把STD_LOGIC稱為標準的邏輯位,其對應(yīng)的矢量稱為標準邏輯位矢量。在IEEE庫的程序包STD_LOGIC_1164中,定義了兩個非常重要的數(shù)據(jù)類型,即標準邏輯位STD_LOGIC和標準邏輯矢量STD_LOGIC_?VECTOR。在仿真和綜合中,STD_LOGIC值是非常重要的,它可以使設(shè)計者精確模擬一些未知和高阻態(tài)的線路情況。對于綜合器,高阻態(tài)和忽略態(tài)可用于三態(tài)的描述。但就綜合而言,STD_LOGIC型數(shù)據(jù)能夠在數(shù)字器件中實現(xiàn)的只有其中4種值,即“-”、“0”、“1”和“Z”。當然,這并不表明其余的5種值不存在。這9種值對于VHDL的行為仿真都有重要意義。
2.標準邏輯矢量(STD_LOGIC_VECTOR)數(shù)據(jù)類型
STD_LOGIC_VECTOR類型定義如下:
TPYESTD_LOGIC_VECTORISARRAY(NATURALRANGE<>)OFSTD_LOGIC;
顯然,STD_LOGIC_VECTOR是定義在STD_LOGIC_1164程序包中的標準一維數(shù)組,數(shù)組中的每一個元素的數(shù)據(jù)都是以上定義的標準邏輯位STD_LOGIC。
STD_LOGIC_VECTOR數(shù)據(jù)類型的數(shù)據(jù)對象賦值的原則是:同位寬、同數(shù)據(jù)類型的矢量間才能進行賦值。例4-9描述的是CPU中數(shù)據(jù)總線上位矢量賦值的操作,注意例中信號數(shù)據(jù)類型定義和賦值操作中信號的數(shù)組位寬。描述總線信號,使用STD_LOGIC_VECTOR是方便的,但需注意的是總線中的每一個信號都必須定義為同一種STD_LOGIC數(shù)據(jù)類型。
3.其它預(yù)定義標準數(shù)據(jù)類型
VHDL綜合工具配備的擴展程序包中,還定義了一些有用的數(shù)據(jù)類型,如Synopsys公司在IEEE庫中加入的程序包STD_LOGIC_ARITH中定義了無符號型(UNSIGNED)、有符號型(SIGNED)、小整型(SMALL_INT)數(shù)據(jù):
TYPE
UNSIGNED
IS
ARRAY(NATURAL
RANGE<>)OF
STD_LOGIC;
TYPE
SIGNED
IS
ARRAY(NATURAL
RANGE<>)OF
STD_LOGIC;
SUBTYPE
SMAIL_INT
IS
INTEGER
RANGE
0TO1;如果將信號或變量定義為這三種數(shù)據(jù)類型,就可以使用程序包STD_LOGIC_ARITH中定義的運算符。在使用之前,請注意必須加入下面的語句:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_ARITH.ALL;
UNSIGNED類型和SIGNED類型是用來設(shè)計可綜合的數(shù)學運算程序的重要類型,UNSIGNED用于無符號數(shù)的運算。在實際運用中,多數(shù)運算都需要用到它們。在IEEE程序包中,NUMERIC_STD和NUMERIC_BIT程序包中也定義了UNSIGNED及SIGNED數(shù)據(jù)類型,NUMERIC_STD是針對于STD_LOGIC型定義的,而NUMERIC_BIT是針對于BIT型定義的。此外,程序包中還定義了相應(yīng)的運算符重載函數(shù)。有些綜合器沒有附帶STD_LOGIC_ARITH程序包,此時只能使用NUMERIC_STD和NUMERIC_BIT程序包。
在STANDARD程序包中沒有定義STD_LOGIC_VECTOR的運算符,而整數(shù)類型一般只在仿真的時候用來描述算法,因此UNSIGNED和SIGNED的使用率是很高的。
(1)無符號數(shù)據(jù)類型(UNSIGNEDTYPE)。UNSIGNED數(shù)據(jù)類型代表一個無符號的數(shù)值,在綜合器中,這個數(shù)值被解釋為一個二進制數(shù),這個二進制數(shù)最左邊是其最高位。例如,十進制的8可以表示如下:
UNSIGNED(“1000”)
如果要定義一個變量或信號的數(shù)據(jù)類型為UNSIGNED,則其位矢量長度越長,所能代表的數(shù)值就越大。不能用UNSIGNED定義負數(shù)。以下是兩則無符號數(shù)據(jù)定義的示例:
【例4-10】
VARIABLEVAR:UNSIGNED(0TO10);
SIGNALSIG:UNSIGNED(5DOWNTO0);
其中,變量VAR有11位數(shù)值,最高位是VAR(0),而非VAR(10);信號SIG有6位數(shù)值,最高位是SIG(5)。
(2)有符號數(shù)據(jù)類型(SIGNEDTYPE)。SIGNED數(shù)據(jù)類型代表一個無符號的數(shù)值,綜合器將其解釋為補碼,此數(shù)的最高位是符號位。例如:SIGNED(“1011”)代表+5,SIGNED(“1101”)代表-5。
若將例4-10中的VAR定義為SIGNED數(shù)據(jù)類型,則數(shù)值意義就不同了。如:
VARIABLE
VAR:SIGNED(0
TO10):
其中,變量VAR有11位,最左位VAR(0)是符號位。4.3.3用戶定義的數(shù)據(jù)類型
VHDL允許用戶自定義新的數(shù)據(jù)類型,如枚舉類型(ENUMERATIONTYPE)、整數(shù)類型(INTEGERTYPE)、數(shù)組類型(ARRAYTYPE)、記錄類型(RECORDTYPE)、時間類型(TIMETYPE)、實數(shù)類型(REALTYPE)等。用戶自定義數(shù)據(jù)是用類型定義語句TYPE和子類型定義語句SUBTYPE實現(xiàn)的,以下將介紹這兩種語句的使用方法。
1.TYPE語句
TYPE語句的語法結(jié)構(gòu)如下:
TYPE數(shù)據(jù)類型名IS數(shù)據(jù)類型定義[OF基本數(shù)據(jù)類型];
其中,數(shù)據(jù)類型名由設(shè)計者自定;數(shù)據(jù)類型定義部分用來描述定義數(shù)據(jù)類型的表達方式和表達內(nèi)容;關(guān)鍵詞OF后的基本數(shù)據(jù)類型是指數(shù)據(jù)類型定義的元素的基本數(shù)據(jù)類型,一般都是取已有的預(yù)定義數(shù)據(jù)類型,如BIT、STD_LOGIC或INTEGER等。例如:
TYPE
ST1
IS
ARRAY(0TO15)OF
STD_LOGIC;
該句定義的數(shù)據(jù)ST1是一個具有16個元素的數(shù)組型數(shù)據(jù),數(shù)組中的每一個元素的數(shù)據(jù)類型都是STD_LOGIC型。在VHDL中,任一數(shù)據(jù)對象(SIGNAL、VARIABLE、CONSTANT)都必須歸屬某一數(shù)據(jù)類型,只有同數(shù)據(jù)類型的數(shù)據(jù)對象才能進行相互作用。利用TYPE語句可以完成各種形式的自定義數(shù)據(jù)類型以供不同類型的數(shù)據(jù)對象間的相互作用和計算。
2.SUBTYPE語句
子類型SUBTYPE只是由TYPE所定義的原數(shù)據(jù)類型的一個子集,它滿足原始數(shù)據(jù)類型的所有約束條件,原數(shù)據(jù)類型稱為基本數(shù)據(jù)類型。子類型SUPTYPE的語句格式如下:
SUBTYPE子類型名IS基本數(shù)據(jù)類型RANGE約束范圍;
子類型的定義只在基本數(shù)據(jù)類型上作一些約束,并沒有定義新的數(shù)據(jù)類型。子類型定義中的基本數(shù)據(jù)類型必須是已經(jīng)存在的數(shù)據(jù)類型。
【例4-11】SUBTYPE
DIGITS
ISINTEGER
RANGE
0TO9;
其中,INTEGER是標準程序包中已定義過的數(shù)據(jù)類型,子類型DIGITS只是把INTEGER約束為只含10個值。
由于子類型與其基本數(shù)據(jù)類型屬同一數(shù)據(jù)類型,因此屬于子類型的和屬于基本數(shù)據(jù)類型的數(shù)據(jù)對象間的賦值和被賦值可以直接進行,不必進行數(shù)據(jù)類型的轉(zhuǎn)換。
利用子類型定義數(shù)據(jù)對象,可以提高程序的可讀性和易處理性,還有利于提高綜合的優(yōu)化效率,這是因為綜合器可以根據(jù)子類型所設(shè)的約束范圍,有效地推知參與綜合的寄存器最合適的數(shù)目。
3.枚舉類型
枚舉類型是TYPE的特殊用法,VHDL中的枚舉數(shù)據(jù)類型用文字符號來表示一組實際的二進制的類型(若直接用數(shù)值來定義,則必須使用單引號)。例如狀態(tài)機的每一狀態(tài)在實際電路中雖然是以一組觸發(fā)器的當前二進制數(shù)位的組合來表示的,但設(shè)計者在狀態(tài)機的設(shè)計中,為了便于閱讀和編譯,往往將表征每一狀態(tài)的二進制數(shù)組用文字符號來表示。
【例4-12】
TYPE
M_STATE
IS(STATE1,STATE2,STATE3,STATE4,STATE5);
SIGNAL
CURRENT_STATE,NEXT_STATE:M_STATE;
TYPEWEEKIS(SUN,MON,TUE,WED,THU,FRI,SAT);
在這里,信號CURRENT_STATE和NEXT_STATE的數(shù)據(jù)類型定義為M_STATE,它們的取值范圍是可枚舉的,即從STATE1~STATE5共5種,代表5組惟一的二進制數(shù)值?!癢EEK”也是一個枚舉類型,定義了7種取值,表示周日至周六。在綜合過程中,枚舉類型文字元素的編碼通常是自動的,編碼順序是默認的,一般將第一個枚舉量(最左邊的量)編碼為0,以后的依次加1。綜合器在編碼過程中自動將第一枚舉元素轉(zhuǎn)變成位矢量,位矢量的長度取所需表達的所有枚舉元素的最小值。如例4-12中設(shè)用于表達5個狀態(tài)的矢位長度為3,編碼默認值如下:
STATE1=‘000’;STATE2=‘001’;STATE3=‘010’;STATE4=‘011’;STATE5=‘100’它們的數(shù)值順序為STATE1<STATE2<STATE3<STATE4<STATE5。一般而言,編碼方法因綜合器不同而不同。
為了某些特殊的需要,編碼順序也可以人為設(shè)置。
4.整數(shù)自定義類型和實數(shù)自定義類型
整數(shù)和實數(shù)的數(shù)據(jù)類型在標準的程序包中已作定義,但在實際應(yīng)用中,特別在綜合中,由于這兩種非枚舉數(shù)據(jù)類型的取值定義范圍太大,綜合器無法進行綜合,因而定義為整數(shù)或?qū)崝?shù)的數(shù)據(jù)對象的具體數(shù)據(jù)類型必須由用戶根據(jù)實際需要重新定義,并限定其取值范圍,以便能為綜合器所接受,從而提高芯片資源的利用率。這種定義其實也是SUBTYPE的特殊用法。實際應(yīng)用中,VHDL仿真器通常將整數(shù)或?qū)崝?shù)類型的數(shù)據(jù)作為有用符號數(shù)處理。VHDL綜合器對整數(shù)或?qū)崝?shù)的編碼方法是:
(1)對用戶已定義的數(shù)據(jù)和子類型中的負數(shù),編碼為二進制補碼;
(2)對用戶已定義的數(shù)據(jù)和子類型中的正數(shù),編碼為二進制原碼。
編碼的位數(shù)即綜合后信號線的數(shù)目只取決于用戶定義的數(shù)值的最大值。在綜合中,以浮點數(shù)表示的實數(shù)將首先轉(zhuǎn)換成相應(yīng)數(shù)值大小的整數(shù)。因此在使用整數(shù)時,VHDL綜合器要求使用數(shù)值限定關(guān)鍵詞RANGE,對整數(shù)的使用范圍作明確的限制。
5.數(shù)組類型
數(shù)組類型屬復合型數(shù)據(jù)類型,是指將一組具有相同數(shù)據(jù)類型的元素集合在一起,作為一個數(shù)據(jù)對象來處理。數(shù)組可以是一維(每個元素只有一個下標)數(shù)組或多維數(shù)組(每個元素有多個下標)。VHDL仿真器支持多維數(shù)組,但綜合器只支持一維數(shù)組。
數(shù)組的元素可以是任何一種數(shù)據(jù)類型,用以定義數(shù)組元素下標范圍的子句決定了數(shù)組中元素的個數(shù)以及元素的排序方向,如子句“0TO7”是由低到高排序的8個元素,“15DOWNTO0”是由高到低排序的16個元素。
VHDL允許定義兩種不同類型的數(shù)組,即限定性數(shù)組和非限定性數(shù)組。它們的區(qū)別是,限定性數(shù)組下標的取值范圍在數(shù)組定義時就被確認了,而非限定性數(shù)組下標的取值范圍需留待隨后根據(jù)具體數(shù)據(jù)對象再確定。
(1)限定性數(shù)組的定義語句格式如下:
TYPE數(shù)組名ISARRAY(數(shù)組范圍)OF數(shù)據(jù)類型;
其中,數(shù)組名是新定義的限定性數(shù)組類型的名稱,可以是任何標識符,其類型與數(shù)組元素相同;數(shù)組范圍明確指出數(shù)組元素的數(shù)量和排序方式,以整數(shù)來表示其下標;數(shù)據(jù)類型即指數(shù)組各元素的數(shù)據(jù)類型。
【例4-14】?TYPE
STB
IS
ARRAY(7DOWNTO0)?OF
STD_LOGIC;
這個數(shù)組類型的名稱是STB,它有8個元素,其下標排序為7~0,各元素的排序是STB(7)~STB(0)。
(2)非限定性數(shù)組的定義語句格式如下:
TYPE數(shù)組名ISARRAY(數(shù)組下標名RANCE<>)OF數(shù)據(jù)類型;
其中,數(shù)組名是定義的非限定性數(shù)組類型的名稱;數(shù)組下標名是以整數(shù)類型設(shè)定的一個數(shù)組下標名稱;符號“<>”是下標范圍待定符號,用到該數(shù)組類型時,再填入具體的數(shù)值范圍;數(shù)據(jù)類型是數(shù)組中每一元素的數(shù)據(jù)類型。比如STD_LOGIC_VECTOR的定義語句為“TPYESTD_LOGIC_VECTORISARRAY(NATURALRANGE<>)OFSTD_LOGIC”,這其實也是非限定性數(shù)組的定義語句。
6.記錄類型
由已定義的、數(shù)據(jù)類型不同的對象元素構(gòu)成的數(shù)組稱為記錄類型的對象。定義記錄類型的語句格式如下:
TYPE記錄類型名ISRECORD
元素名:元素數(shù)據(jù)類型;
元素名:元素數(shù)據(jù)類型;
…
END
RECORD[記錄類型名];對記錄類型的數(shù)據(jù)對象進行賦值,可以整體賦值,也可以對其中的單個元素進行賦值。在使用整體賦值方式時,有位置關(guān)聯(lián)方式和名字關(guān)聯(lián)方式兩種表達方式。如果使用位置關(guān)聯(lián)方式,則默認為元素賦值的順序與記錄類型聲明的順序相同。如果使用了OTHERS選項,則至少應(yīng)有一個元素被賦值;如果有兩個或更多的元素由OTHERS選項來賦值,則這些元素必須具有相同的類型。此外,如果有兩個或兩個以上的元素具有相同的元素和相同的子類型,就可以將其以記錄類型的方式放在一起定義。本例中定義的記錄OPERATION共有五個元素:一個是加法指令碼的字符串OPSTR,一個是4位操作碼OPCODE,另三個是枚舉型數(shù)據(jù)OP1、OP2、RES(其中OP1和OP2是操作數(shù),RES是目標碼)。例中定義的變量INSTR1的數(shù)據(jù)類型是記錄型OPERATION,它的第一個元素是加法指令字符串“ADD,AXBX”;第二個元素是此指令的4位命令代碼“0001”;第三、第四個元素為AX和BX;AX和BX相加后的結(jié)果送入第五個元素AX,因此這里的AX是目標碼。語句“INSTR3,OPSTR?:?=”MULAX,BX“;”賦給INSTR3中的元素OPSTR。一般來說,對于記錄類型的數(shù)據(jù)對象進行賦值時,就在記錄類型對象名后加“.”,再加賦值元素的名稱。
若記錄類型中的每一個元素僅為標量型數(shù)據(jù)類型,則稱為線性記錄類型,否則為非線性記錄類型。只有線性記錄類型的數(shù)據(jù)對象都是可綜合的。
7.數(shù)據(jù)類型轉(zhuǎn)換
VHDL是一種強類型語言,因此不同數(shù)據(jù)類型的數(shù)據(jù)對象在相互操作時,需要進行數(shù)據(jù)類型轉(zhuǎn)換。
(1)類型轉(zhuǎn)換函數(shù)方式。類型轉(zhuǎn)換函數(shù)的作用就是將一種屬于某種數(shù)據(jù)類型的數(shù)據(jù)對象轉(zhuǎn)換成屬于另一種數(shù)據(jù)類型的數(shù)據(jù)對象。此例中利用了DATAIO庫中的程序包STD_LOGIC_OPS中的兩個數(shù)據(jù)類型轉(zhuǎn)換函數(shù):TO_VECTOR(將INTEGER轉(zhuǎn)換成STD_LOGIC_VECTOR)和TO_INTEGER(將STD_LOGIC_VECTOR轉(zhuǎn)換成INTEGER)。通過這兩個轉(zhuǎn)換函數(shù),就可以使用“+”運算符進行直接加1操作了,同時又能保證最后的加法結(jié)果是STD_LOGIC_VECTOR數(shù)據(jù)類型。
利用類型轉(zhuǎn)換函數(shù)來進行類型轉(zhuǎn)換需定義一個函數(shù),使其參數(shù)類型為被轉(zhuǎn)換的類型,返回值為轉(zhuǎn)換后的類型。在實際運用中經(jīng)常使用類型轉(zhuǎn)換函數(shù),VHDL的標準程序包中提供了一些常用的轉(zhuǎn)換函數(shù),見表4-1。
(2)直接類型轉(zhuǎn)換方式。直接類型轉(zhuǎn)換的一般語句格式是:
數(shù)據(jù)類型標識符(表達式)
一般情況下,直接類型轉(zhuǎn)換僅限于非常關(guān)聯(lián)(數(shù)據(jù)類型相互間的關(guān)聯(lián)性非常大)的數(shù)據(jù)類型之間,且必須遵守以下規(guī)則:
①所有的抽象數(shù)字類型是非常關(guān)聯(lián)的類型(如整型、浮點型),如果浮點數(shù)轉(zhuǎn)換為整數(shù),則轉(zhuǎn)換結(jié)果是最近的一個整型數(shù)。
②如果兩個數(shù)組有相同的維數(shù),兩個數(shù)組的元素是同一類型,并且在各處的下標范圍內(nèi)索引是同一類型或非常接近的類型,那么這兩個數(shù)組是非常關(guān)聯(lián)類型。③枚舉型不能被轉(zhuǎn)換。
如果類型標識符所指的是非限定數(shù)組,則結(jié)果會將被轉(zhuǎn)換的數(shù)組的下標范圍去掉,即成為非限定數(shù)組。如果類型標識符所指的是限定性數(shù)組,則轉(zhuǎn)換后的數(shù)組的下標范圍與類型標識符所指的下標范圍相同。轉(zhuǎn)換結(jié)束后,數(shù)組中元素的值等價于原數(shù)組中的元素值。
【例4-18】
VARIABLEDATAC,PARAMC:INTEGERRANGE0TO255
…
DATAC:=INTEGER(74.94*REAL(PARAMC));4.4VHDL的數(shù)據(jù)對象在VHDL語言中,數(shù)據(jù)對象(DataObjects)也叫做VHDL語言的客體,它類似于一種容器,接收不同數(shù)據(jù)類型的賦值。VHDL語言是一種硬件描述語言,它描述硬件電路的工作情況。硬件電路的工作過程實際上是信號變化及傳輸?shù)倪^程,所以VHDL語言的基本數(shù)據(jù)對象就是信號(SIGNAL)。除了信號外,VHDL語言還有三種數(shù)據(jù)對象,分別為常量(CONSTANT)、變量(VARIABLE)和文件(FILE)。在電子電路中,這四類數(shù)據(jù)對象都具有一定的含義。信號對應(yīng)地代表物理設(shè)計中的一條硬件連線;常量代表數(shù)字電路中的電源和地等;變量一般用來表示進行數(shù)據(jù)暫時存儲的載體;文件是傳輸大量數(shù)據(jù)的一種特殊的數(shù)據(jù)對象,這是在VHDL93標準中新通過的,它在TEXTIO描述語句中詳細說明。4.4.1常量
常量是指在VHDL程序中一經(jīng)定義后就不再發(fā)生變化的值,它可以在很多區(qū)域中進行說明。在編寫VHDL程序的過程中,設(shè)計人員經(jīng)常把在VHDL程序中多處使用的數(shù)值設(shè)計為一個常量,以后如果需要修改這個數(shù)值,僅修改這個常量就可以了。常量在使用之前必須進行說明,其描述格式如下:
CONSTANT常量名[,常量名,…]:數(shù)據(jù)類型[約束條件][:=初始值];
其中,[]表示可選項。
【例4-19】
CONSTANT
fbus:BIT_VECTOR:=“010115”; --位矢量數(shù)據(jù)類型
CONSTANT
vcc:REAL:=5.0;
--實數(shù)數(shù)據(jù)類型
CONSTANT
delay:TIME:=15ns;
--時間數(shù)據(jù)類型常量定義說明語句所允許的設(shè)計單元有實體、結(jié)構(gòu)體、程序包、塊、進程和子程序等。常量在程序包中進行定義后,所有調(diào)用該程序包的VHDL程序都可以使用該常量,常量具有最大的全局化特征。在程序包中進行定義時,常量的數(shù)值在包首中可以先不進行定義,而把該數(shù)值在包體中進行定義,也可以在包首中定義完整的常量語句,具體應(yīng)用請參考程序包的章節(jié)。如果在實體中進行定義,則常量在該實體所對應(yīng)的所有結(jié)構(gòu)體中都有效;如果在結(jié)構(gòu)體中定義,則常量僅在該結(jié)構(gòu)體中有效;如果在進程與子程序中定義常量,則其僅在該進程與子程序中有效。4.4.2信號
信號是描述硬件系統(tǒng)的基本數(shù)據(jù)對象,它類似于硬件的連接線。信號可以作為設(shè)計實體中并行語句模塊間的信息交流通道。在多個進程、多個子程序之間及進程、子程序與外部設(shè)備間進行通信時要進行信號傳遞。信號通常在結(jié)構(gòu)體、程序包和實體中進行定義。信號具有全局量的性質(zhì)。信號定義的格式如下:
SIGNAL信號名[,信號名,…]:數(shù)據(jù)類型[約束條件][:=初始值];
【例4-20】
SIGNALa:INTEGERRANGE0TO15;
SIGNALflaga,flagb:BIT;
SIGNALdata:STD_LOGIC_VECTOR(7DOWNTO0):=“11000110”;
在程序中給信號賦的初始值僅在仿真時有效,不能用于綜合,因為電路在上電后并不能保證它的初始狀態(tài)是什么。信號值的代入使用符號“<=”,信號代入時可以產(chǎn)生附加延時。
【例4-21】
a<=10;
flag<=‘1’;
data<=“10110110”AFTER10ns;
事實上,除了沒有方向說明以外,信號與實體的端口(PORT)概念是一致的。信號可以看成是實體內(nèi)部的端口,用于描述一部分電路與另一部分電路的信號連接情況。在VHDL程序中,實體中所定義的端口都可以作為信號來處理,但要注意它的方向。
信號的使用和定義范圍包括實體、結(jié)構(gòu)體和程序包。在進程和子程序中不允許定義信號。信號可以有多個驅(qū)動源,或者說賦值信號源。在進程中,只能將信號列入敏感表,而不能將變量列入敏感表,可見進程只對信號敏感,而對變量不敏感。
當信號定義了數(shù)據(jù)類型和表達方式后,在VHDL設(shè)計中就能對信號進行賦值了。信號的賦值語句表達式如下:
目標信號名<=表達式;
賦值語句的詳細用法見后續(xù)章節(jié)。4.4.3變量
變量(VARIABLE)是一個局部量,只能在進程、子程序中進行定義和使用,可以進行多次賦值。在仿真過程中,變量不像信號那樣到了規(guī)定的時間才能賦值,變量的賦值是立即生效的,所以變量賦值時不能附加延時語句。變量定義的格式如下:
VARIABLE變量名[,變量名,…]:數(shù)據(jù)類型[約束條件][:=初始值];
【例4-22】
VARIABLE
x,y:STD_LOGIC_VECTOR(7DOWNTO0);
VARIABLEcount:INTEGERRANGE0TO255:=10;
變量作為局部量,其適用范圍僅限于定義了變量的進程或子程序中。在仿真過程中變量的初始值僅在仿真時有效,綜合時將略去所有的初始值。變量賦值格式如下:
目標變量名:=表達式;變量數(shù)值的改變是通過變量賦值來實現(xiàn)的,賦值語句右方的表達式必須是一個與目標具有相同數(shù)據(jù)類型的數(shù)值,這個表達式可以是一個運算表達式,也可以是一個數(shù)值。通過賦值操作,變量的值立即改變。變量賦值語句左邊的目標變量可以是單值變量,也可以是一個變量的集合,即數(shù)組型變量。下面是一個變量賦值的例子,請注意變量賦值時數(shù)據(jù)類型的一致性。4.4.4信號與變量的區(qū)別
信號與變量是經(jīng)常使用的兩種數(shù)據(jù)對象,兩者有很大的區(qū)別,歸納起來主要有:
(1)賦值語句不同,信號賦值的符號為“<=”,而變量為“:=”。
(2)通常變量的值可以給信號賦值,但信號的值卻不能給變量賦值。
(3)信號是全局量,是一個實體內(nèi)各部分之間以及實體之間進行通信的載體;而變量是一個局部量,只允許定義并作用在進程和子程序中,如果要把變量的值從它定義的區(qū)間傳輸出去,必須先把該變量賦值給一個信號,通過信號把值傳輸出去。
(4)信號可以作為進程的敏感信號,但是變量卻不可以作為進程的敏感信號,讓進程啟動,至少要有一個敏感信號發(fā)生變化。
(5)操作過程不相同。在變量的賦值語句中,該語句一旦執(zhí)行,變量立刻被賦予新值,在執(zhí)行下一條語句時,該變量的值就用新賦的值參與運算;而在信號賦值語句中,該語句雖然已經(jīng)被執(zhí)行,但信號值并沒有立即改變,因此下一條語句執(zhí)行時,仍然使用原來的信號值。在結(jié)構(gòu)體的并行語句中,不允許信號被賦值一次以上。在進程中,若對同一個信號賦值超過兩次,則編譯將會給出警告,指出只有最后一次賦值有效。圖4-1例4-24仿真的波形圖4-2例4-24信號改為變量后仿真的波形4.5運?算?操?作?符在VHDL中共有4類運算操作符,即邏輯操作符(LogicalOperator)、關(guān)系操作符(RelationalOperator)、算術(shù)操作符(ArithmeticOperator)和并置操作符(ConcatenationOperator),如表4-2所示。在VHDL語言中,操作數(shù)的類型應(yīng)該和操作符所要求的類型相一致,并且基本操作符間的操作數(shù)必須是同類型的。表4-2右欄已大致列出了各種操作符所要求的數(shù)據(jù)類型。操作符是有優(yōu)先級的,其優(yōu)先級如表4-3所示,在編程時要注意各操作符的優(yōu)先級,為了保險起見可多用括號。4.5.1邏輯操作符
由表4-3知,邏輯操作符可以對位、標準邏輯位和布爾類型的數(shù)據(jù)進行操作,要求運算符左右的數(shù)據(jù)類型必須相同。當一個語句中存在兩個以上的邏輯表達式時,在一般的高級語言中運算按自左至右的順序進行,而在VHDL語言中,如果邏輯關(guān)系不能確定,必須要加上括號確定各運算的優(yōu)先順序。
【例4-25】
x<=(aANDb)OR(NOTcANDd);
--NOT優(yōu)先級最高,所以在NOTc處可以不加括號
x<=bANDaANDdANDe;
--不會引起邏輯關(guān)系變化,可以不加括號
x<=bORcORdORe;
--不會引起邏輯關(guān)系變化,可以不加括號
x<=aXORdXORe;
--不會引起邏輯關(guān)系變化,可以不加括號
a<=(x1ANDx2)OR(y1ANDy2);
--不加括號會引起邏輯關(guān)系變化,一定要加括號4.5.2關(guān)系操作符
應(yīng)該注意小于等于(<=)和代入運算符(<=)的不同(從上下文區(qū)別)。兩個對象進行比較時,數(shù)據(jù)類型一定要相同。=(等于)和/=(不等于)適用于所有數(shù)據(jù)類型對象之間的比較;大于、小于、大于等于、小于等于適用于整數(shù)、實數(shù)、位矢量及數(shù)組類型的比較;兩個位矢量對象比較時,類型一定要一致,但長度可以不相同,在比較時,某些低版本的EDA工具的編譯器從最左的位開始,自左至右按位進行比較從而得出最終比較結(jié)果。上例中,a值為10,而b值為7,a應(yīng)該比b大,但是因為某些低版本的EDA工具的編譯器比較是自左至右進行的,最左邊的位都是'1',所以比較次左邊的值時發(fā)現(xiàn)b對應(yīng)的位為'1',而a對應(yīng)的位為'0',所以最終得出a<b的結(jié)論。目前,大多數(shù)EDA工具的編譯器在比較不同長度的位矢量時,會自動在位數(shù)少的數(shù)據(jù)左邊補上零,從而使長度一致,得出正確的結(jié)果。4.5.3算術(shù)操作符
在算術(shù)運算符中,賦值語句兩邊的數(shù)據(jù)位長應(yīng)一致,否則編譯時將會出錯。比如在對STD_LOGIC_VECTOR進行加、減運算時,要求操作數(shù)兩邊的操作數(shù)和運算結(jié)果的位長相同,否則編譯時將會給出語法出錯信息。正常情況下,標準邏輯位是不允許進行算術(shù)運算的,但是在設(shè)計電路時經(jīng)常會對標準邏輯位矢量進行加、減運算,為了使設(shè)計變得方便快捷,為了方便各種不同數(shù)據(jù)類型間的運算,VHDL還允許用戶對原有的基本操作符重新定義,賦予新的含義和功能,從而建立一種新的操作符,即重載操作符(OverloadingOperator)。定義這種重載操作符的函數(shù)稱為重載函數(shù)。事實上,在程序包STD_LOGIC_UNSIGNED中已定義了多種可供不同數(shù)據(jù)類型間操作的算符重載函數(shù),其中STD_LOGIC_SIGNED包集合定義了有符號數(shù)的操作符,而程序包STD_LOGIC_UNSIGNED包集合定義了無符號數(shù)的操作符。
Synopsys的程序包STD_LOGIC_ARITH、STD_LOGIC_UNSIGNED和STD_LOGIC_SIGNED中已經(jīng)為許多類型的運算重載了算術(shù)操作符和關(guān)系操作符,只要引用這些程序包,即可在SIGNED、UNSIGNED、STA_LOGIC和INTEGER之間進行混合運算,在INTEGER、STD_LOGIC和STD_LOGIC_VECTOR之間也可以進行混合運算。在算術(shù)操作符中,乘與除的數(shù)據(jù)類型是整數(shù)和實數(shù)(包括浮點數(shù))。在一定條件下還可對物理類型的數(shù)據(jù)對象進行運算操作。
雖然在一定條件下,乘法和除法運算是可以綜合的,但從優(yōu)化綜合、節(jié)省芯片資源的角度出發(fā),最好不要輕易使用乘、除操作符,可以用其它變通的方法來實現(xiàn)乘、除運算。
操作符MOD和REM的本質(zhì)與除法操作符是一樣的,可綜合的取模和取余的操作數(shù)必須是以2為底數(shù)的冪。MOD和REM的操作數(shù)數(shù)據(jù)類型只能是整數(shù),運算結(jié)果也是整數(shù)。符號操作符“+”和“-”的操作數(shù)只有一個,操作數(shù)的數(shù)據(jù)類型是整數(shù)。操作符“+”對操作數(shù)不作任何改變;操作符“-”作用于操作數(shù)的返回值是對原操作數(shù)取負。在實際使用中,取負操作數(shù)需加括號,如Z=X*(-Y)。
VHDL規(guī)定,乘方操作符“**”和取絕對值操作符“ABS”的操作數(shù)數(shù)據(jù)類型一般為整數(shù)類型。乘方(**)運算的左邊可以是整數(shù)或浮點數(shù),但右邊必須為整數(shù),而且只有在左邊為浮點時其右邊才可以為負數(shù)。一般地,VHDL綜合器要求乘方操作符作用的操作數(shù)的底數(shù)必須是2。六種移位操作符號SLL、SRL、SLA、SRA、ROL和ROR都是VHDL93標準新增的運算符。VHDL93標準規(guī)定移位操作符作用的操作數(shù)的數(shù)據(jù)類型應(yīng)是一組數(shù)組,并要求數(shù)組中的元素必須是BIT或BOOLEAN數(shù)據(jù)類型,移位的位數(shù)為整數(shù)。在EDA工具所附的程序包中重載了移位操作符以支持
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度旅游客車租賃與旅游咨詢一體化服務(wù)協(xié)議4篇
- 2025年代理銷售協(xié)議解約協(xié)議
- 2025年文化娛樂場地房屋租賃合同(含技術(shù)支持)3篇
- 二零二五版數(shù)字健康技術(shù)顧問專項合同2篇
- 二零二五版大數(shù)據(jù)分析服務(wù)高額抵押反擔保合同3篇
- 二零二五版辦公用品采購與員工激勵協(xié)議2篇
- 2025公司承包合同專業(yè)版
- 2025計算機軟件采購合同范本
- 2025年洗車行汽車美容店停車場租賃合同3篇
- 鋼材銷售合同范本
- GB/T 22484-2008城市公共汽電車客運服務(wù)
- GB/T 14040-2007預(yù)應(yīng)力混凝土空心板
- 帶狀皰疹護理查房課件整理
- 奧氏體型不銹鋼-敏化處理
- 作物栽培學課件棉花
- 交通信號控制系統(tǒng)檢驗批質(zhì)量驗收記錄表
- 弱電施工驗收表模板
- 絕對成交課件
- 探究基坑PC工法組合鋼管樁關(guān)鍵施工技術(shù)
- 國名、語言、人民、首都英文-及各地區(qū)國家英文名
- API SPEC 5DP-2020鉆桿規(guī)范
評論
0/150
提交評論