下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
FPGA設(shè)計(jì)與應(yīng)用大連理工大學(xué)軟件學(xué)院王潔
2016年春季第二章VerilogHDL基礎(chǔ)了解硬件描述語言特點(diǎn)。掌握VerilogHDL語言要素。掌握VerilogHDL建模(描述)方法。掌握Testbench編寫方式。VerilogHDL歷史GDA推出Verilog仿真器Verilog-XL:仿真速度快,具有交互式調(diào)試手段GatewayDesignAutomation公司推出Verilog語言,開發(fā)了仿真與驗(yàn)證工具Synopsys公司的綜合軟件開始接受Verilog輸入1983年1985年1987年1989年Cadence公司收購GDA,進(jìn)一步擴(kuò)大Verilog的影響VerilogHDL歷史OVI推出Verilog2.0,作為IEEE提案提出申請(qǐng)OpenVerilogInternational(OVI)成立,推廣VerilogHDLIEEE通過VerilogHDL標(biāo)準(zhǔn)IEEE1364-19951990年1993年1995年2001年IEEE發(fā)布了VerilogHDL標(biāo)準(zhǔn)IEEE1364-2001VerilogHDL現(xiàn)狀VerilogHDL是最廣泛使用的、具有國際標(biāo)準(zhǔn)支持的硬件描述語言,絕大多數(shù)的EDA廠商都支持;在工業(yè)界和ASIC設(shè)計(jì)領(lǐng)域,VerilogHDL應(yīng)用更加廣泛。VHDLVHDLVery-High-SpeedIntegratedCircuitHardwareDescriptionLanguage誕生于1982年;1987年底被IEEE和美國國防部確認(rèn)為標(biāo)準(zhǔn)硬件描述語言。IEEE1076(1983)IEEE1076-1995……HDL建模層次12345系統(tǒng)級(jí)(system)用高級(jí)語言結(jié)構(gòu)實(shí)現(xiàn)設(shè)計(jì)模塊的外部性能的模型。算法級(jí)(algorithmic)用高級(jí)語言結(jié)構(gòu)實(shí)現(xiàn)設(shè)計(jì)算法的模型。RTL級(jí)(RegisterTransferLevel)描述數(shù)據(jù)在寄存器之間流動(dòng)和如何處理這些數(shù)據(jù)的模型。門級(jí)(gate-level)描述邏輯門以及邏輯門之間的連接的模型。開關(guān)級(jí)(switch-level)描述器件中三極管和儲(chǔ)存節(jié)點(diǎn)以及它們之間連接的模型。VerilogHDL與VHDL的建模層次VerilogHDLVHDLVerilogHDL與VHDL對(duì)比相同點(diǎn)都能形式化抽象表示電路行為和結(jié)構(gòu);支持邏輯設(shè)計(jì)中層次與范圍的描述;具有電路仿真和驗(yàn)證機(jī)制;與工藝無關(guān)。不專門面向FPGA設(shè)計(jì)。不同點(diǎn)Verilog與C語言相似,語法靈活;VHDL源于Ada語言,語法嚴(yán)格;Verilog更適合ASIC設(shè)計(jì)。VerilogHDL與VHDL對(duì)比SystemVerilogSystemCC一種軟/硬件協(xié)同設(shè)計(jì)語言,既是系統(tǒng)級(jí)語言,也是硬件描述語言。IEEE1364Verilog-2001標(biāo)準(zhǔn)的擴(kuò)展增強(qiáng),兼容Verilog2001,將硬件描述語言(HDL)與現(xiàn)代的高層級(jí)驗(yàn)證語言(HVL)結(jié)合。VivadoHLS支持C語言子集,實(shí)現(xiàn)高層次綜合。系統(tǒng)建模描述方式數(shù)據(jù)流描述:描述電路數(shù)據(jù)流行為(assign)行為描述:描述功能(initial,always)結(jié)構(gòu)化描述:描述元器件間連接關(guān)系(例化)混合描述:Verilog允許多描述方式共存于同一模塊設(shè)計(jì)方法學(xué)自頂向下自底向上混合式moduletrist1(out,in,enable);
outputout; /*輸出信號(hào)*/
inputin,enable;//輸入信號(hào)
mytritri_inst(out,in,enable);endmodulemodulemytri(out,in,enable);
outputout;
inputin,enable;
assignout=enable?in:'bz;endmoduleVerilog程序示例三態(tài)門模塊trist1調(diào)用模塊mytri的實(shí)例元件tri_inst通過這種結(jié)構(gòu)性模塊構(gòu)造可構(gòu)成特大型模塊Verilog程序示例三態(tài)門電路(綜合)Verilog程序基本特征VerilogHDL程序是由模塊構(gòu)成的;每個(gè)模塊要進(jìn)行端口定義,并說明輸入輸方向,然后對(duì)模塊的功能進(jìn)行邏輯描述;VerilogHDL程序的書寫格式自由,一行可以寫幾個(gè)語句,一個(gè)語句也可以分寫多行;除了endmodule語句外,每個(gè)語句和數(shù)據(jù)定義的最后必須有分號(hào)。modulemuxtwo(out,a,b,sl);
inputa,b,sl;
outputout;
wirensl,sela,selb;
not#1u1(nsl,sl);//#1仿真延遲
and#1u2(sela,a,nsl);
and#1u3(selb,b,sl);
or#1u4(out,sela,selb);endmodule
同一電路的多種描述方法:二路選通門級(jí)(結(jié)構(gòu)化)描述modulemuxtwo(out,a,b,sl);
inputa,b,sl;
outputout;
regout;
always@(sloraorb)
if(!sl)out=a;
elseout=b;endmodule
modulemuxtwo(out,a,b,sl);
inputa,b,sl;
outputout;
assignout=sel?b:a;endmodule
同一電路的多種描述方法:二路選通RTL級(jí)行為描述布爾代數(shù)級(jí)行為描述同一電路的多種描述方法:二路選通二選選通電路(綜合)moduleFA_Mix(A,B,Cin,Sum,Cout);
inputA,B,Cin;
outputSum,Cout;
regCout;
regT1,T2,T3;
wireS1;
xorX1(S1,A,B); //門實(shí)例語句。
always@(AorBorCin) //always語句。
begin T1=A&Cin; T2=B&Cin; T3=A&B; Cout=(T1|T2)|T3;
end
assignSum=S1^Cin; //連續(xù)賦值語句。endmodule混合描述:1位全加器實(shí)例混合描述:1位全加器實(shí)例module
模塊名(端口列表);
端口I/O說明;
內(nèi)部信號(hào)聲明;
功能定義;endmodule例如:moduleblock(a,b,c,d);
input a,b;
output c,d;
assign c=a&b;
assign d=a|b;endmodule模塊基本結(jié)構(gòu)如果沒有這樣的編譯器指令,VerilogHDL模擬器會(huì)指定一個(gè)缺省時(shí)間單位。IEEEVerilogHDL標(biāo)準(zhǔn)中沒有規(guī)定缺省時(shí)間單位。仿真時(shí)延VerilogHDL模型中的所有時(shí)延都根據(jù)時(shí)間單位定義。assign#2Sum=A^B;#2指2個(gè)時(shí)間單位。編譯器指令需在模塊描述前定義:`timescale1ns/100ps。此語句說明時(shí),延時(shí)間單位為1ns并且時(shí)間精度為100ps。語言要素:標(biāo)識(shí)符標(biāo)識(shí)符用戶為程序描述中的Verilog對(duì)象所起的名字:
模塊名、變量名、常量名、函數(shù)名、任務(wù)名。必須以英語字母(a-z,A-Z)或下橫線符(_)起頭。其中可以包含數(shù)字、$符和下劃線符。最長可以達(dá)到1023個(gè)字符。模塊名、端口名和實(shí)例名都是標(biāo)識(shí)符。Verilog語言大小寫敏感:如sel和SEL是兩個(gè)不同的標(biāo)識(shí)符。所有的關(guān)鍵詞都是小寫的。語言要素:任務(wù)與函數(shù)任務(wù)與函數(shù)以$字符開始的標(biāo)識(shí)符表示系統(tǒng)任務(wù)或系統(tǒng)函數(shù)。任務(wù)可以返回0個(gè)或多個(gè)值,函數(shù)除只能返回一個(gè)值以外與任務(wù)相同。函數(shù)在0時(shí)刻執(zhí)行,即不允許延遲,而任務(wù)可以帶有延遲。常用于測試模擬,一般不用于源代碼設(shè)計(jì)。$display("Hi,youhavereachedLTtoday"); /*$display系統(tǒng)任務(wù)在新的一行中顯示。*/$time //該系統(tǒng)任務(wù)返回當(dāng)前的模擬時(shí)間。語言要素:編譯質(zhì)量編譯指令以`(反引號(hào))開始的某些標(biāo)識(shí)符是編譯器指令:`define和`undef,很像C語言中的宏定義指令`ifdef、`else和`endif,用于條件編譯`include文件既可以用相對(duì)路徑名定義,也可以絕對(duì)路徑`timescale編譯器指令將時(shí)間單位與實(shí)際時(shí)間相關(guān)聯(lián),該指令用于定義時(shí)延的單位和時(shí)延精度。語言要素:值集合值集合:基本值0:邏輯0或“假”1:邏輯1或“真”x:未知z:高阻(x,z不區(qū)分大小寫)值集合:常量整型實(shí)數(shù)型字符串型語言要素:整數(shù)常量表達(dá)方式<位寬>’<進(jìn)制><數(shù)字>:標(biāo)準(zhǔn)方式’<進(jìn)制><數(shù)字>:默認(rèn)位寬,與機(jī)器類型有關(guān)<數(shù)字>:不指明進(jìn)制默認(rèn)為十進(jìn)制進(jìn)制二進(jìn)制(b或B):8'b10101100,‘b1010十進(jìn)制(d或D):4'd13,512十六進(jìn)制(h或H):8'ha2八進(jìn)制(o或O):6'O41語言要素:整數(shù)常量x值和z值x:不確定:4'b100xz:高阻:16'hzzzz,沒有驅(qū)動(dòng)元件連接到線網(wǎng),線網(wǎng)的缺省值為z。思考:程序設(shè)計(jì)時(shí),何時(shí)出現(xiàn)x值?1.未初始化的寄存器2.……語言要素:整數(shù)常量負(fù)數(shù)在位寬表達(dá)式前加一個(gè)減號(hào),如-8’d5減號(hào)不可以放在位寬和進(jìn)制之間,也不可以放在進(jìn)制和具體的數(shù)之間,如8’d-5下劃線只能用在具體的數(shù)字之間,如12'b1010_1111_1010位數(shù)指的是二進(jìn)制位數(shù)。語言要素:整數(shù)常量位數(shù)擴(kuò)展最高位是0、1,高位用0擴(kuò)展:
8’b1111
等于8’b00001111
最高位是z、x,高位自動(dòng)擴(kuò)展:
4’bz
等于4’bzzzz位數(shù)截?cái)嗳绻L度定義得更小,最左邊的位被截?cái)?,如?'b1001_0011
等于3'b0115'H0FFF等于5'H1F語言要素:實(shí)數(shù)常量十進(jìn)制計(jì)數(shù)十進(jìn)制數(shù),例如:
2.0
5.68科學(xué)計(jì)數(shù)法23_5.1e2
其值為23510.0,忽略下劃線3.6E2
其值為360.0(e與E相同)***實(shí)數(shù)通常不用于FPGA源代碼的常量語言要素:字符串常量字符串字符串是雙引號(hào)內(nèi)的字符序列,不能分成多行書寫。例如:
"INTERNALERROR""REACHED->HERE"ASCII字符***字符串較少用于FPGA源代碼的常量用8位ASCII值表示的字符可看作是無符號(hào)整數(shù)。存儲(chǔ)“INTERNALERROR”,變量需要8*14位。reg[1:8*14]Message;語言要素:數(shù)據(jù)類型線網(wǎng)型wire //FPGA設(shè)計(jì)中,通常只用wire型tri
//其他類型用于仿真wortriorwandtriandtriregtri1tri0supply0supply1語言要素:數(shù)據(jù)類型線網(wǎng)型wire[msb:lsb]reg1,reg2,...regN;msb和lsb定義了范圍,并且均為常數(shù)值表達(dá)式。范圍定義是可選的。如果沒有定義范圍,缺省值為1位線網(wǎng)。 wireReset; wire[3:0]data_in;
wire[3:2]select;
wire[0:2]point;語言要素:數(shù)據(jù)類型寄存器型reg //FPGA設(shè)計(jì)中,通常只用reg型,默認(rèn)初始值eger//其他類型用于仿真timerealrealtime語言要素:數(shù)據(jù)類型寄存器型reg[msb:lsb]reg1,reg2,...regN;msb和lsb定義了范圍,并且均為常數(shù)值表達(dá)式。范圍定義是可選的。如果沒有定義范圍,缺省值為1位寄存器。
regReset;
reg[3:0]data_in;
reg[3:2]select;
reg[0:2]point;語言要素:數(shù)據(jù)類型存儲(chǔ)器存儲(chǔ)器是一個(gè)寄存器數(shù)組,使用如下:reg[msb:lsb]memory1[upper1:lower1];
reg[3:0]MyMem[63:0] //MyMem為64個(gè)4位寄存器的數(shù)組。
regBog[1:5] //Bog為5個(gè)1位寄存器的數(shù)組。***存儲(chǔ)器賦值不能在一條賦值語句中完成。***存儲(chǔ)器常用于FPGA外圍器件的仿真建模。語言要素:數(shù)據(jù)類型存儲(chǔ)器賦值(1)對(duì)每個(gè)單元逐一賦值reg[0:3]Xrom[0:2];...Xrom[0]=4'hA;Xrom[1]=4'h8;Xrom[2]=4'hF;注意:后面章節(jié)中會(huì)描述此類賦值語句一般在initial或者always語句中進(jìn)行,不能獨(dú)立存在。語言要素:數(shù)據(jù)類型存儲(chǔ)器賦值(2)系統(tǒng)任務(wù)賦值reg[3:0]RomB[7:0];$readmemb("ram.patt",RomB);//Romb是存儲(chǔ)器。文件“ram.patt”必須包含二進(jìn)制值。文件也可以包含空白空間和注釋。
右邊是文件中可能內(nèi)容的實(shí)例。11011110100001110000100100110001語言要素:數(shù)據(jù)類型參數(shù)參數(shù)是一個(gè)常量,常用于定義時(shí)延和變量的寬度。
parameterLINELENGTH=132;
parameterALL_X_S=16'bx;
parameterBIT=1,BYTE=8,PI=3.14;
parameterSTROBE_DELAY=(BYTE+BIT)/2;下劃線參數(shù)值可以在編譯時(shí)被改變。使用參數(shù)定義語句或通過在模塊初始化語句中定義參數(shù)值。語言要素:空白符、注釋空白符除了字符串中的空白符,其他空白符編譯被忽略。注釋多行注釋/**/(不允許嵌套)單行注釋//語言要素:空白符、注釋語言要素:空白符、注釋語言要素:空白符、注釋語言要素:空白符、注釋語言要素:空白符、注釋使用`timescale編譯器指令的目的是什么?寫出產(chǎn)生下圖所示波形的變量BullsEye的初始化語句。使用數(shù)據(jù)流描述方式編寫下圖所示的異或邏輯的VerilogHDL描述,并使用規(guī)定的時(shí)延。下列表達(dá)式的位模式是什么?
7'o44,'Bx0,5'bx110,'hA0,10'd2,'hzF
練習(xí)一表達(dá)式由操作數(shù)和操作符組成;表達(dá)式可以在出現(xiàn)數(shù)值的任何地方使用;表達(dá)式是數(shù)據(jù)流描述的基礎(chǔ)。語言要素:表達(dá)式A&BAddr1[3:0]+Addr2[3:0]Count+1(a[0]^b[0])|(a[1]&~b[1])語言要素:表達(dá)式常數(shù)參數(shù)線網(wǎng)寄存器函數(shù)調(diào)用位選擇部分選擇存儲(chǔ)器單元操作數(shù)類型語言要素:操作數(shù)常數(shù)表達(dá)式中的整數(shù)值可被解釋為有符號(hào)數(shù)或無符號(hào)數(shù);如果整數(shù)是基數(shù)型整數(shù),作為無符號(hào)數(shù)對(duì)待。參數(shù)參數(shù)類似于常量,并且使用參數(shù)聲明進(jìn)行說明。12 01100的5位向量形式 (有符號(hào))-12 10100的5位向量形式 (有符號(hào))5’b01100
十進(jìn)制數(shù)12 (無符號(hào))parameterLOAD=4'd12,STORE=4'd10;LOAD和STORE為參數(shù),值分別被聲明為12和10。語言要素:操作數(shù)線網(wǎng)線網(wǎng)中的值被解釋為無符號(hào)數(shù),表達(dá)式中可使用:標(biāo)量線網(wǎng)(1位)和向量線網(wǎng)(多位)。wire[3:0]led; //4位向量線網(wǎng)。wireline; //標(biāo)量線網(wǎng)。assignled=4d’ha;//被賦于位向量1010,為十進(jìn)制10。思考:為何沒有用assign語句賦值?寄存器參數(shù)類似于常量,并且使用參數(shù)聲明進(jìn)行說明。
integer型的值被解釋為有符號(hào)的二進(jìn)制補(bǔ)碼數(shù),
reg型或time型的值被解釋為無符號(hào)數(shù),
real型和realtime的值被解釋為有符號(hào)浮點(diǎn)數(shù)。reg[4:0]state;State=5'b01011; //值為位向量01011,十進(jìn)制值11。State=9; //值為位向量01001,十進(jìn)制值9。語言要素:操作數(shù)語言要素:操作數(shù)位選擇 位選擇從向量中抽取特定的位。形式如下:
net_or_reg_vector[bit_select_expr]State[1]&&State[4] //寄存器位選擇。led[0]|line //線網(wǎng)位選擇。***如果選擇表達(dá)式的值為x、z或越界,則位選擇的值為State[x]值為x。(FPGA設(shè)計(jì)中禁用)***選擇范圍越界或?yàn)閤、z時(shí),部分選擇的值為x。(FPGA設(shè)計(jì)中禁用越界)部分選擇net_or_reg_vector[msb_const_expr:lsb_const_expr]State[4:1] //寄存器部分選擇。reg[4:0]state;led[2:0] //線網(wǎng)部分選擇。wire[3:0]led;語言要素:操作數(shù)語言要素:操作數(shù)存儲(chǔ)器單元 存儲(chǔ)器單元從存儲(chǔ)器中選擇一個(gè)memory[word_address]reg[7:0]Dram[63:0];Dram[60]; //存儲(chǔ)器的第61個(gè)單元。***不允許對(duì)存儲(chǔ)器變量值部分選擇或位選擇。思考:在存儲(chǔ)器中讀取一個(gè)位或部分選擇一個(gè)字?/*$time是系統(tǒng)函數(shù),并且SumOfEvents是在別處定義的用戶自定義函數(shù)。*/函數(shù)調(diào)用表達(dá)式中可使用函數(shù)調(diào)用。$time+SumOfEvents(A,B)語言要素:操作數(shù)算術(shù)關(guān)系相等邏輯按位歸約移位條件拼接語言要素:操作符操作符類型操作符從最高優(yōu)先級(jí)到最低優(yōu)先級(jí)排列。語言要素:操作符操作符操作操作符操作+一元加|歸約或-一元減~|歸約或非!一元邏輯非*乘~一元按位取反/除&歸約與%取模~&歸約與非+二元加^歸約異或-二元堿^~或~^歸約異或非<<左移操作符從最高優(yōu)先級(jí)到最低優(yōu)先級(jí)排列。語言要素:操作符操作符操作操作符操作>>右移!==非全等<小于&按位與<=小于等于^按位異或>大于^~或~^按位異或非>=大于等于|按位或==邏輯相等&&邏輯與!=邏輯不等||邏輯或===全等?:條件運(yùn)算符語言要素:操作符關(guān)聯(lián)順序除條件操作符從右向左關(guān)聯(lián)外,其余所有操作符自左向右關(guān)聯(lián)。圓括號(hào)圓擴(kuò)號(hào)能夠用于改變優(yōu)先級(jí)A+B-C 等價(jià)于:(A+B)-C //自左向右A?B:C?D:F 等價(jià)于:A?B:(C?D:F) //從右向左(A?B:C)?D:F語言要素:操作符算術(shù)運(yùn)算符除條件操作符從右向左關(guān)聯(lián)外,其余所有操作符自左向右關(guān)聯(lián)。 + (加) -
(減)
*
(乘)
/ (除)
% (取模)后三種不常用,視具體設(shè)計(jì)結(jié)構(gòu)而定;任意操作數(shù)是X或Z,那么整個(gè)結(jié)果為X;結(jié)果的長度由最長的操作數(shù)決定;reg和wire保存無符號(hào)數(shù)。語言要素:操作符 > (大于) < (小于) >= (不小于) <= (不大于)關(guān)系操作符的結(jié)果為真(1)或假(0);如果操作數(shù)中有一位為X或Z,那么結(jié)果為X。關(guān)系操作符比較兩個(gè)操作數(shù)求下列表達(dá)式真值:23>4552<8'hxFF'b1000>='b011100X0語言要素:操作符相等運(yùn)算符判斷兩個(gè)操作數(shù)相等關(guān)系。 == (邏輯相等) != (邏輯不等) === (全等) !== (非全等)如果比較結(jié)果為假則結(jié)果為0,為真結(jié)果為1;在全等比較中,值x和z嚴(yán)格按位比較。語言要素:操作符===01xz==01xz01000010xx10100101xxx0010xxxxxz0001zxxxx求下列表達(dá)式真值:假定 Data=‘b11x0; Addr=‘b11x0;求 Data==Addr
Data===AddrX1語言要素:操作符 && (邏輯與) || (邏輯或)
!
(邏輯非)只對(duì)邏輯值運(yùn)算,結(jié)果一位,邏輯值1、0或x;對(duì)于向量操作,非0向量作為1處理;如果任意一個(gè)操作數(shù)包含x,結(jié)果也為x。邏輯操作符兩個(gè)操作數(shù)的邏輯運(yùn)算。語言要素:操作符010111假定: C='b0;//0為假 D='b1;//1為真
A_Bus='b0110; B_Bus='b0110;求 C&&D C||D !D A_Bus&&B_Bus A_Bus||B_Bus !A_Bus求下列表達(dá)式真值:語言要素:操作符按位操作符操作數(shù)對(duì)應(yīng)位上按位操作,并產(chǎn)生向量結(jié)果。 ~ (一元非) & (二元與) | (二元或) ^ (二元異或) ~^或^~(二元異或非)邏輯操作符產(chǎn)生一位真值,按位操作符產(chǎn)生向量值。邏輯操作符多用于判斷條件,按位操作符用于向量運(yùn)算。語言要素:操作符&01xz00000101xxx0xxxz0xxx|01xz000xx10111xx1xxzx1xx^01Xz001xx110xxxxxxxzxXxx^~01xz010xx101xxxxxxxzxxxx~01xz10xx語言要素:操作符假定 A='b0110; B='b0100;求 A|B A&B
A||B A&&B4'b01104'b010011邏輯操作符產(chǎn)生一位真值,按位操作符產(chǎn)生向量值。邏輯操作符多用于判斷條件,按位操作符用于向量運(yùn)算。求下列表達(dá)式真值:語言要素:操作符 & (歸約與) ~& (歸約與非) | (歸約或) ~| (歸約或非) ^ (歸約異或) ~^ (歸約異或非)符號(hào)形式與按位操作符類似。一元操作符。常用于某些特定值的判斷。歸約操作符在單一操作數(shù)的所有位上操作,并產(chǎn)生1位結(jié)果。語言要素:操作符假定: A=‘b0110; B=‘b0100;
MyReg=4‘b01x0;求 ~&A ^A |B &B |MyReg ^MyReg
11101x求下列表達(dá)式真值:語言要素:操作符移位操作符操作數(shù)的邏輯移位。 << (左移) >> (右移)左側(cè)操作數(shù)移動(dòng)右側(cè)操作數(shù)表示的次數(shù),邏輯移位,空閑位添0補(bǔ)位;如果右側(cè)操作數(shù)的值為x或z,移位操作的結(jié)果為x。例:使用移位操作為2-4解碼器建模wire[3:0]DecodeOut;assignDecodeOut=4'b1<<Address[1:0];語言要素:操作符假定: reg[7:0]Qreg;
Qreg=4'b0111;移位 Qreg>>2
Qreg<<
1
4'b00014'b1110思考:如何使用移位操作符實(shí)現(xiàn)算術(shù)移位?
符號(hào)位不變,數(shù)據(jù)位按照補(bǔ)碼規(guī)則移位補(bǔ)位。求Qreg的值:語言要素:操作符?:三目運(yùn)算符例:條件操作符根據(jù)條件表達(dá)式的值選擇表達(dá)式,形式: cond_expr?expr1:expr2wire[2:0]Student;assignStudent=Marks>18?Grade_A:Grade_C;語言要素:操作符拼接操作符連接操作,將小表達(dá)式合并形成大表達(dá)式操作:
{expr1,expr2,...,exprN}復(fù)制操作,指定重復(fù)次數(shù)來執(zhí)行操作:
{repetition_number{expr1,expr2,...,exprN}wire[7:0]Dbus,[11:0]Abus;assignDbus[7:4]={Dbus[0],Dbus[1],Dbus[2],Dbus[3]};assignAbus={3{4'b1011}};//位向量12'b1011_1011_1011assignAbus={{4{Dbus[7]}},Dbus}; /*符號(hào)擴(kuò)展*/說明參數(shù)GATE_DELAY,參數(shù)值為5。假定長度為64個(gè)字的存儲(chǔ)器,每個(gè)字8位,編寫Verilog代碼,按逆序交換存儲(chǔ)器的內(nèi)容。即將第0個(gè)字與第63個(gè)字交換,第1個(gè)字與第62個(gè)字交換,依此類推。假定32位總線Address_Bus,編寫一個(gè)表達(dá)式,計(jì)算從第11位到第20位的歸約與非。假定一條總線Control_Bus[15:0],編寫賦值語句將總線分為兩條總線:Abus[0:9]和Bbus[6:1]。編寫一個(gè)表達(dá)式,執(zhí)行算術(shù)移位,將Qparity中包含的8位有符號(hào)數(shù)算術(shù)移位。練習(xí)二使用條件操作符,編寫賦值語句選擇NextState的值。如果CurrentState的值為RESET,則NextState的值為GO;如果CurrentState的值為GO,則NextState的值為BUSY;如果CurrentState的值為BUSY;則NextState的值為RESET。如何從標(biāo)量變量A,B,C和D中產(chǎn)生總線BusQ[0:3]?如何從兩條總線BusA[0:3]和BusY[20:15]形成新的總線BusR[10:1]?練習(xí)二modulemodule_name(port_list); Declarations_and_Statements;endmodule模塊基本單元定義成模塊形式端口隊(duì)列port_list列出了該模塊通過哪些端口與外部模塊通信。模塊與端口模塊與端口缺省的端口類型為wire型;output或inout能夠被重新聲明為reg型,但是input不可以;線網(wǎng)或寄存器必須與端口說明中指定的長度相同。端口模塊的端口可以是
input (輸入端口) output(輸出端口) inout (雙向端口)moduleMicro(PC,Instr,NextAddr);//端口說明input [3:1] PC;output [1:8] Instr;inout [16:1] NextAddr;//重新說明端口類型:wire [16:1]NextAddr;//該說明是可選的,但如果指定了,就必須與它的端口說明保持相同長度。reg [1:8] Instr;//Instr已被重新說明為reg型,因此能在always語句或在initial語句中賦值。...endmodule模塊與端口:一個(gè)例子module_nameinstance_name(port_associations);信號(hào)端口可以通過位置或名稱關(guān)聯(lián);但是關(guān)聯(lián)方式不能夠混合使用。端口關(guān)聯(lián)形式port_expr //通過位置,隱式關(guān)聯(lián)PortName(port_expr) //通過名稱,顯示關(guān)聯(lián),強(qiáng)烈推薦!一個(gè)模塊能夠在另外一個(gè)模塊中被引用,這樣就建立了描述的層次。模塊實(shí)例語句形式:模塊與端口MicroM1(UdIn[3:0],{WrN,RdN},Status[0],Status[1],&UdOut[0:7],TxData);模塊實(shí)例語句模塊與端口12345標(biāo)識(shí)符(reg型或wire型)位選擇部分選擇上述類型的合并表達(dá)式(只適用于input型信號(hào))port_expr可以是以下的任何類型思考:
port_expr顯式關(guān)聯(lián)的優(yōu)勢?端口關(guān)聯(lián)與高級(jí)語言參數(shù)傳遞的區(qū)別?moduleHA(A,B,S,C);inputA,B;outputS,C;assignS=A^B;assignC=A&B;endmodulemoduleFA(P,Q,Cin,Sum,Cout);inputP,Q,Cin;outputSum,Cout;wireS1,C1,C2;HAh1(P,Q,S1,C1); //通過位置隱式關(guān)聯(lián)。HAh2(.A(Cin),.S(Sum),.B(S1),.C(C2));//顯式關(guān)聯(lián)。orO1(Cout,C1,C2); //或門實(shí)例語句。endmodule模塊與端口:構(gòu)造全加器考慮如何模塊參數(shù)化?使用兩個(gè)半加器模塊構(gòu)造全加器moduleHA(A,B,S,C);inputA,B;outputS,C;parameterAND_DELAY=1,XOR_DELAY=2;assign
#XOR_DELAYS=A^B;assign
#AND_DELAYC=A&B;EndmodulemoduleFA(P,Q,Cin,Sum,Cout);inputP,Q,Cin;outputSum,Cout;parameterOR_DELAY=1;wireS1,C1,C2;HAh1(P,Q,S1,C1); //通過位置隱式關(guān)聯(lián)。HAh2(.A(Cin),.S(Sum),.B(S1),.C(C2));//顯式關(guān)聯(lián)。or
#OR_DELAYO1(Cout,C1,C2); //或門實(shí)例語句。endmodule模塊與端口:構(gòu)造全加器使用兩個(gè)半加器模塊構(gòu)造全加器(參數(shù)化)DFFd1( .Q(QS), .Qbar(), .Data(D), .Preset(), .Clock(CK));通過將端口表達(dá)式表示為空白來指定為懸空端口。模塊與端口懸空端口模塊與端口moduleChild(Pba,Ppy);input[5:0]Pba;output[2:0]Ppy;...endmodulemoduleTop;
wire[1:2]Bdl;wire[2:6]Mpr;ChildC1(.Pba(Bdl),.Ppy(Mpr));endmodule通過無符號(hào)數(shù)的右對(duì)齊或截?cái)喾绞竭M(jìn)行匹配。端口匹配543210Ppy12Bdl21023456MprPbamoduleTOP(NewA,NewB,NewS,NewC);inputNewA,NewB;outputNewS,NewC;defparamHa1.XOR_DELAY=5;//實(shí)例Ha1中的參數(shù)XOR_DELAY。
defparamHa1.AND_DELAY=2;//實(shí)例Ha1中參數(shù)的AND_DELAY。HAHa1(NewA,NewB,NewS,NewC);endmodule模塊中使用defparam語句,不能在模塊外定義。模塊與端口:改變參數(shù)值參數(shù)定義語句模塊與端口:改變參數(shù)值moduleTOP(NewA,NewB,NewS,NewC);inputNewA,NewB;outputNewS,NewC;HA#(5,2)Ha1(NewA,NewB,NewS,NewC);//第1個(gè)值5賦給參數(shù)AND_DELAY,該參數(shù)在模塊HA中說明。//第2個(gè)值2賦給參數(shù)XOR_DELAY,該參數(shù)在模塊HA中說明。endmodule模塊例化時(shí)直接改變參數(shù),有利于代碼重用。帶參數(shù)引用moduleScram_B(.Data(Arb),.Control(Ctrl),.Mem_Word(Mem_Blk),.Addr(Byte));input[0:3]Arb;inputCtrl;input[8:0]Mem_Blk;output[0:3]Byte;...endmodule顯式地指定外部端口。(較少使用)模塊與端口外部端口練習(xí)三模塊實(shí)例語句與門實(shí)例語句的區(qū)別是什么?當(dāng)端口懸空時(shí),即端口沒有被連接時(shí),端口的值是什么?用本章講述的模塊FA編寫執(zhí)行加法和減法的4位ALU的結(jié)構(gòu)模型。門級(jí)建模多輸入門:and,nand,or,nor,xor,xnor多輸出門:buf,not三態(tài)門:bufif0,bufif1,notif0,notif1上拉、下拉電阻:pullup,pulldownMOS開關(guān):cmos,nmos,pmos,rcmos,rnmos,rpmos雙向開關(guān):tran,tranif0,tranif1,rtran,rtranif0,rtranif1內(nèi)置基本門VerilogHDL中提供豐富的內(nèi)置基本門。***FPGA設(shè)計(jì)中較少使用數(shù)據(jù)流建模wireZ1,Preset,Clear; //線網(wǎng)說明assignZ1=Preset&Clear; //連續(xù)賦值語句wire[15:0]data_in;wire[15:0]data_tmp;wiredata_tmp={data_in[7:0],data_in[15:8]};基本方法連續(xù)賦值用于數(shù)據(jù)流建模,生成組合邏輯電路。連續(xù)賦值使用連續(xù)賦值語句assign語句,格式為:assignLHS_target=RHS_expression;數(shù)據(jù)流建模執(zhí)行方式只要右端表達(dá)式的操作數(shù)上有事件發(fā)生(值變化),表達(dá)式立即被計(jì)算,新結(jié)果就賦給左邊的線網(wǎng)。賦值目標(biāo)1)標(biāo)量線網(wǎng) assignZ1=…;2)向量線網(wǎng) assigndata_tmp=…;3)向量的常數(shù)型位選擇assigndata_tmp[2]=…;4)向量的常數(shù)型部分選擇assigndata_tmp[7:0]=…;5)上述類型的任意的拼接運(yùn)算結(jié)果
assign{Z1,data_tmp[15]}=2’b10;數(shù)據(jù)流建模例:數(shù)據(jù)流描述的一位全加器moduleFA_Df(A,B,Cin,Sum,Cout);inputA,B,Cin;outputSum,Cout;assignSum=A^B^Cin;assignCout=(A&Cin)|(B&Cin)|(A&B);endmoduleassign語句之間是并發(fā)的,與其書寫的順序無關(guān);線網(wǎng)的賦值可以在聲明時(shí)賦值,例如:wireSum=A^B^Cin;數(shù)據(jù)流建模數(shù)據(jù)流建模的時(shí)延assign#2Sum=A^B^Cin;#2表示右側(cè)表達(dá)式的值延遲兩個(gè)時(shí)間單位賦給Sum;那么時(shí)間單位是多少?由誰來決定?`timescale1ns/100psFPGA設(shè)計(jì)中的時(shí)延僅在功能仿真時(shí)有效,不影響實(shí)際電路生成。數(shù)據(jù)流建模注意事項(xiàng)1)wire型變量如果不賦值,默認(rèn)值為z;2)數(shù)據(jù)流建模沒有存儲(chǔ)功能,不能保存數(shù)據(jù);3)wire型變量只能在聲明時(shí)賦值或者assign語句賦值;4)assign語句并發(fā)執(zhí)行,實(shí)際的延遲又物理芯片的布線結(jié)果決定;5)最基本的FPGA設(shè)計(jì)源代碼描述語句之一,用于生成組合邏輯,定制LUT的邏輯功能。常作為中間信號(hào)的描述用于控制寄存器的輸入輸出。使用assign語句描述一個(gè)時(shí)鐘信號(hào)clk,頻率為100MHz。
assign#5clk=~clk;請(qǐng)指出下列語句是否合法?描述了怎樣的功能?assignMux=(S==0)?A:'bz;assignMux=(S==1)?B:'bz;assignMux=(S==2)?C:'bz;assignMux=(S==3)?D:'bz;練習(xí)四行為建?;痉椒ㄟ^程賦值用于行為建模(描述)行為建模的主要機(jī)制: 1)initial語句主要用于仿真文件(模擬) 2)always語句 用于源文件和仿真文件所有initial語句和always語句之間都是并發(fā)執(zhí)行;執(zhí)行順序與其在模塊中書寫順序無關(guān)。initial[timing_control]procedural_statement行為建模:initial語句執(zhí)行方式initial語句只執(zhí)行一次;在模擬開始時(shí)執(zhí)行,即在0時(shí)刻開始執(zhí)行;不能嵌套使用。procedural_statement方式較多,體現(xiàn)出行為建模的靈活性。procedural_continuous_assignment過程賦值(阻塞或非阻塞)conditional_statement -> ifcase_statement -> caseloop_statement -> for,forever,repeat,whilewait_statement -> waitdisable_statement -> disable(相當(dāng)于C的break)event_trigger -> @(event)sequential_block -> begin...endparallel_block -> fork...jointask_enable(userorsystem)行為建模:initial語句procedural_statement可以是:行為建模:initial語句例regCurt;initial#2Curt=1;例parameterSIZE=1024;reg[7:0]RAM[0:SIZE-1];regRibReg;initialbeginintegerIndex;RibReg=0;for(Index=0;Index<SIZE;Index=Index+1) RAM[Index]=0;end parameterAPPLY_DELAY=5; reg[0:7]port_A;
initial begin Port_A='h20; #APPLY_DELAYPort_A='hF2; #APPLY_DELAYPort_A='h41; #APPLY_DELAYPort_A='h0A; end行為建模:initial語句initial語句在仿真文件構(gòu)造數(shù)據(jù)示例‘h20‘hF2‘h41‘h0A101550
parameter
CYC_PERIOD=5;
regclk;
initial
begin clk=0;
while(1) //或者forever
clk=#(CYC_PERIOD/2)~clk;
//或者#(CYC_PERIOD/2)
clk=~clk;
end行為建模:initial語句initial語句在仿真文件產(chǎn)生時(shí)鐘示例always[timing_control]procedural_statement行為建模:always語句procedural_continuous_assignment過程賦值(阻塞或非阻塞)conditional_statement -> ifcase_statement -> caseloop_statement -> for,forever,repeat,whilewait_statement -> waitdisable_statement -> disable(相當(dāng)于C的break)event_trigger -> @(event)sequential_block -> begin...endparallel_block -> fork...jointask_enable(userorsystem)always語句重復(fù)執(zhí)行,語法和initial語句完全相同。procedural_statement可以是:行為建模:always語句兩種典型的always語句1.電平觸發(fā)reg
c;always@(aorborsel) c=sel?a:b;說明:(1)雖然c是reg型,但綜合的結(jié)果可能是組合電路。(2)等同于數(shù)據(jù)流描述
wirec;
assignc=sel?a:b;(3)FPGA設(shè)計(jì)中不建議使用;此外,容易產(chǎn)生意外鎖存器。行為建模:always語句綜合后生成的電路圖行為建模:always語句兩種典型的always語句2.時(shí)鐘沿觸發(fā)(時(shí)序邏輯)
reg
[8:0]count;always@(posedgeclkornegedgereset)
begin
if(~reset) count=0;
else
begin
if(count==511) count=0;
else
count=count+1;
end
end行為建模:always語句always語句在always語句中所有被賦值的信號(hào)必須是reg型;綜合為觸發(fā)器,推薦使用;同步或者異步時(shí)序邏輯。常見過程語句reg
Stream;initialBegin
Stream=0; #12Stream=1; #5Stream=0; #3Stream=1; #4Stream=0; #2Stream=1; #5Stream=0;end時(shí)序控制語句,僅用于仿真測試1.時(shí)序控制常見過程語句時(shí)序控制語句,僅用于仿真測試2.事件控制reg[9:0]addr;integeri;initialbegin
for(i=0;i<5;i=i+1)
@(posedgeclk) addr=addr+1;end邊沿觸發(fā)事件電平觸發(fā)事件initialbegin
wait(Sum>22) Sum=0;end順序語句塊begin…end源程序、測試文件塊內(nèi)語句順序執(zhí)行思考:
initial語句若使用fork…join如何描
述下圖時(shí)序?fork…join測試文件塊內(nèi)語句并行執(zhí)行并行語句塊常見過程語句時(shí)序電路的行為具有并行特性:寄存器都受到時(shí)鐘的控制,流水線…既然fork…join不能在源文件中使用,在行為描述中如何描述并行語句?
begin…end中的語句是順序執(zhí)行,在同一時(shí)鐘邊沿觸發(fā)下,每個(gè)寄存器變量為何賦值有先有后?這與實(shí)際電路是否矛盾?常見過程語句問題過程賦值語句定義:initial和always語句中的賦值語句區(qū)別于數(shù)據(jù)流描述的連續(xù)賦值語句(assign)分為阻塞過程賦值和非阻塞過程賦值兩種常見過程語句always@(posedgeclkor
negedgerst)begin
if(~rst) …//寄存器復(fù)位
elseif(…)
begin a=1'b1; b=a;
endendalways@
(posedgeclkor
negedgerst)begin
if(~rst) …//寄存器復(fù)位
elseif(…)
begin a<=1'b1; b<=a;
endendb=?常見過程語句阻塞過程賦值非阻塞過程賦值結(jié)論源代碼設(shè)計(jì)推薦使用非阻塞過程賦值“<=”可以有效綜合為寄存器邏輯電路符合實(shí)際,時(shí)序分析簡單語句之間并行執(zhí)行,不再有順序關(guān)系阻塞過程賦值“=”多用于仿真測試文件適合構(gòu)造仿真模型和仿真行為不容易直接綜合為FPGA資源常見過程語句initialbeginClr=#5 0;Clr=#4 1;Clr=#10 0;endinitialbeginClr<=#5 1;Clr<=#4 0;Clr<=#10 0;end常見過程語句過程賦值連續(xù)賦值在always語句或initial語句內(nèi)出現(xiàn)在一個(gè)模塊內(nèi)出現(xiàn)執(zhí)行與周圍其他語句有關(guān)與其他語句并行執(zhí)行;在右端操作數(shù)的值發(fā)生變化時(shí)執(zhí)行驅(qū)動(dòng)寄存器驅(qū)動(dòng)網(wǎng)線使用”=“或”<=“賦值符號(hào)使用”=”賦值符號(hào)無assign關(guān)鍵詞有assign關(guān)鍵詞常見過程語句過程賦值與連續(xù)賦值的比較
與C語言類似If
(condition_1)
procedural_statement_1{elseif(condition_2)
procedural_statement_2}{else
procedural_statement_3}條件語句必須在過程塊語句中使用,不能單獨(dú)使用;if后面的表達(dá)式的值只有為1時(shí)才按“真”處理。常見過程語句if語句if(表達(dá)式1)
if(表達(dá)式2)語句1;
else
語句2;
else
if(表達(dá)式3)語句3;
else
語句4;else總是與它最上面的最近的if配對(duì);如果if與else的數(shù)目不一樣,為了實(shí)現(xiàn)程序設(shè)計(jì)者的目的,可以用begin…end語句確定配對(duì)關(guān)系;強(qiáng)烈建議保留else分支。常見過程語句if語句的嵌套always@(posedgeclkor
negedgerst)begin
if(~rst)
begin ctrl <=#12’b00; flag <=#10;
end
elseif(~flag)
begin ctrl <=#12’b01; flag <=#11;
endelse flag <=#10;end常見過程語句例常見過程語句綜合電路類似C語言的switchcase語句
case(case_expr) case_item_expr{,case_item_expr}: procedural_statement...... [default:procedural_statement]endcase常見過程語句case語句rege;always@(posedgeclkor
negedgerst)begin
if(~rst) e<=#10; else
case({a,b})2'b00:e<=#1d;2'b01:e<=#1~c;2'b11:e<=#11'b0;2'b11:e<=#11'b1;
default:; //空語句,強(qiáng)烈建議保留default分支表達(dá)式
endcaseend常見過程語句常見過程語句綜合電路常見過程語句casex語句和casez語句語法與case非常相似不建議使用casez(ir)8b’1???????:instruction1(ir);8b’01??????:instruction2(ir);8b’00010???:instruction3(ir);8b’000001??:instruction4(ir);endcase思考:用四種循環(huán)語句分別實(shí)現(xiàn)initial中的時(shí)鐘產(chǎn)生:在100ns出開始;周期10ns。常見過程語句循環(huán)語句forever語句
repeat語句
while語句
for語句
連續(xù)執(zhí)行的循環(huán);只用于測試程序的initial塊中;綜合工具很難綜合成FPGA的邏輯電路。練習(xí)五描述電路行為:該電路在每一個(gè)時(shí)鐘下跳沿(負(fù)沿)檢查輸入數(shù)據(jù),當(dāng)輸入數(shù)據(jù)Usg為1011時(shí),輸出Asm被置為1。描述電路行為:輸入為12位的向量。如果其中1的數(shù)量超過0的數(shù)量,輸出設(shè)置為1。當(dāng)Data_Ready為1時(shí),才對(duì)輸入數(shù)據(jù)進(jìn)行檢查。
提示:輸入信號(hào)均有clk和rst,采用時(shí)序邏輯設(shè)計(jì)(always語句)自頂向下設(shè)計(jì)采用數(shù)據(jù)流建模、行為建模、結(jié)構(gòu)化建模三種方式基于本章內(nèi)容,可以設(shè)計(jì)FPGA可實(shí)現(xiàn)的Verilog源代碼VerilogHDL源代碼設(shè)計(jì)開始你的第一個(gè)Verilog功能模塊源代碼設(shè)計(jì)VerilogHDL源代碼設(shè)計(jì)12345根據(jù)需求,進(jìn)行模塊功能劃分,自頂向下設(shè)計(jì)定義各個(gè)模塊的接口信號(hào)(包括方向、類型、寬度)定義全局時(shí)鐘信號(hào)和全局復(fù)位信號(hào)編寫頂層模塊,例化子模塊子模塊功能設(shè)計(jì),以時(shí)序邏輯設(shè)計(jì)為主與軟件源代碼設(shè)計(jì)最大的不同:時(shí)序的嚴(yán)格性!基本設(shè)計(jì)流程VerilogHDL源代碼設(shè)計(jì)如何驗(yàn)證源代碼設(shè)計(jì)的正確性功能仿真(前仿真)進(jìn)行語法檢查,error和warning設(shè)計(jì)testbench,根據(jù)激勵(lì)輸入驗(yàn)證邏輯功能邏輯綜合……Testbench驗(yàn)證如何驗(yàn)證源代碼設(shè)計(jì)的正確性模擬實(shí)際環(huán)境的輸入激勵(lì)和輸出校驗(yàn)的一種“虛擬平臺(tái)”以輸入激勵(lì)為主,輸出校驗(yàn)可以通過波形觀測Testbench驗(yàn)證1234Testbench和源代碼都是.v文件Testbench和源代碼都是moduleTestbench不能綜合成FPGA內(nèi)部電路接口信號(hào)定義被測試模塊的輸入激勵(lì)設(shè)置為reg型;被測試模塊的輸出設(shè)置為wire型;雙向端口inout在測試中需要進(jìn)行特殊處理。Testbench驗(yàn)證為什么信號(hào)方向與類型的對(duì)應(yīng)關(guān)系與之前的要求不同源代碼看作testbench子模塊源代碼頂層的輸入是testbench的輸出源代碼頂層的輸出是testbench的輸入Testbench驗(yàn)證Testbench中inout信號(hào)的使用inout[15:0]data;wire[15:0]data;reg[15:0]data_out;regdata_enable;方法1assigndata=data_enable?data_out:16‘hz;方法2IOBUF(.I(data_out),.O(),.T(data_enable),.IO(data));moduletestbench();//信號(hào)類型定義(wire或者reg),注意testench沒有輸入輸出?!?/例化頂層模塊…//激勵(lì)行為描述,通常都包含clk和rst的產(chǎn)生描述initial… //可使用各種合法語句always…assign…task… //類似于函數(shù)endmoduleTestbench驗(yàn)證Testbench的結(jié)構(gòu)Testbench驗(yàn)證1在同一項(xiàng)目中的VerilogTestFixtureXilinxISE工具提供testbench的自動(dòng)生成模板與哪個(gè)源代碼文件關(guān)聯(lián)就生成對(duì)應(yīng)層次的Testbench23Testbench自動(dòng)生成模板Testbench驗(yàn)證Testbench驗(yàn)證空模板樣例需增加clk的產(chǎn)生rst的使能描述。輸入信號(hào)的行為描述。initialbeginReset=0;#100Reset=1;#80Reset=0;#30Reset=1;endTestbench驗(yàn)證值序列產(chǎn)生產(chǎn)生值序列的最簡單是使用initial語句。例如:parameterREPEAT_DELAY=35;integerCoinValue;always begin CoinValue=0; #7CoinValue=25; #2CoinValue=5; #8CoinValue
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 旅游客服人員聘用合同
- 城中村租賃合同:服裝店租賃細(xì)則
- 廣告創(chuàng)意策劃師聘用合同
- 通訊設(shè)備銷售代表招聘合同
- 農(nóng)莊租賃合同:農(nóng)業(yè)種植基地
- 商業(yè)綜合體自來水安裝協(xié)議
- 鋁合金風(fēng)力發(fā)電設(shè)備生產(chǎn)合同
- 可持續(xù)旅游合同管理辦法
- 電信工程腳手架施工合同范本
- 珠寶設(shè)計(jì)代理協(xié)議
- 2024年度石料供應(yīng)框架協(xié)議
- 2024年度技術(shù)開發(fā)合同違約處理3篇
- 辦公家具無償租賃合同
- 臥式橢圓封頭儲(chǔ)罐液位體積對(duì)照表
- 《家庭安全用電培訓(xùn)》課件
- 人教版數(shù)學(xué)一年級(jí)上冊 前后上下左右專項(xiàng)練習(xí)題(試題)
- 【初中道法】樹立正確的人生目標(biāo)(課件)-2024-2025學(xué)年七年級(jí)道德與法治上冊(統(tǒng)編版2024)
- 全國自考社會(huì)經(jīng)濟(jì)調(diào)查方法與應(yīng)用真題
- 鋼結(jié)構(gòu)施工方案編制指南
- 山東省青島市2024-2025學(xué)年七年級(jí)上學(xué)期11月期中英語試題
- 2024年貴陽新春燈會(huì)元宵彩燈策劃方案
評(píng)論
0/150
提交評(píng)論