chVerilogHDL语法与要素实用_第1页
chVerilogHDL语法与要素实用_第2页
chVerilogHDL语法与要素实用_第3页
chVerilogHDL语法与要素实用_第4页
chVerilogHDL语法与要素实用_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

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

文档简介

会计学1chVerilogHDL语法与要素实用2(2)多行注释。以起始符“/*”开始,到终止符“*/”结束,可以跨越多行,在一对起始符与终止符之间的所有内容都被认为是注释。注释语句第1页/共79页3标识符是用户定义的各种名称,可以是模块、端口、寄存器、线网、实例和程序块等元素的名称,比如语句“moduleadder;”就定义了一个标识符adder,而语句“regabc;”则定义了标识符abc。标识符可以是字母、数字和下划线“_”等符号的任意组合序列,但首字符不能是数字,而且单个标识符的总字符数不能多于1024。关键词是语言的保留字,有其特定的和专有的语法作用,用户不能再对这些关键词做新的定义。VerilogHDL共有102个关键词。注意:关键词必须是小写的,如“module”是关键词,而“Module”不是。标识符和关键词第2页/共79页4VerilogHDL提供了丰富的数据类型,本章把VerilogHDL的数据分为常量和变量两类,并分别介绍其特点和使用方法。表达式是操作符、操作数和标点符号序列,其目的是用来说明一个计算过程。程序中的大部分语句是由表达式构成的,因此表达式是VerilogHDL的重要部分。数据类型与表达式第3页/共79页5在程序运行过程中,其值不能被改变的量称为常量。VerilogHDL有整型、实数型、字符串型3种常量。在整型或实数型常量的任意位置可以随意插入下划线“_”(但是不能当作首符号),这些下划线对数本身并没有意义,但是当数字很长时使用下划线可以提高可读性。6.2常量(constants)第4页/共79页6VerilogHDL有4种基本值:0

表示逻辑0或“假”;1

表示逻辑1或“真”;x

表示未知;z

表示高阻。注意:x值和z值都是不分大小写的,也就是说,值0x1z与值0X1Z相同。(尽量统一使用小写)VerilogHDL的常量是由以上这4种基本值组成的。第5页/共79页7整型常量即整数,VerilogHDL的整数有两种书写格式:十进制数格式,基数格式。(1)十进制数格式是一个可以带正负号的数字序列,代表一个有符号数,如下例:

32//十进制数32-15//十进制数-15(1)整形常量第6页/共79页8(2)基数格式的数通常是无符号数,形式如下:[size]'base

valuesize定义常量的位数(长度),这是可选项;base是基数,规定这个数据的进制,可以是o或O(表示八进制),b或B(表示二进制),d或D(表示十进制),h或H(表示十六进制)之一;value是一个数字序列,其形式应与base定义的形式相符。这个数字序列中出现的值x和z以及十六进制中的a~f不区分大小写,“?”字符可以代替值z。第7页/共79页9下面给出一些典型书写方法,有正确的也有错误的。5'O37//5位八进制数4'D2//4位十进制数4'B1x_01//4位二进制数7'Hx//7位x(扩展的x),即xxxxxxx4'hZ//4位z(扩展的z),即zzzz2'h1?//2位十六进制数,与2'h1z相同8'h2A//在位数和字符之间,以及基数和数值之间允许出现空格

4'd-4//非法:数值不能为负3'b001//非法:'和基数b之间不允许出现空格(2+3)'b10//非法:位数不能够为表达式第8页/共79页10如果没有定义常量的位数,那么这个数的长度就是相应值的位数,例如:'o721//9位八进制数'hAF//8位十六进制数如果定义的长度大于数字序列的实际长度,通常在数据序列的高位(左侧)补0。但是如果这个数字序列最左边一位为x或z,就用x或z在左边补位,例如:10'b10//左边补0,000000001010'bx0x1//左边补x,xxxxxxx0x1如果定义的长度小于数字序列的实际长度,这个数字序列最左边超出的位将被截断,例如:3'b1001_0011//与3'b011相等5'H0FFF//与5'H1F相等第9页/共79页11在VerilogHDL中,实数就是浮点数,实数的定义方式有两种:(1)十进制格式,由数字和小数点组成(必须有小数点),例如:2.05.67811572.120.12.//非法:小数点右侧必须有数字(2)实数型常量第10页/共79页122)指数格式,由数字和字符e(E)组成,e(E)的前面必须要有数字而且后面必须为整数,例如:23_5.1e2//其值为23510.0,忽略下划线3.6E2//其值为360.0(e与E相同)5E-4//其值为0.0005第11页/共79页13字符串常量是由一对双引号括起来的字符序列。出现在双引号内的任何字符(包括空格和下划线)都将被作为字符串的一部分。如下例:"INTERNALERROR“"REACHED->HERE"//空格出现在双引号内,所以是字符串的组成部分"12345_6789_0"//下划线出现在双引号内,所以是字符串的组成部分(3)字符串型常量第12页/共79页14实际上,字符都会被转换成二进制数,而且这种二进制数是按特定规则编码的。现在普遍都采用ASCII码,这种代码把每个字符用一个字节(8位)的二进制数表示。所以字符串实际就是若干个8位ASCII码的序列。例如字符串“INTERNALERROR”共有14个字符,存储这个字符串的变量就需要8*14位的存储空间,如下:reg[1:8*14]Message;//定义变量Message并分配存储空Message="INTERNALERROR"//给变量Message赋值为字符串常量第13页/共79页15VerilogHDL有线网和寄存器两种类型的变量,每种类型都有其在电路中的实际意义。1.线网型变量线网表示元件之间的物理连线,它不能存储数据。线网是被“驱动”的,可以用连续赋值或把元件的输出连接到线网等方式给线网提供“驱动”,给线网提供驱动的赋值和元件就是“驱动源”,线网的值由驱动源决定。如果没有驱动源连接到线网,线网的缺省值为z。6.3数据类型第14页/共79页16VerilogHDL共有11种线网类型:wire、tri、wor、trior、wand、triand、trireg、tri1、tri0、supply0、supply1。线网的声明语法形式如下:net_kind

[msb:lsb]

net1,net2,...,netN;net_kind是线网类型;[msb:lsb]定义线网宽度的最高位和最低位,这一项是可选的,如果没有定义宽度,那么认为线网宽度是1位;net1,net2……netN是线网变量的名称。第15页/共79页17可以在同一个定义中声明多个变量,例如:wireRdy,Start;//Rdy和Start是2个1位的连线

wand[2:0]Addr;//Addr是3位线与型线网线网可以有多个驱动源(多条语句对同一个线网进行赋值),每个驱动源都会给线网赋值,出现这种情况时,线网的取值由线网类型决定。第16页/共79页18worRde;//定义Rde为线或类型的线网assignRde=Blt&Wyl;//第一个连续赋值语句是Rde的第1个驱动源assignRde=Kbl|Kip;//第二个连续赋值语句是Rde的第2个驱动源本例中,Rde有两个驱动源,它们分别来自于两个连续赋值语句。由于Rde是“线或”类型的线网,所以Rde的有效值由驱动源的值(右边表达式的值)的线或表决定,具体做法是:把这两个驱动源赋给线网的两个值作为索引去线或表中查询,就可以得到线网真正的有效值。第17页/共79页19在这11种线网中,经常用到的是前6种,下面给出其详细的(1)wire和tri线网wire连线。tri三态线。wire和tri型线网都是用于连接单元的连线,是最常见的线网类型。二者语法和语义一致,不同的是三态线可以用于描述多个驱动源驱动同一根线的线网类型。第18页/共79页20下面是定义这两种线网的实例:wireReset;//1位连线Reset

wire[3:2]Cla,Pla,Sla;//Cla,Pla和Sla都是2位连线

tri[MSB-1:LSB+1]Art;//三态线Art,位宽由表达式确定第19页/共79页21wire(或tri)01xz00xx01x1x1xxxxxz01xz(1)wire(tri)真值表如果多个驱动源驱动一个连线(或三态线网),这个线网的有效值由下列表决定第20页/共79页22例子:assignCla=Pla&Sla;//第1个驱动源...assignCla=Pla^Sla;//第2个驱动源在这个例子中,Cla有两个驱动源。两个驱动源的值用于在上表中进行索引,以便决定Cla的有效值。Cla是一个向量,在查表确定其有效值时应按位操作。例如,如果第1个驱动源的值为01x,第2个驱动源的值为11z,那么Cla的有效值是x1x(两个值的第一位0和1在表中索引到x,第2位1和1在表中索引到1,第3位x和z在表中索引到x)。第21页/共79页23wor线或。trior三态线或。线或的含义是只要这类线网的某个驱动源值是1,那么线网的值就是1。线或和三态线或在语法和功能上是一致的。例如:wor[MSB:LSB]Art;trior[MAX-1:MIN-1]Rdx,Sdx,Bdx;(2)wor和trior线网第22页/共79页24wor(或trior)01xz001x011111xx1xxz01xzwor和trior真值表如果多个驱动源驱动这类线网,其有效值由下列表决定第23页/共79页25wand线与。triand三态线与。线与的含义是只要这类线网的某个驱动源值是0,那么线网的值就是0。线与和三态线与在语法和功能上是一致的。例如:wand[-7:0]Dbus;

triandReset,Clk;(3)wand和triand线网第24页/共79页26wand和triand真值表wand(或triand)01xz00100101x1x0xxxz01xz如果这类线网存在多个驱动源,线网的有效值由下列表决定第25页/共79页27trireg三态寄存器。这种线网可以存储数值(类似于寄存器),可用于电容节点的建模。当没有驱动源时,三态寄存器线网的缺省初始值为x。当它的所有驱动源都处于高阻态(值都为z)时,三态寄存器保存的值是作用在该线网上的最后一个值。例如:(4)trireg线网第26页/共79页28tri0三态0。tri1三态1。这两类线网可以用于线逻辑的建模,即线网有多于一个驱动源。tri0(tri1)线网的特征是,若无驱动源驱动,它的值为0(tri0)或1(tri1)。例如:tri0[-3:3]GndBus;

tri1[0:-5]OtBus,ItBus;(5)tri0和tri1线网第27页/共79页29tri0和tri1真值表tri0(或tri1)01xz00xx01x1x1xxxxxz01x0(1)在有多个驱动源情况下,tri0和tri1的有效值有下列表得到第28页/共79页30supply0用于对“地”建模,即低电平0。supply1用于对电源建模,即高电平1。例如:supply0Gnd,ClkGnd;

supply1[2:0]Vcc;(6)supply0和supply1线网第29页/共79页31在VerilogHDL中,可以不必声明某种线网的类型。在这样的情况下,缺省线网类型为1位连线(wire)。wire是VerilogHDL内置的默认线网类型,可以使用编译器指令`default_nettype改变这一默认线网类型。使用方法如下:`default_nettypenet_kind这里的net_kind就成为系统默认的线网类型,例如:`default_nettypewand带有这条编译器指令的程序中,任何未被说明类型的线网都被设置为1位线与。(7)未说明的线网第30页/共79页32scalared标量线网。vectored向量线网。scalared和vectored是声明线网时的可选项。如果没有定义这一项,那么缺省值是标量线网(scalared),前面所有程序中的线网都是这样的。如果某个线网声明时使用了vectored,那么就不允许对该线网做位选择(只选择线网值中的1位)和部分选择(选择线网值中的部分位),必须对线网整体赋值。(8)scalared线网和vectored线网第31页/共79页33例如:wirevectored[3:1]Grb;//使用了vectored不允许位选择(如Grb[2])和部分选择(如Grb[3:2])

worscalared[4:0]Best;//使用了scalared,效果与“wor[4:0]Best;”相同,允许位选择(如Best[2])和部分选择(如Best[3:1])第32页/共79页34程序中经常多次出现某些数字,如延迟时间或变量的宽度,有时(如调用任务或实例化模块时)可能要改变这些值,这种情况下经常要用到参数。参数一经声明,就视其为一个常量,在整个仿真过程中不再改变。其声明形式如下:parameter参数名1=表达式1,param2=const_expr2,...,paramN=const_exprN;parameter是用于声明参数的关键词;param1、param2…paramN是标识符;const_expr1、const_expr2…const_exprN分别是标识符要代表的数字,它们可以不仅仅是数字,也可以是计算表达式。6.4参数(parameter)第33页/共79页35。下面是3条参数声明语句:parameterLINELENGTH=132,ALL_X_S=16'bx;parameterBIT=1,BYTE=8,PI=3.14;parameterSTROBE_DELAY=(BYTE+BIT)/2;使用参数可以提高程序的可读性,也利于修改,尤其是延迟时间和变量宽度这些在调试中可能经常修改的值。第34页/共79页366.5向量向量:线宽大于1位的变量MSB(MostSignificantBit):最高有效位LSB(LeaseSignificantBit):最底有效位[msb:lsb]reg[3:0]canos;wire[5:0]bus;第35页/共79页37位选择和域选择A:1位B:7位A=B[4];assignc=a[2]&b[3];位选择assignc=a[7:4]+b[3:0];域选择6543210第36页/共79页38表达式的操作数可以是线网或寄存器的某个位,即位选择。位选择是从线网(或寄存器)中选择特定的某个位。形式如下:net_or_reg_vector[bit_select_expr]其中,net_or_reg_vector是向量线网或寄存器名,bit_select_expr是要选择位的编号。例如:State[1]&&State[4]//寄存器位选择,让State[1]和State[4]做逻辑与操作Prt[0]|Bbq//线网位选择,让Prt[0]和Bbq做位或操作第37页/共79页39上例中,State是多位寄存器,Prt多位线网,Bbq是1位线网,可见通过使用位选择可以对线网和寄存器中的某个位进行操作。注意,如果bit_select_expr的值为x、z或越界,那么位选择得到的值为x,如State[x]值为x。第38页/共79页40和位选择类似,线网或寄存器的部分连续位也可以作为表达式中的操作数。部分选择是在线网或寄存器中选择某几个连续的位。形式如下:net_or_reg_vector[msb:lsb]其中,net_or_reg_vector是向量线网或寄存器名,msb和lsb声明了要选择的位的编号范围。部分选择第39页/共79页41例如:State[1:4]//State是多位寄存器,寄存器部分选择,选择了State中编号从1到4的4个位

Prt[1:3]//Prt是多位线网,线网部分选择,选择了Prt中编号从1到3的3个位注意,在部分选择中若msb或lsb的值为x、z或它们标定的范围超出了向量的实际范围时,部分选择的值为x。第40页/共79页42存储器建模是使用reg声明寄存器组,不能在一条语句内就完成对存储器内所有寄存器单元的赋值,必须对其中的存储器单元(即单个寄存器)进行赋值。形式如下:memory[word_address]其中,memory是存储器名,word_address是要选择单元的编号(即某个寄存器的编号)。存储器第41页/共79页43例如:reg[1:8]Ack,Dram[0:63];/*定义了一个8位寄存器Ack和一个有64个8位寄存器组成的存储器*/...Ack=Dram[60];//把存储器Dram的编号为60的存储单元的值赋给Ack注意,虽然存储器单元就是寄存器,但不允许对存储器单元做位选择或部分选择。例如:Dram[60][2]//位选择不允许

Dram[60][2:4]//部分选择也不允许第42页/共79页44如果想从存储器中读取一个位或部分位,可以先把存储器单元赋值给某个寄存器变量,然后对该寄存器变量进行位选择或部分选择操作。如在上例中做了Ack=Dram[60]之后,Ack[2]和Ack[2:4]就能够取出存储器单元Dram[60]的某个位或部分位。第43页/共79页45VerilogHDL的操作符有如下9种类型:算术操作符关系操作符相等操作符逻辑操作符按位操作符归约操作符移位操作符条件操作符连接和复制操作符6.6运算符第44页/共79页46操作符的优先级和名称优先级别操作符名称优先级别操作符名称优先级别操作符名称优先级别操作符名称1+加9|或17>>右移25!==非全等2-减10~|或非18<小于26&位与3!逻辑非11*乘19<=小于等于27^位异或4~求反12/除20>大于28^~,~^异或非5&与13%取模21>=大于等于29|位或6~&与非14+二元加22==相等30&&逻辑与7^异或15-二元减23!=不等31||逻辑或8~^或^~异或非16<<左移24===全等32?:条件第45页/共79页47其中,除条件操作符从右向左关联外,其余所有操作符均自左向右关联。如表达式:A+B-C等价于:(A+B)-C//自左向右而表达式:A?B:C?D:F等价于:A?B:(C?D:F)//从右向左通过使用圆扩号可以改变优先级的顺序,如下例:(A?B:C)?D:F//改变了条件操作符的优先级第46页/共79页48算术操作符有如下5种:+(加法操作符)-(减法操作符)*(乘法操作符)/(除法操作符)%(模操作符,或称求余操作符,%两侧都应为整型数据)1.算术操作符第47页/共79页49注意:整数除法将截断所有小数部分,如7/4结果为1;模操作符将求出与第一个操作数符号相同的余数,如7%4结果为3,而-7%4结果为-3;如果算术操作符的操作数中出现x或z,那么整个算术操作的运算结果为x。例如:'b10x1+'b01111的结果为不确定数'bxxxxx。第48页/共79页50进行算术操作时,表达式中操作数的长度可能不一致,这时运算结果的长度由最长的操作数决定。在赋值语句中,算术操作结果的长度由操作符左端的赋值目标长度决定。例如:reg[0:3]Arc,Bar,Crt;reg[0:5]Frx;Arc=Bar+Crt;//长度由Bar,Crt和Arc长度决定,长度为4位Frx=Bar+Crt;//长度由Frx的长度决定(Frx、Bat和Crt中的最长长度),长度为6位(1)算术操作结果的长度第49页/共79页51在第一个赋值中,加法操作的溢出部分被丢弃;而在第二个赋值中,任何溢出的位存储在结果位Frx[1]中。在较大的表达式中,中间结果的长度应取最大操作数的长度(赋值时此规则也包括左端赋值目标)。例如:wire[4:1]Box,Drt;wire[1:5]Cfg;wire[1:6]Peg;wire[1:8]Adt;...assignAdt=(Box+Cfg)+(Drt+Peg);//赋值语句第50页/共79页52赋制语句表达式右端的操作数最长为6(Peg),但是表达式左端操作数的长度为8(Adt),所以所有的加操作都使用8位,所以Box与Cfg相加的结果和Drt与Peg相加结果的长度都是8位。第51页/共79页53执行算术操作和赋值时,要注意哪些操作数是无符号数、哪些操作数是有符号数。无符号数存储在线网、一般寄存器和基数格式表示形式的整数中。有符号数存储在整数寄存器和十进制形式的整数中。(2)无符号数和有符号数第52页/共79页54例如:reg[0:5]Bar;integerTab;...Bar=-4'd12;/*Bar是普通寄存器类型变量,只能存储无符号数,而右端表达式的值为'b110100(12的二进制补码),因此在赋值后,Bar存储十进制值52*/第53页/共79页55在上面两种情况下,位向量存储内容相同,但是在Bar中,位向量被视为无符号数,而在Tab中,位向量被视为有符号数。下面再给出几组例子。Bar=-4'd12/4;//Bar被赋于十进制值61(位向量为111101)Tab=-4'd12/4;//Tab被赋于与十进制1073741821(位值为0011...11101)

Bar=-12/4//Bar被赋予与第一个赋值相同的值,是因为Bar只存储无符号数Tab=-12/4//Bar被赋于十进制值-3第54页/共79页56Bar=4-6;//Bar被赋于十进制值62(-2的二进制补码)Tab=4-6;//Tab被赋于十进制值-2(位向量为111110)

Bar=-2+(-4);//Bar被赋于十进制值58(位向量为111010)Tab=-2+(-4);//Tab被赋于十进制值-6(位向量为111010)第55页/共79页57关系操作符是对两个操作数进行比较,如果比较结果为真则结果为1,如果比较结果为假则结果为0,关系操作符多用于条件判断。关系操作符有如下4种:>(大于)<(小于)>=(不小于)<=(不大于)2.关系操作符第56页/共79页58如果操作数中有x或z出现,那么结果为x。例如:23>45//结果为假(0)52<8'hxFF//结果为x如果操作数的长度不同,那么长度较短的操作数在高位添0补齐。例如:'b1000>='b01110//结果为假(0)操作时给左侧操作数高位添0,等价于:'b01000>='b01110//结果为假(0)第57页/共79页59与关系操作符类似,相等操作符也是对两个操作数进行比较,如果比较结果为假,则结果为0,否则结果为1。相等操作符有如下4种:==(逻辑相等)!=(逻辑不等)===(全等)!==(非全等)3.相等操作符第58页/共79页60其中,“==”和“!=”是把两个操作数的逻辑值做比较,由于操作数中某些位可能是x或z,所以比较结果也有可能是x。而“===”和“!==”是按位进行比较,即便在两个操作数中某些位出现了x或z,只要它们出现在相同的位,那么就认为二者是相同的,比较结果为1,否则为0,而不会出现结果为x的情况。第59页/共79页61例如:Data='b11x0;Addr='b11x0;那么:Data===Addr//为真,也就是说值为1,因为全等操作严格按位比较Data==Addr//这是逻辑比较,操作数中出现了x,所以结果为x第60页/共79页62如果操作符两端操作数的长度不相等,长度较小的操作数在高位添0补位,例如:2'b10==4'b0010//结果为真(1)与下面的表达式相同:4'b0010==4'b0010//结果为真(1)第61页/共79页63逻辑操作符是对操作数做与、或、非运算,操作结果为0或1。逻辑操作符有3种:&&(逻辑与)||(逻辑或)!(逻辑非)4.逻辑操作符第62页/共79页64逻辑操作符的操作数只能是逻辑值0或1,例如:Crd='b0;//Crd是逻辑0Dgs='b1;//Dgs是逻辑1那么:Crd&&Dgs//结果为0(假)Crd||Dgs//结果为1(真)!Dgs//结果为0(假)第63页/共79页65如果操作数是向量,那么非0向量被当作逻辑1,例如:A_Bus='b0110;//A_Bus不是0向量,被当作逻辑1B_Bus='b0100;//B_Bus不是0向量,被当作逻辑1那么:A_Bus||B_Bus//结果为1A_Bus&&B_Bus//结果为1!A_Bus//结果为0!B_Bus//结果为0在逻辑操作中,如果任意一个操作数包含x,结果也为x,如!x的结果为x。第64页/共79页66位操作符是对操作数按位进行与、或、非等逻辑操作。位操作符有如下5种:~(一元非,只有一个操作数位于右侧)&(二元与,有两个操作数位于左右两侧)|(二元或,有两个操作数位于左右两侧)^(二元异或,有两个操作数位于左右两侧)~^,^~(二元异或非,有两个操作数位于左右两侧)5.位操作符第65页/共79页67例如:A='b0110;B='b0100;那么:A|B//结果为0110A&B//结果为0100如果两个操作数长度不相等,长度较小的操作数在高位添0补位,例如:'b0110^'b10000//结果为'b10110与下式相同:'b00110^'b10000//结果为'b10110第66页/共79页68归约操作符的操作数只有一个,并只产生1位结果。归约操作符有如下6种:&(归约与)如果操作数的某个位的值为0,那么结果为0;如果操作数的某个位的值为x或z,那么结果为x;否则结果为1。~&(归约与非)与归约操作符&相反。6.规约操作符第67页/共79页69例如:A='b0110;B='b0100;那么:|B//结果为1,因为B中有1&B//结果为0,因为B中有0^A//结果为0,因为A中有偶数个1归约异或操作符“^”可用于检查操作数中是否包含x,例如:MyReg=4'b01x0;^MyReg//结果为x,说明操作数MyReg中包含x第68页/共79页70移位操作符是把操作数向左或向右移位若干位。移位操作符有2种:<<(左移)>>(右移)移位操作符有两个操作数,左侧操作数是要被执行移位的数,右侧操作数表示要移位的次数。完成移位之后,因为移位而在操作数左端(右移)或右端(左移)出现的空位添0。如果右侧操作数的值为x或z,移位操作的结果为x。7.移位操作符第69页/共79页71例如:reg[0:7]Qreg;//8位寄存器...Qreg=4'b0111;//Oreg的值是0000_0111那么:Qreg>>2//右移结果是8'b0000_0001,因为右移而出现的左侧空位补0第70页/共79页72二进制数左移1位相当于乘以2,右移1位相当于除以2,所以建模时,可以使用移位操作符实现乘除。VerilogHDL中没有指数操作符,而移位操作符可用于支持部分指数操作。比如要计算2的N次方的值,可以使用移位操作实现,如下:32'b1<<N

温馨提示

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

评论

0/150

提交评论