VHDL語言實用教程_第1頁
VHDL語言實用教程_第2頁
VHDL語言實用教程_第3頁
VHDL語言實用教程_第4頁
VHDL語言實用教程_第5頁
已閱讀5頁,還剩112頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

VHDL實用教程雷永輝VHDL硬件描述語言及應用

-----------一種很好的數(shù)字系統(tǒng)硬件電路的形式化描述實現(xiàn)緒論EDA與FPGASSI(通用數(shù)字芯片)到MCU(單片機)FPGA/CPLD(現(xiàn)場可編程門陣列和復雜可編程邏輯器件)是一種發(fā)展趨勢EDA(electronicdesignautomation,電子設計自動化)是一個軟件平臺,指利用計算機,通過軟件方式的設計和測試,達到對既定功能的硬件系統(tǒng)的設計和實現(xiàn)。如quartusII7.2,完成HDL文件的邏輯編譯,邏輯簡化,邏輯綜合及優(yōu)化,布局布線,仿真并產(chǎn)生具體芯片的目標文件并下載等FPGA/CPLD與EDA技術(shù)的發(fā)展,使用文本描述電路(HDL)的設計方式流行起來VHDL語言概述HDL:HardwareDescriptionLanguageVHDL:由美國國防部開發(fā),1987年由IEEE標準化,1993年進一步修訂Verilog:1983年由GatewayDesignAutomation公司開發(fā),1990年被推向公眾領(lǐng)域,1995年成為IEEE標準TOPTODOWN設計方法DowntoTop:元件選型到邏輯設計到系統(tǒng)設計調(diào)試Toptodown:對系統(tǒng)功能進行行為描述、定義和仿真(與具體的物理芯片無關(guān)),確定設計的可行性和正確性,然后利用EDA工具把把功能描述轉(zhuǎn)換成具體目標芯片網(wǎng)表進行布局布線及后仿真,確保實際系統(tǒng)性能。在這種設計思想下的設計師應具有以下設計思想:

1、設計工程師首先要考慮規(guī)劃出能完成某一具體功能、滿足自己產(chǎn)品系統(tǒng)設計要求的某一功能模塊

2、利用某種方式(如HDL硬件描述語言)把功能描述出來,通過功能仿真(HDL仿真器)以驗證設計思路的正確性

3、當所設計功能滿足需要時,再考慮以何種方式(即邏輯綜合過程)完成所需要的設計,并能直接使用功能定義的描述VHDL的EDA過程對初學者的幾點建議重要性:FPGA是電子設計領(lǐng)域中最具活力和發(fā)展前途的一項技術(shù),它的影響絲毫不亞于單片機的發(fā)明和應用應用領(lǐng)域:PLD能完成任何數(shù)字器件功能,上至高性能CPU,下至基本的邏輯電路要求基礎(chǔ):數(shù)字電路特別精通,特別是時序和邏輯的思維習慣,這也是數(shù)字電路設計的高級境界學習方法:FPGA開發(fā)平臺和開發(fā)流程,對PLD結(jié)構(gòu)的了解可以提高設計的效率和可靠性,如原來做過單片機要變串行思維為并行思維,語言和平臺是工具,設計的核心是時序和邏輯的物理實現(xiàn)PLD開發(fā)系統(tǒng)PLD開發(fā)系統(tǒng)包括硬件和軟件兩部分。硬件部分:計算機、下載電纜或編程器;軟件部分:集成開發(fā)系統(tǒng)。

Altera公司:MaxplusⅡ、QuartusⅡXilinx公司:Foundation、ISELattice公司:SynarioSystem、ispEXPERTSystem四、PLD設計流程設計準備設計輸入設計處理器件編程功能仿真時序仿真器件測試PLD設計準備在設計之前,首先要進行方案論證和器件選擇等設計準備工作。設計者首先要根據(jù)任務要求,判斷系統(tǒng)的可行性。系統(tǒng)的可行性要受到邏輯要求合理性、成本、開發(fā)條件、器件供應等方面的約束。若系統(tǒng)可行,則根據(jù)系統(tǒng)所完成的功能及復雜程度,對器件本身的資源和成本、工作速度及連線的可布性等方面進行權(quán)衡,選擇合適的設計方案和合適的器件類型。設計輸入將所設計的電路的邏輯功能按照開發(fā)系統(tǒng)要求的形式表達出來的過程稱為設計輸入。通常,設計輸入有如下三種方式:(1)原理圖輸入方式適用于對系統(tǒng)及各部分電路很熟悉的場合。(2)硬件描述語言輸入方式硬件描述語言是用文本方式描述設計,硬件描述語言有ABEL、AHDL、VHDL、Verilog等,其中VHDL和Verilog已成為IEEE標準。(3)波形輸入方式設計處理邏輯優(yōu)化把邏輯描述轉(zhuǎn)變?yōu)樽钸m合在器件中實現(xiàn)的形式,優(yōu)化使設計所占用的資源最少。邏輯綜合根據(jù)設計描述,對給定的硬件結(jié)構(gòu)組件,最終獲得門級電路甚至更底層的電路描述文件,即將多個模塊化設計文件合并為一個網(wǎng)表文件。適配確定優(yōu)化后的邏輯能否與器件中的宏單元和I/O單元適配。分割將大的設計分割為多個便于器件內(nèi)部資源實現(xiàn)的邏輯小塊的形式。設計校驗設計校驗過程包括功能仿真和時序仿真。

功能仿真時序仿真器件編程器件編程就是將開發(fā)系統(tǒng)生成的目標文件下載到可編程邏輯器件中,來定義內(nèi)部模塊的邏輯功能以及它們的相互連接關(guān)系。

兩種編程方式:編程器下載電纜PLD開發(fā)系統(tǒng)PLD開發(fā)系統(tǒng)包括硬件和軟件兩部分。硬件部分:計算機、下載電纜或編程器;軟件部分:集成開發(fā)系統(tǒng)。

Altera公司:MaxplusⅡ、QuartusⅡXilinx公司:Foundation、ISELattice公司:SynarioSystem、ispEXPERTSystem三、PLD電路設計的特點1、設計簡單,方便;2、電路系統(tǒng)可以集成在一片芯片上;3、電路設計不依賴于器件進行設計;4、電路系統(tǒng)很容易完善和升級。器件選擇:(1)電路系統(tǒng)所完成的功能及復雜程度;(2)器件本身的資源和成本、性能參數(shù)、器件編程工藝等方面進行權(quán)衡。外部示意圖內(nèi)部示意圖LIBRARYieee;USEieee.std_logic_1164.all;ENTITYmcu_collectISPORT ( iclk:INSTD_LOGIC; in1:INSTD_LOGIC; in2:INSTD_LOGIC; in3:INSTD_LOGIC; in4:INSTD_LOGIC; in5:INSTD_LOGIC; o1:OUTSTD_LOGIC; o2:OUTSTD_LOGIC; o3:OUTSTD_LOGIC; o4:OUTSTD_LOGIC; o5:OUTSTD_LOGIC); ENDmcu_collect;ARCHITECTUREmcu_collect_architectureOFmcu_collectIS BEGINk1:process(iclk)beginif(rising_edge(iclk))then o1<=in1; o2<=in2; o3<=in3; o4<=in4; o5<=in5;endif;endprocessk1;ENDmcu_collect_architecture;VHDL入門與程序結(jié)構(gòu)第二章結(jié)構(gòu)概述完整的設計實體的最低要求是能被綜合器接受并能作為一個獨立設計單元(元件)存在的vhdl程序一個實用的vhdl程序一般由庫(library)、實體(entity)和結(jié)構(gòu)體(archtecture)組成完整的設計實體由內(nèi)部和外部組成,內(nèi)組由實際功能的描述組成,為不可視部分,外部由實體名和端口組成,為可視部分。(看實例)實例LIBRARYieee;USEieee.std_logic_1164.all;USEieee.std_logic_arith.all;USEieee.std_logic_unsigned.all;ENTITYtest1IS PORT (

iclk:INSTD_LOGIC;

oclk:OUTSTD_LOGIC );

ENDtest1;ARCHITECTUREtest1_architectureOFtest1ISsignalcount:std_logic_vector(30downto0);

BEGINoclk<=count(22);k1:process(iclk)beginifrising_edge(iclk)then count<=count+1;endif;endprocessk1;ENDtest1_architecture;VHDL語言程序的基本構(gòu)成示例庫、包集合說明實體說明構(gòu)造體庫與包集合用于存放預先編譯好的程序包(PACKAGE)和數(shù)據(jù)集合體,以便不同的VHDL設計使用(注:包集合存在于庫中)庫的說明總是放在設計單元的最前面,如:

LIBRARYieee;前面LIBRARY為關(guān)鍵字,后面ieee為庫名稱庫的種類及使用VHDL語言中的庫分為5類:IEEE庫、STD庫、ASIC矢量庫、WORK庫和用戶自定義的庫系統(tǒng)默認的庫存放路徑為:c:\altera\72\quartus\libraris\vhdl除STD庫和WORK庫外,其它庫在使用前必須加以說明,同時還應說明使用庫中的具體包集合,如:

LIBRARYieee; USEieee.std_logic_1164.all; USEieee.std_logic_arith.all; USEieee.std_logic_unsigned.all;std_logic_arith與std_logic_unsigned存放在c:\altera\72\quartus\libraris\vhdl\synopsys下的syn_srit.vhd和ayn_unsi.vhd兩文件中庫的作用范圍庫的說明語名作用范圍是從一個實體說明開始到它所需結(jié)構(gòu)和配置結(jié)束為止當一個源程序中具有多個實體時,每個實體前都應加庫說明語句,即使完全一樣也要重復書寫如下:庫說明在多實體程序中使用庫分類介紹IEEE庫STD庫ASIC矢量庫WORK庫用戶自定庫

作用:

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

實體名

is

Port(a:

inbit;

b:inbit;

c:outbit);End

實體名;ENTITY定義區(qū)端口名數(shù)據(jù)類型端口模式端口模式(MODE)有以下幾種類型:

IN;OUT;INOUT;BUFFER

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

INOUTBUFFERINOUTENTITY定義區(qū)VHDL結(jié)構(gòu)要點注意簡單地說

In

不可以出現(xiàn)在<=或:=的左邊

out不可以出現(xiàn)在<=或:=的右邊

buffer可以出現(xiàn)在<=或:=的兩邊In信號只能被引用,不能被賦值out信號只能被賦值,不能被引用buffer信號可以被引用,也可以被賦值VHDL中的注意事項在VHDL語言中,大小寫不加區(qū)分,但在代碼中巧妙應用大小寫,可以使代碼變得易于閱讀和規(guī)范實體名必須與VHDL文件名相同,否則編譯會出錯信號與變量,過程與函數(shù)的區(qū)分類屬參數(shù)說明類屬參數(shù)說明必須放在端口說明之前,用于指定參數(shù)LIBRARYieee;USEieee.std_logic_1164.all;USEieee.std_logic_arith.all;USEieee.std_logic_unsigned.all;ENTITYtest_genericIS

GENERIC(m:TIME:=100ns); PORT (

idata:INSTD_LOGIC;

odata:OUTSTD_LOGIC );ENDtest_generic;ARCHITECTUREtest_generic_architectureOFtest_genericISBEGINodata<=idataAFTERm;ENDtest_generic_architecture;端口說明端口名是賦于每個外部引腳的名稱,通常用一個或幾個英文字母,或者用英文字母加數(shù)字命名端口方向端口方向是用來定義外部引腳的信號方向OUT與BUFFER的區(qū)別端口的數(shù)據(jù)類型端口的數(shù)據(jù)類型一般使用std_logic與std_logic_vectorStd_logic數(shù)據(jù)類型:是位邏輯數(shù)據(jù)類型,其取值只能是兩個邏輯值‘0’和‘1’中之一Std_logic_vector:是邏輯總線說明數(shù)據(jù)類型,取值是一組二進制位的值ENTITYtest_genericIS

GENERIC(m:TIME:=100ns); PORT( idata1,idata2,idata3,idata4:INSTD_LOGIC;

odata:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDtest_generic;Idata1,idata2,idata3,idata4只能取‘0’或‘1’;odata只能取“0000”,“0001”,“0010”,“0011”,“0100”….“1111”

ExempleofENTITYGENERIC所定義的元件叫做參數(shù)化元件,即元件的規(guī)模或特性由GENERIC的常數(shù)決定,利用GENERIC可以設計更加通用的元件,彈性地適應不同的應用

端口信號名在實體之中必須是唯一的,信號名應是合法的標識符分別有IN、OUT、INOUT、BUFFER、LINKAGE

常用的有INTEGER、STD_LOGIC、STD_LOGIC_VECTOR

ARCHITECTURE(構(gòu)造體或結(jié)構(gòu)體)所有能被仿真的實體都由結(jié)構(gòu)體(ARCHITECTURE)描述,即結(jié)構(gòu)體描述實體的結(jié)構(gòu)或行為,一個實體可以有多個結(jié)構(gòu)體,每個結(jié)構(gòu)體分別代表該實體功能的不同實現(xiàn)方案結(jié)構(gòu)體格式:

ARCHITECTURE

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

OF

實體名

IS

[定義語句(元件例化);]

BEGIN

并行處理語句;

END

結(jié)構(gòu)體名;結(jié)構(gòu)體名是對本結(jié)構(gòu)體的命名,它是該結(jié)構(gòu)體的惟一名稱,雖然可以由設計人員自由命名,但一般都將命名和對實體的描述結(jié)合起來,例如:行為描述(BEHAVE),寄存器傳輸級(RTL)

ExempleofARCHITECTURE定義語名:置于architecture與begin之間,用于定義結(jié)構(gòu)體中的信號、常數(shù)、數(shù)據(jù)類型和函數(shù)并行處理語名:置于begin與end之間,具體描述構(gòu)造體的行為與連接關(guān)系,語句的執(zhí)行與書定語名的順序無關(guān)

構(gòu)造體的子結(jié)構(gòu)子結(jié)構(gòu)的使用使設計者可以把整個電路分成若干個相對獨立的模塊來進行描述子結(jié)構(gòu)有:BLOCK,PROCESS,SUBPROGRAMSBLOCK與ARCHITECTURE相當于整體原理圖與子原理圖關(guān)系,block結(jié)構(gòu)內(nèi)部語句是并發(fā)的,如希望BLOCK有條件執(zhí)行,可采用衛(wèi)式BLOCK,如下:

ARCHITECTURE的PROCESS子結(jié)構(gòu)PROCESS中的語句是順序執(zhí)行的,一個結(jié)構(gòu)體中可以有多個PROCESS,它們之間可以通過信號進行通信PROCESS的啟動受敏感信號控制,敏感信號的變化會直接導致PROCESS的啟動進程名,可省參數(shù)說明:只在本進程中有效順序執(zhí)行語句

ARCHITECTURE的SUBPROGRAM子結(jié)構(gòu)與高級語言中的子程序概念差不多,可以反復調(diào)用,但不能重入,結(jié)構(gòu)內(nèi)語句為順序執(zhí)行,有Procedure和Function之分多個過程和函數(shù)匯集在一起構(gòu)成包集合,幾個包集合匯集在一起構(gòu)成庫數(shù)據(jù)類型及運算操作符第三章

VHDL中的數(shù)據(jù)對象在邏輯綜合中,VHDL常用的數(shù)據(jù)對象有信號、變量及常量

信號SIGNAL:為全局變量,定義格式:

SIGNAL

信號名:

數(shù)據(jù)類型[:=初始值];

賦值格式:

目標信號名<=表達式常在結(jié)構(gòu)體中用賦值語句完成對信號賦初值的任務,因為綜合器往往忽略信號聲名時所賦的值

常量:全局變量,在設計中描述某一規(guī)定類型的特定值不變,如利用它可設計不同模值的計數(shù)器,模值存于一常量中,對不同的設計,改變模值僅需改變此常量即可,就如上一章所說的參數(shù)化元件。

定義格式:

CONSTANT

常數(shù)名:數(shù)據(jù)類型:=表達式

變量(VARIABLE):用于聲明局部值或用于子程序中,變量的賦值符號為“:=”,

定義格式:

VARIABLE

變量名:

數(shù)據(jù)類型[:=初始值]

VHDL中的信號與變量信號是實際的,是內(nèi)部的一個存儲元件(SIGNAL)或者是外部輸入(IN、OUT、INOUT、BUFFER)變量是虛的,僅是為了書寫方便而引入的一個名稱,常用在實現(xiàn)某種算法的賦值語句當中如果在一個進程中多次為一個信號賦值,只有最后一個值會起作用,這與SIGNAL的硬件特性有關(guān)變量賦值時,變量的值改變是立即發(fā)生的信號賦值用“<=”,變量賦值用“:=”數(shù)據(jù)對象綜合實例ARCHITECTUREtest_object_architectureOFtest_objectISconstantn:std_logic:='1';signala:std_logic;BEGINk1:process(idata1)variablecount:integerrange0to10:=0;beginifrising_edge(idata1)then count:=count+1; ifcount=1then

odata<=n;

elsifcount=8then count:=0; else

odata<=idata2; endif;endif;endprocessk1;ENDtest_object_architecture;

VHDL的數(shù)據(jù)類型VHDL是一種強類型語言,對于每一個常數(shù)、變量、信號、函數(shù)及設定的各種參量的數(shù)據(jù)類型(DATA

TYPES)都有嚴格要求,相同數(shù)據(jù)類型的變量才能互相傳遞和作用,標準定義的數(shù)據(jù)類型都在VHDL標準程序表STD中定義,實際使用中,不需要用USE語句以顯式調(diào)用

VHDL常用的數(shù)據(jù)類型有三種:標準定義的數(shù)據(jù)類型、IEEE預定義標準邏輯位與矢量及用戶自定義的數(shù)據(jù)類型標準定義的數(shù)據(jù)類型

Boolean布爾量:取值為FALSE和TRUE

CHARACTER字符:ASCII字符,編程時用單引號括起來,如‘A’

STRING字符串:字符失量,雙引號括起來,如“ADFBD”

INTEGER整數(shù):32位,范圍從-(231-1)到(231-1);

REAL實數(shù):實數(shù)類型僅能在VHDL仿真器中使用,綜合器不支持

BIT位:取值為0或1;

TIME時間:范圍從-(231-1)到(231-1),表達方法包含數(shù)字、(空格)單位兩部分,如(10

PS);

BIT_VECTOR位矢量:其于BIT數(shù)據(jù)的數(shù)組,使用矢量必須注明寬度,即數(shù)組中的元素個數(shù)和排列,如SIGNAL

A:

BIT_VECTOR(7

DOWNTO

0)

NATUREAL自然數(shù):整數(shù)的一個

POSITIVE正整數(shù):

SEVRITY

LEVEL錯誤等級:在VHDL仿真器中,錯誤等級用來設計系統(tǒng)的工作狀態(tài),共有四種可能的狀態(tài)值:NOTE,WARNING,ERROR和FAILURE

IEEE預定義的標準邏輯位與矢量STD_LOGIC:工業(yè)標準的邏輯類型,取值為‘0’、‘1’、‘Z’、‘X’(強未知)、‘W’(弱未知)、‘L’(弱0)、‘H’(弱1)、‘—’(忽略)、‘U’(未初始化),只有前四種具有實際物理意義,其他的是為了與模擬環(huán)境相容才保留的STD_LOGIC_VECTOR:工業(yè)標準的邏輯類型集,STD_LOGIC的組合用戶自定義的數(shù)據(jù)類型用戶自定義的數(shù)據(jù)類型有枚舉類型、整數(shù)類型和實數(shù)類型、數(shù)組類型、記錄類型四種枚舉類型:

TYPE

數(shù)據(jù)類型名

IS

(枚舉文字,枚舉文字,.

.

.

.)整數(shù)類型與實數(shù)類型是標準包中預定義的整數(shù)類型的子集,由于綜合器無法綜合未限定范圍的整數(shù)類型的信號或變量,故一定要用RANGE子句為所定義整數(shù)范圍限定范圍以使綜合器能決定信號或變量的二進制的位數(shù)。

格式:

TYPE

數(shù)據(jù)類型名

IS

RANGE

約束范圍;數(shù)組類型:數(shù)組是同一類型數(shù)據(jù)集合,記錄內(nèi)元素類型可以不同

TYPE

數(shù)據(jù)類型名

IS

ARRAY(下限

TO

上限)

OF

類型名稱,多維數(shù)組不能生成邏輯電路,只能用于仿真圖形記錄類型:

TYPE

記錄類型名

IS

RECODE

元素名:

數(shù)據(jù)類型名;

元素名:

數(shù)據(jù)類型名;

。。。。。。。。。。。。。

END

RECODE

用戶自定義的數(shù)據(jù)類型舉例RANGE<>其范圍一般由調(diào)用者傳遞的參數(shù)決定用戶自定義的子類型對已定義類型作一些范圍限制(也可以與原數(shù)據(jù)類型完全一致),定義格式為:

SUBTYPE子類型名IS數(shù)據(jù)類型名(范圍)數(shù)據(jù)類型轉(zhuǎn)換VHDL中,不同數(shù)據(jù)類型不能直接進行運算和代入,要進行運算或代入必需對類型進行轉(zhuǎn)換,使之一致

BIT_VECTOR與STD_LOGIC_VECTOR代入STD_LOGIC_VECTOR的值只能是二進制,代入BIT_VECTOR的值除二進制外還可以是八進制和十六進制數(shù)據(jù)類型的限定VHDL中有時可以用上下文關(guān)系來判斷某一數(shù)據(jù)的數(shù)據(jù)類型,如果不能判斷出來,就必需對數(shù)據(jù)進行類型限定,類似C中的強制類型轉(zhuǎn)換運算符運算符的使用邏輯運算、算術(shù)運算、關(guān)系運算的左右以及代入的數(shù)據(jù)類型一定要相同VHDL中左右沒有優(yōu)先級的差異,如

x<=(aANDb)OR(NOTcANDd)能真正綜合的算術(shù)運算符只有“+”,“-”,“*”;“MOD”,“REM”,“/”分母是2乘方時可綜合,由于硬件特性,后4種應慎用,最好作適當變通“《=”應通過上下文關(guān)系判定是關(guān)系運算符還是代入符位的連接也可以采用集合的方式,把并置符改成“,”即可,如:temp_4<=(‘1’,‘0’,‘1’,‘0’);其中temp_4為4位寬的位失量,但這種方式不能用于位失量連接,如:temp_4<=(temp_2,temp_2);就是錯誤的Vhdl順序語句第四章描述語句分類順序描述語句和并發(fā)描述語句是VHDL程序設計中兩大基本描述語句系列順序描述語名只出現(xiàn)在PROCESS和SUBPROGRAM中,語句按出現(xiàn)的次序加以執(zhí)行對于FPGA搭建的應用系統(tǒng),元件在定義的仿真時該應該是并發(fā)工作的,并發(fā)語句就用于表示這種并發(fā)行為順序語句順序描述語句只能出現(xiàn)在進程(Process)或子程序中,它定義進程或子程序所執(zhí)行的算法。順序描述語句按這些語句在進程或子程序中出現(xiàn)的順序執(zhí)行,這一點與高級語言類似。

VHDL中常用的順序描述語句包括:信號和變量賦值、Wait、If、Case、Loop、Next、Exit、斷言語句、過程調(diào)用語句、空語句等。進程(Process)所有的順序描述語句都只能在進程(process)中使用,進程內(nèi)是順序執(zhí)行,進程與進程之間是并發(fā)的,有點類似于計算機操作系統(tǒng)中“進程”的概念。Process語句的格式:

[進程名]:Process(敏感信號列表)

Begin

順序描述語句;

EndProcess;

Process語句從Process開始,到End

Process結(jié)束,進程名可以省略。功能相對獨立的模塊可以用一個進程來描述。進程(Process)

Process語句的格式:例1:

Entitymux2Is

Port

(a,b:Instd_logic;

s:In

std_logic;

f:Out

std_logic);

Endmux2;

ArchitecturebehaviorOfmux2Is

Begin

mux2:Process(a,b,s)

Begin

If(s=‘0’)Thenf<=a;

Elsef<=b;

EndIf;

EndProcess;

Endbehavior;進程(Process)

Process的啟動和敏感信號列表:進程在仿真運行中,總是處于兩個狀態(tài)之一:執(zhí)行或掛起。初始啟動時,進程處于執(zhí)行狀態(tài),進程中的順序語句從前向后逐句執(zhí)行一遍,即從Process執(zhí)行到EndProcess之前。當最后一條語句執(zhí)行完后,返回到進程開始的Process語句,進程處于掛起狀態(tài)。此時,只要該進程的敏感信號列表中任何一個信號發(fā)生變化(即信號的值發(fā)生變化,如從“1”變到“0”或從“0”變到“1”),進程又再次處于執(zhí)行狀態(tài)。然后,再掛起,再執(zhí)行,一直循環(huán)下去,直到仿真結(jié)束。從硬件方面來看,一個Process相當于一個電路模塊,它的敏感信號列表指明了所有能引起該電路模塊狀態(tài)發(fā)生改變的信號。例1中mux2進程的敏感信號列表是(a,b,s),三個信號中的任何一個發(fā)生變化,都引起進程重新執(zhí)行。從硬件特性來看,二選一電路的a,b,s輸入的變化都可能引起輸出發(fā)生變化。進程(Process)

Process的啟動和敏感信號列表:敏感信號列表對于進程至關(guān)重要,它是進程描述的一個重要組成部分。一般來說,如果描述的是組合電路模塊,那么敏感信號列表必須包括所有的輸入信號;否則,在綜合時會出錯,在仿真時將導致一個錯誤的結(jié)果。如果描述的是時序電路模塊,那么敏感信號列表只需要包括時鐘信號和異步清零/置位信號。因為,觸發(fā)器的輸出只在時鐘上升/下降沿才會改變。在一個結(jié)構(gòu)體里可以有多個Process語句,這些Process之間可以通過一些信號相互聯(lián)系。在一個Process的執(zhí)行中,某個信號的值發(fā)生改變,它會導致另一個(或幾個)進程的重新執(zhí)行,如此構(gòu)成所有進程的反復執(zhí)行。進程(Process)中的順序語句

信號和變量的賦值:信號的賦值語句格式:目標信號名<=表達式;例2:

c<=‘1’;

q<=“010010”;

q(1)<=‘1’;

q(3downto1)<=“001”;

a<=b;

s<=axorb;

x<=y+z;需要特別注意的是:VHDL是強類型語言,左邊的信號量和右邊的表達式的類型和位長度都必須一致,否則將出錯。進程(Process)中的順序語句

信號和變量的賦值:變量的賦值語句格式:目標變量名:=表達式;例3:

v:=‘1’;

s:=“010010”;變量賦值的符號與信號賦值的符號不同,表達式與信號賦值的表達式寫法是完全一樣的。變量與信號有明顯的區(qū)別:變量只在定義它的進程和子程序內(nèi)有效,無法傳遞到進程之外;而信號在定義它的結(jié)構(gòu)體內(nèi)有效。賦給變量的值立即成為當前值;而賦給信號的值必須在進程結(jié)束后才能成為當前值。進程(Process)中的順序語句

轉(zhuǎn)向控制語句:條件控制語句——If語句:

IF語句的基本格式:

If條件Then

If條件Then順序描述語句; 順序描述語句;

Else

EndIf;順序描述語句;

EndIf;

進程(Process)中的順序語句

轉(zhuǎn)向控制語句:條件控制語句——If語句:例4:EntitydffIs

Port(d:Instd_logic;clk:In

std_logic;

q:Outstd_logic);Enddff;ArchitecturebehaviorOfdffIs

Begin

Process(clk)

Begin

If(clk'eventandclk=’l’)Then

q<=d;

EndIf;

EndProcess;Endbehavior;進程(Process)中的順序語句

轉(zhuǎn)向控制語句:條件控制語句——Case語句:

Case語句的基本格式:

Case表達式Is

When條件表達式1=>順序描述語句;

When條件表達式2=>順序描述語句;

...

When條件表達式n=>順序描述語句;

EndCase;

Case語句的各個條件表達式之間沒有優(yōu)先級,所以,給定的條件表達式不能有重疊,否則將無法確定執(zhí)行哪一個分支。而且,如果沒有列舉出Case和Is之間的表達式的全部取值,則Whenothers=>必不可少。

條件表達式可以是以下格式:When值=>When值1|值2|...|值n=>When值ito值j=>Whenothers=>它們分別表示條件表達式的值是某個確定的值、多個值中的一個、一個取值范圍中的一個和其他所有的默認值。進程(Process)中的順序語句

轉(zhuǎn)向控制語句:

Case語句和If語句的區(qū)別:在大多數(shù)情況下,能用Case語句描述的邏輯電路,同樣也可以用多條件If語句來描述。但有時能用If語句描述的邏輯電路,卻不能用Case語句描述。通常在Case語句中,條件表達式(When語句)可以顛倒次序,不致于發(fā)生錯誤。但對于多條件的If語句,卻不能顛倒條件的次序。因為在Case語句中,條件表達式是沒有優(yōu)先級的,而多條件的If語句的條件是有優(yōu)先級的。在If語句中,最前面的條件其優(yōu)先級最高,越往后優(yōu)先級越低,也就是說,先處理最起始的條件;如果不滿足,再處理下一個條件。而在Case語句中,所有值的判定是并行處理的。例如,優(yōu)先級編碼器可以用If語句來描述,但不可以用Case語句描述。進程(Process)中的順序語句

轉(zhuǎn)向控制語句:例5(8位優(yōu)先編碼器):EntitypriorityIs

port(I:inbit_vector(7downto0);A:outbit_vector(2downto0);--encodedoutputGS:outbit);--groupsignaloutputEndpriority;Architecturev1OfpriorityIsBegin

process(I)beginGS<='1';--setdefaultoutputsA<="000";

IfI(7)='1'thenA<="111";

ElsifI(6)='1'thenA<="110";

ElsifI(5)='1'thenA<="101";

ElsifI(4)='1'thenA<="100";

ElsifI(3)='1'thenA<="011";

ElsifI(2)='1'thenA<="010";

ElsifI(1)='1'thenA<="001";

ElsifI(0)='1'thenA<="000";ElseGS<='0';Endif;Endprocess;Endv1;進程(Process)中的順序語句

轉(zhuǎn)向控制語句:循環(huán)控制語句——For循環(huán):

For循環(huán)語句的基本格式:

[標號:]For循環(huán)變量in循環(huán)次數(shù)范圍Loop順序描述語句;

End

Loop

[標號];這里,標號是可以省略的;循環(huán)變量是整數(shù)型變量,它不需要在結(jié)構(gòu)體或進程中定義,在循環(huán)體(由順序描述語句構(gòu)成)中不能通過信號或變量給循環(huán)變量賦值。進程(Process)中的順序語句

轉(zhuǎn)向控制語句:例6

For循環(huán)(奇偶校驗電路):Entityparity_checkerIs

Port(data:Instd_logic_vector(7downtoO);

p:Outstd_logic);Endparity_checker;ArcLitecturebehaviorOfparity_checkerIs

Begin

Process(data)

Variabletmp:std_logic;

Begin

tmp:=‘0’;

Foriin7downto

0Loop

tmp:=tmp

xor

data(i);

EndLoop;

p<=tmp;

EndProcess;Endbehavior;進程(Process)中的順序語句轉(zhuǎn)向控制語句:循環(huán)控制語句——While循環(huán):

While循環(huán)語句的基本格式:

[標號:]While條件Loop順序描述語句;

End

Loop

[標號];這里,當條件為“真”時,執(zhí)行循環(huán)體中的語句;如果條件為“假”時,則結(jié)束循環(huán)。在循環(huán)體內(nèi),必須包含條件式中判別變量的賦值語句,否則會形成死循環(huán)。實際上,固定次數(shù)的循環(huán)一般用For循環(huán),不定次數(shù)的循環(huán)用While循環(huán)比較方便。但在進行需要綜合的電路描述時,不定次數(shù)的循環(huán)較難控制,所以,一般不用While循環(huán)。進程(Process)中的順序語句

轉(zhuǎn)向控制語句:

Next語句:

Next語句的基本格式:

Next[標號]

[When條件];

Next語句用于從循環(huán)體跳出本次循環(huán)。執(zhí)行到該語句時,如果條件為“真”時,將結(jié)束本次循環(huán),跳到“標號”規(guī)定的語句,開始下次循環(huán)。如果標號省略,則表示跳到本層循環(huán)的起始位置,開始下一次循環(huán)。如果標號不省略,則可以跳到多層嵌套循環(huán)的指定外層循環(huán)起始處。如果“When條件”省略,則執(zhí)行到Next語句時無條件結(jié)束本次循環(huán)。如果“When條件”不省略,則條件為True時,結(jié)束本次循環(huán)。進程(Process)中的順序語句

轉(zhuǎn)向控制語句:

Exit語句:

Exit語句的基本格式:

Exit[標號]

[When條件];

Exit語句用于結(jié)束循環(huán)。執(zhí)行到該語句時,如果條件為“真”時,將結(jié)束循環(huán),跳到“標號”規(guī)定的語句。如果標號省略,則表示跳到EndLoop語句的后繼位置,開始向后執(zhí)行。如果標號不省略,則可以跳到多層嵌套循環(huán)的指定外層循環(huán)起始處。如果“When條件”省略,則執(zhí)行到Next語句時無條件結(jié)束循環(huán)。如果“When條件”不省略,則條件為True時,結(jié)束循環(huán)。進程(Process)中的順序語句

轉(zhuǎn)向控制語句:

Next語句和Exit語句的區(qū)別:

Next只結(jié)束本次循環(huán),開始下一次循環(huán);而Exit語句結(jié)束整個循環(huán),跳出循環(huán)體外。進程(Process)中的順序語句

Wait等待語句(進程掛起語句):進程的狀態(tài)還可以通過Wait語句來控制,當進程執(zhí)行到Wait語句時,將被掛起,并設置好再次執(zhí)行的條件??梢允菬o限等待(Wait)或有限等待。有限等待的條件可以是:等待一段時間(WaitFor)、等待某些信號發(fā)生變化(Waiton)、等待某個條件滿足(WaitUntil),這幾個條件還可以組合成一個復合條件。進程(Process)中的順序語句

Wait等待語句(進程掛起語句):

Waiton語句格式:

Waiton信號列表;信號列表可以包括一個或多個信號,信號列表中的任何一個信號的值發(fā)生變化,進程將結(jié)束掛起狀態(tài),進入執(zhí)行狀態(tài),執(zhí)行Waiton語句后面的語句。如:

Waitona,b,s;它等待信號a、b、s中的任何一個發(fā)生變化。進程(Process)中的順序語句

Wait等待語句(進程掛起語句):例7:Entitymux2Is

Port(a,b:Instd_logic;

s:Instd_logic;

f:Outstd_logic);Endmux2;ArchitecturebehaviorOfmux2IsBegin

mux2:Process(a,b,s)

Begin

If(s=‘0’)Thenf<=a;

Elsef<=b;

EndIf;

EndProcess;Endbehavior;mux2:Process()Begin

If(s=‘0’)Thenf<=a;

Elsef<=b;

EndIf;

Waitona,b,s;EndProcess;進程(Process)中的順序語句

Wait等待語句(進程掛起語句):

WaitUntil語句格式:

WaitUntil布爾表達式;當布爾表達式為“真”時,進程將結(jié)束掛起狀態(tài),進入執(zhí)行狀態(tài),執(zhí)行WaitUntil語句的后繼語句。如:

WaitUntila=’1’;此時,當信號量a的值不是’1’時,進程執(zhí)行到該語句將被掛起,當a的值為’1’時進程再次被啟動,繼續(xù)執(zhí)行Wait語句的后繼語句。進程(Process)中的順序語句Wait等待語句(進程掛起語句):

WaitFor語句格式:

WaitFor時間表達式;如:

WaitFor30ns;

WaitFor語句只能仿真時使用,不能被綜合。進程(Process)中的順序語句

Wait等待語句(進程掛起語句):復合Wait語句:例如:

Waitonclkuntilclk=‘1’;該語句等待到clk信號的值發(fā)生變化,而且clk的值為‘1’(即clk從‘0’變到‘1’時),進程將結(jié)束掛起狀態(tài),進入執(zhí)行狀態(tài),執(zhí)行該語句的后繼語句。編程時注意等待條件的判別,不要出現(xiàn)“死鎖”狀態(tài)(即無限期等待)。進程(Process)中的順序語句

空操作語句:格式:

Null;進程(Process)中的順序語句

斷言語句Assert:

Assert語句的格式是:

Assert條件[report輸出信息]

[severity級別]斷言語句主要作為仿真和調(diào)試中的人-機會話,可以給出一個文字串作為警告和錯誤提示信息。當執(zhí)行Assert語句時,就會對條件進行判別。如果條件為“真”,則執(zhí)行下一條語句;如果條件為“假”,則輸出由report指定的輸出信息和由severity指定的錯誤級別。在report后面跟的是設計者所寫的文字串,通常是說明錯誤的原因,文字串應該用雙引號“”引起來。斷言語句不是一條可綜合語句,僅僅是為了仿真的方便。進程(Process)中的順序語句

斷言語句Assert:例:

Assert

(B=’1’)

report”Btimedoutat

’1’”;

severityerror;

該斷言語句的條件是信號量B=’1’。如果執(zhí)行到該語句時,信號量B=’0’,說明條件不滿足,就會輸出report后跟的文字串。該文字串說明,出現(xiàn)了超時等待錯誤。severity后跟的錯誤級別告訴操作人員,其出錯級別為error。第五章Vhdl并行語句并發(fā)信號賦值語句

注意:信號賦值語句在順序語句里面也有,順序語句里可以給信號賦值也可以給變量賦值,而順序語句里只能對變量說明,不能對信號說明。并行語句剛好相反為什么變量不能在并行語句里面說明呢?為什么信號不能在順序語句里面說明呢?并發(fā)語句信號是全局的,變量是局部的

賦值方式一:信號名<=表達式賦值方式二(條件信號賦值):目標信號<=表達式1

WHEN

條件1

ELSE

表達式2

WHEN

條件2

ELSE

表達式3

WHEN

條件3

ELSE

表達式4注意:用條件信號賦值,只有當用進程、IF和CASE難以對電路進行描述時才用;條件信號賦值語句ELSE是必須的、不能進行嵌套且必須用在結(jié)構(gòu)體中的進程之外

賦值方式三(選擇信號賦值):WITH

選擇條件表達式

SELECT

目標信號<=信號表達式1

WITH

選擇條件1

信號表達式2

WITH

選擇條件2

信號表達式3

WITH

選擇條件3

信號表達式4

WITH

OTHERS

注意:選擇信號賦值語句必須用在結(jié)構(gòu)體中的進程之外

并發(fā)信號賦值語句的三種形式并發(fā)語句

塊語句在VHDL語言設計中,塊語句常常用來對比較復雜的結(jié)構(gòu)體作結(jié)構(gòu)化描述,格式如下

[塊標號:]

BLOCK

[衛(wèi)式表達式]

[類屬子句;]

[端口子句;]

[塊說明部分;]

BEGIN

<塊語句說明部分;>

END

BLOCK[塊標號];

衛(wèi)式表達式:是一個布爾條件表達式,只有當這個表達式為TURE時,BLOCK語句才被執(zhí)行;

類屬子句:塊的屬性說明

塊說明部分:用于定義USE、子程序、數(shù)據(jù)類型、子類型、常量、信號和元件

塊語句說明部分:用于描述塊的具體功能,可以包含結(jié)構(gòu)塊中的任何并行語句結(jié)構(gòu)。

注:塊語句的作用就是將一個大的結(jié)構(gòu)劃成一塊一塊小的結(jié)構(gòu),現(xiàn)比較流行原理圖和元件的方式,這樣更為簡潔直觀并發(fā)語句進程語句進程語句是一種應用廣泛的并行語句,一個結(jié)構(gòu)體中可以包括一個或者多個進程語句,結(jié)構(gòu)體中的進程語句是并發(fā)關(guān)系,即各個進程是同時處理的、并行執(zhí)行的;但在每一個進程語句結(jié)構(gòu)中,組成進程的各個語句都是順序執(zhí)行,在進程語句中是不能用并行語句的。

格式

[進程標號:]PROCESS

[敏感信號表]

[IS][進程語句說明部分;]

BEGIN

<順序語句部分>

END

PROCESS[進程標號];

注:

1、

敏感信號表列出了進程語句敏感的所有信號,每當其中的一個信號發(fā)生變化時,就會引起其他語句的執(zhí)行,如果敏感信號表不寫,那么在PROCESS里面必須有WAIT語句,由WAIT語句來產(chǎn)生對信號的敏感;而當敏感信號表存在時,就不能在PROCESS里再有WAIT語句;

2、

IS可有可無,是由93版規(guī)定的

3、

進程語句說明部分是進程語句的一個說明區(qū),它主要用來定義進程語句所需要的局部數(shù)據(jù)環(huán)境,包括數(shù)據(jù)類型說明、子程序說明和變量說明。

4、

進程語句有兩種存在狀態(tài),一是等待,當敏感信號沒有發(fā)生變化時;一是執(zhí)行,當敏感信號變化時。

5、時鐘信號自動進入敏感表

并發(fā)語句子程序調(diào)用語句子程序分為函數(shù)和過程,它們的定義屬于說明語句,均可在順序語句和并行語句里面使用,它們的調(diào)用方法不一樣。

函數(shù)只有一個返回值,用于賦值,可以說在信號賦值的時候就是對函數(shù)的調(diào)用;

過程有很多個返回值,用于進行處理,準確的來說子程序調(diào)用語句就是過程調(diào)用語句。并發(fā)語句

參數(shù)傳遞語句參數(shù)傳遞語句即在實體中定義的GENERIC,可以描述不由材料和不同工藝構(gòu)成的相同元件或模塊的性能參數(shù)(如延時),在定義了GENERIC的實體叫參數(shù)化實體,由參數(shù)化實體形成的元件在例化時具有很大的適應性,在不同的環(huán)境下,只須用GENERIC

MAP來修改參數(shù)就可以了使用時,在對元件例化時加在里面就可,比如已經(jīng)定義了一個AND2的實體,要在EXAMPLE里面使用AND2,要先對AND2進行元件聲明,再將AND2例化,如下:

u0:

AND2

GENERIC

MAP(參數(shù)值1,參數(shù)值2)

PORT

MAP(參數(shù)表)

并發(fā)語句

元件例化語句一個實體就相當于元件,元件名就相當于實體名,元件要實現(xiàn)的功能在實體里面就已經(jīng)描述好,比如,同一個文件夾下已經(jīng)有一個名為A.VHD的文件,如果要在另一個文件B.VHD里面用到A.VHD里面定義的功能,那么可以在B.VHD文件里面通過元件聲明和元件例化來調(diào)用A這個元件,總的來說調(diào)用元件過程就是“建立元件----元件聲明------元件例化”,元件調(diào)用時不用USE語句。注:元件聲明語句屬說明語句,不是同步語句,以下對元聲的說明是為了更好地了解元件的調(diào)用,元件的實例化之前必須要有元件聲明

元件聲明語句格式

COMPONENT

<元件名>

——元件名就是文件名,即是實體名

[GENERIC

<參數(shù)說明>;]

——這就是所產(chǎn)的元件參數(shù)

PORT<端口說明>;

END

COMPONENT;

元件例化格式:

元件符:元件名

GENERIC

MAP

(參數(shù)表)

PORT

MAP(端口表)

并發(fā)語句元件例化語句實例并發(fā)語句元件聲明元件例化并行斷言語句前面已經(jīng)說過順序斷言語句,這里的斷言語句是并行的,可以放在實體說明、結(jié)構(gòu)體和塊語句中使用,可以放在任何要觀察和調(diào)試的點上,而順序斷言語句只能在進程、函數(shù)和過程中使用其實斷言語句的順序使用格式和并行使用格式是一樣的,因此斷言語句是可以應用在任何場所的,格式請看順序的說明

并發(fā)語句思考:是不是所有的VHDL語句都可以歸結(jié)為順序語句和并行語句呢?

可以把VHDL語句分為三大類:順序語句、并行語句和說明語句,其中說語句在沒有調(diào)用之前是不會參與執(zhí)行的,如:元件和函數(shù)說明,在元件實例化和函數(shù)調(diào)用前是不參與執(zhí)行的三類語句的關(guān)系是順語句可以用在并行語句和說明語句當中;說明語句可以用在并行語句當中;而并行語句是不能用在其他語句當中,可以說并行語句屬于一種高級形態(tài),是語句的最終形態(tài)過程和函數(shù)有什么區(qū)別?過程可以具有多個返回值(準確來說不是返回值,而是這些信號在過程之中被改變),函數(shù)只有一個返回值過程通常用來定義一個算法,而函數(shù)用來產(chǎn)生一個具有特定意義的值過程中的形式參數(shù)可以有三種通信模式(輸入、輸出、雙向),而函數(shù)中的形參只能是輸入通信模式(因為函數(shù)是用來產(chǎn)生一個值的)過程中可以使用賦值語句或WAIT語句,而函數(shù)不可(因為過程是用來處理的)第六章Vhdl的描述風格VHDL語言的構(gòu)造體描述方式行為描述方式數(shù)據(jù)流描述方式(寄存器傳輸描述RTL)結(jié)構(gòu)描述方式行為描述方式所謂行為描述,就是對設計實體的數(shù)學模型的描述,其抽象程度遠遠高于數(shù)據(jù)流描述方式和結(jié)構(gòu)描述方式.行為描述類似于高級編程語言,當要描述一個設計實體的行為時,無須知道具體電路的結(jié)構(gòu),只需要用一組狀態(tài)來描述即可.行為描述的優(yōu)點在于只需要描述清楚輸入與輸出的行為,而不需要花費更多的精力關(guān)注設計功能的門級實現(xiàn).數(shù)據(jù)流描述方式數(shù)據(jù)流描述是對從信號到信號的數(shù)據(jù)流的路徑形式進行描述,因此很容易進行邏輯綜合.由于要對信號的流動路徑進行描述,因此要求設計人員對設計實體的功能實現(xiàn)要有一定的了解,有時候還需要對內(nèi)部電路有清楚的認識,具有一定的難度.結(jié)構(gòu)描述方式結(jié)構(gòu)描述方式就是在多層次的設計中,通過調(diào)用庫中的元件或是已設計好的模塊來完成設計實體功能的描述.在結(jié)構(gòu)體中,描述只表示元件(或模塊)和元件(或模塊)之間的互連,就像網(wǎng)表一樣.當引用庫中不存在的元件時,必須首先進行元件的創(chuàng)建,然后將其放在工作庫中,通過調(diào)用工作庫來引用元件.在引用元件時,要先在結(jié)構(gòu)體說明部分進行元件的說明,然后在使用元件進行元件例化.基本演變成原理圖+元件的設計方式全加器真值表AiBiCi-1SiCi0000000110010100110110010101011100111111一位全加器的邏輯示意圖ΣabCinSCo采用行為描述方法設計一位全加器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYfull_adderIS

PORT(a,b,Cin:INSTD_LOGIC;

Co,S:OUTSTD_LOGIC);ENDfull_adder;ARCHITECTUREbehavOFfull_adderISBEGIN

PROCESS(a,b,Cin)VARIABLEai,bi,ci,si:INTEGER;BEGINIF(a=‘0’)THEN

ai:=0;ELSE

ai:=1;ENDIF;IF(b=‘0’)THENbi:=0;ELSEbi:=1;ENDIF;

IF(Cin=‘0’)THEN

ci:=0;ELSE

ci:=1;ENDIF;

si:=ai+bi+ci;CASEsiISWHEN0=>S=>’0’;Co=>’0’;WHEN1=>S=>’1’;Co=>’0’;WHEN2=>S=>’0’;Co=>’1’;WHEN3=>S=>’1’;Co=>’1’;WHENOTHERS=>S=>’X’;Co=>’0’;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論