数字电路的FPGA设计与实现-基于Quartus Prime和Verilog HDL-第3讲-Verilog HDL语法基础_第1页
数字电路的FPGA设计与实现-基于Quartus Prime和Verilog HDL-第3讲-Verilog HDL语法基础_第2页
数字电路的FPGA设计与实现-基于Quartus Prime和Verilog HDL-第3讲-Verilog HDL语法基础_第3页
数字电路的FPGA设计与实现-基于Quartus Prime和Verilog HDL-第3讲-Verilog HDL语法基础_第4页
数字电路的FPGA设计与实现-基于Quartus Prime和Verilog HDL-第3讲-Verilog HDL语法基础_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

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

文档简介

第3讲VerilogHDL语法基础1数字电路的FPGA设计与实现——基于QuartusPrime和VerilogHDLFPGADesignandImplementationofDigitalCircuits——BasedonQuartusPrimeandVerilogHDLVerilog模块Verilogmodule“

VerilogHDL是被IEEE认定的国际标准硬件描述语言,模块(module)是VerilogHDL描述数字电路的基本单元,又称建模,它可以表示一个简单的门电路,也可以是功能复杂的电路或系统。每个模块(电路)的描述均以关键词module开始,以endmodule结束(后面不用加分号)3.12模块(module)语法结构module模块名(//端口列表——端口类型-信号类型-位宽-端口名input(输入)

信号类型(wire)

位宽

端口名,

output(输出)信号类型(wire/reg)位宽

端口名,inout(双向)信号类型(wire)

位宽

端口名);//端口定义//内部变量及参数声明;wire,reg,function,task,parameter,define等//功能定义(模块功能实现)数据流描述:assign结构化描述:门级描述或module例化

行为级描述:initial,alwaysendmodule3端口定义举例①moduleled(

inputwireclk_50mhz_i,//时钟输入,50MHz

inputwirerst_n_i,//复位输入,低电平有效

outputwire[3:0]led_o//led输出,共4位);……endmodule②moduleled(clk_50mhz_i,rst_n_i,led_o);

inputwireclk_50mhz_i;//时钟输入,50MHz

inputwirerst_n_i;//复位输入,低电平有效

outputwire[3:0]led_o;//led输出,共4位……endmodule4Verilog模块举例module

EasyDS(

);

endmodule5

inputwire

a_i,b_i,//2输入a_i,b_i

outputwire

x_o,y_o,z_o

//3输出x_o,y_o,z_o

EasyDSa_ib_ix_oz_oy_o

assignx_o=a_i;

assigny_o=~b_i;//取反

assignz_o=a_i&b_i;//相与标识符定义IdentifierDefinition“

标识符是用于定义常数、变量、信号、端口、子模块或参数名称,是一组由字母、数字、$和下划线任意组合的字符串,并且必须以字母或下划线开头。在VerilogHDL中,标识符对大小写敏感,也就是说大小写不同的标识符被视为不同的名称。此外,VerilogHDL中定义的关键词不能被用作标识符使用。3.26标识符举例①合法标识符:clk_50mhz_irst_n_iled_oLED_OFF//与led_off不同_bus3n$6577②不合法标识符:3sum//不允许数字开头ab@cd//不允许包含字符@a%b//不允许包含%not//关键字不允许做标识符input

//关键字wire

//关键字逻辑值集合Logicalvalueset“

在二进制计数中,单比特逻辑值只有0”和“1”两种状态,而在Verilog语言中,为了对电路了进行确的建模,又增加了两种逻辑态,即“X”和“Z”。其中,0表示逻辑低电平,1表示逻辑高电平,X表示未知或不确定的电平,Z表示高阻态,X和Z不区分大小写。3.38逻辑值9逻辑0:表示低电平,也就对应电路中的GND、VSS逻辑1:表示高电平,也就是对应电路中的VCC、VDD逻辑X:表示末知,有可能是高电平,也有可能是低电平逻辑Z:表示高阻态,当外部没有激励信号时,是一个悬空状态,通常用来对三态总线进行建模。常量Constant“在程序运行过程中,其值不能被改变的量称为常量(constants),VerilogHDL中主要有三种类型的常量:整数型常量、实数型常量和字符串型常量。其中,整数型常量是可以综合的,而实数型和字符串型常量是不可综合的。除此之外,还可以用参数的形式来表示常量,即参数型常量。3.410整数型常量

在VerilogHDL中,整数型常量有四种进制表示形式:二进制整数(b或B)、八进制整数(o或O)、十进制整数(d或D)、十六进制整数(h或H)。<符号><位宽>'<进制><数字>

符号为“+”时表示正数,符号项必须省略;位宽和进制是可选项。位宽是指该数据以二进制位计算时的数据长度,当省略位宽项时,表示采用默认位宽(由具体的计算机系统决定,至少32位);当省略进制项时,表示采用默认的十进制表示方式;数字则是基于该进制项时的数值,当值为x、z以及十六进制中的a到f时,不区分大小写。11整数型常量示例124'b1010

//位宽为4的二进制数10104'o7

//位宽为4的八进制数799

//十进制数99,位宽由计算机决定8'h4F

//位宽为8的十六进制数4F-8'd5

//位宽为8的十进制数-5(5的8位二进制补数)26'd49_999_999

//位宽为26的十进制数499999994'b11x0

//位宽为4的二进制数从低位数起第2位为不定值4'b101z

//位宽为4的二进制数从低位数起第1位为高阻值10'dz

//位宽为10的十进制数,其值为高阻值8'h4x

//位宽为8的十六进制数,其低4位值为不定值实数型常量

实数型常量采用十进制法或者科学计数法表示,这种类型用于存储非整数,即有小数部分的数字。实数型常量是不可综合的类型,通常只在VerilogHDL的测试文件中使用。实数型变量用关键字real来声明,声明时不能带有范围,默认值为0。如果将一个实数型常量或变量赋值给一个整数型变量,则该实数值会采用四舍五入的方式将整数部分会赋值给整数型变量。十进制法/科学计数法13实数型常量示例144.5

//十进制数表示4.53.8e-2

//科学计数法表示0.038reals_r=4.49;//声明一个实数型变量s_r,值为4.49,

赋值给整数型变量时为4wire[3:0]a=12.1;

//赋值后a值为12reg

[3:0]b=-12.5;

//赋值后b值为-13字符串型常量

一个字符串(strino)型常量是由英文双引号括起来并包含在一行中的字符序列,不能分成多行进行书写。在表达式和赋值中,用作操作数的字符被视为由8位ASCII值表示的无符号整数常量,每一个8位ASCII值表示一个字符。“字符串序列”15字符串型常量示例16“C”;//字符C“characterstring”;//字符串characterstring当字符串作为变量时,是wire/reg类型的变量,其宽度等于字符串中的字符数乘以8wire[8*14:1]stringvar;//定义了一个14个ASCII值的wire变量,[8*14-1:0]assignstringvar=“Helloworld!”;//字符串参数型常量

为提高程序的可读性和可维护性,在VerilogHDL中,通常使用关键词parameter来定义参数型常量,即用parameter来定义一个标识符代表一个常量,称为符号常量。parameter参数名=表达式;

表达式中只能包含已经定义的参数或者常量数字。17参数型常量示例18

parameterLED0_ON=8'b0001;//LED0点亮

parameterLED1_ON=8'b0010;//LED1点亮

parameterLED2_ON=8'b0100;//LED2点亮

parameterLED3_ON=8'b1000;//LED3点亮

parameterLED_OFF=8'b0000;//全部LED熄灭数据类型DataType“

Verilog中数据类型的作用是表示硬件中的数据存储和传输,总体上数据类型可以分为网络(net)和变量(variable)两类,代表不同的赋值方式和硬件结构。其中,网络表示不同结构实体之间的物理连接,其本身不能存储值,它的值由它的驱动器上的值决定,常用类型为wire型;变量则表示数据存储单元,对其赋值会改变物理上数据存储单元中的值,常用类型为reg型。3.519线网(wire)型

wire型数据常用来表示以assign关键字指定的组合逻辑信号。使用wire定义的变量,主要用于结构化器件之间物理连接建模,不存储逻辑值,必须由器件驱动,通常由assign进行赋值。当一个wire类型的信号没有被驱动时,缺省值为z(高阻)。wire信号名;

//定义一个1位的wire型数据wire[width-1:0]

信号名;

//定义一个位宽为width的wire型数据20wire型示例21outputwire[3:0]led_o;//4bit位宽的led_o,且为输出端口wires_clk_1hz;//1bit位宽的1Hz时钟信号wire[1:0]s_cnt;//2bit位宽的计数信号wire[0:2]s_data;//3bit位宽的数据信号wire

[8*14:1]stringvar;//定义了一个14个ASCII值的wire变量wire[3:-2]s_d;//6bit位宽的信号,s_d[3:0]和s_d[-1:-2]可以用于

表示不同的数据,提高程序的可读性寄存器(reg)型

寄存器是数据存储单元的抽象,寄存器数据类型的关键字为reg。通过赋值语句可以改变寄存器存储的值,其作用相当于改变触发器存储的值,可用于对存储单元如D触发器、ROM存储器的描述。reg 信号名;

//定义一个1位的wire型数据reg[width-1:0]信号名;//定义一个位宽为width的wire型数据注意,reg型数据常用来表示always块中的指定信号,常代表寄存器或触发器的输出,在always语句中进行描述的变量必须申明为reg类型。22reg型示例23outputreg

[3:0]led_o;//4bit位宽的led_o,且为输出端口regs_clk_1hz;//1Hz时钟信号reg[1:0]s_cnt;//计数信号,2位reg

[0:2]s_data;//3bit位宽的数据信号reg

[2:-3]s_d;//6bit位宽的信号,s_d[2:0]和s_d[-1:-3]可以用于

表示不同的数据,提高程序的可读性运算符Operator“

在Verilog中,运算符按所带操作数的个数来区分,可分为三类:只带一个操作数的单目运算符,可带两个操作数的双目运算符以及可带三个操作数的三目运算符。按功能则可分为算数运算符、关系运算符、赋值运算符、位运算符、逻辑运算符、位拼接运算符、条件运算符和移位运算符等。3.624算术运算符

算术运算符用来执行算术运算操作,在进行算术运算操作时,如果某一个操作数有不确定的值x,则整个结果也为不定值x。assignSum=A*8’b0110_11x0;//Sum=x25算术运算符描述+加,A+B-减,A-B*乘,A*B/除,A/B,结果只取整数部分%模除(求余),A%B关系运算符32<45

//结果为Ture(1)4’b1000>5’b10010

//等价于5’b01000>5’b10010,不等式不成立,返回结果为False(0)52<8’hxF

//结果为未知(x)26关系运算符描述(返回结果真/假/未知)==等于,A==B!=不等于,A!=B<小于,A<B>大于,A>B<=小于等于,A<=B>=大于等于,A>=B赋值运算符rega=1’d0;regb=1’d1;regd=1’d0;rege=1’d1;regc,f;assignled_o=0001;27赋值运算符描述=阻塞赋值,用于对参数赋值、赋初始值和在assign语句中赋值,常用于组合逻辑电路对信号进行赋值<=非阻塞赋值,常用于时序逻辑电路对信号进行赋值,常用于以always定义的块语句中。always@(posedgeclk_i)//时钟上升沿触发alwaysbeginb=a;c=b;e<=d;f<=e;

end

//always块结束后,b=c=0,e=0,f=1;位运算符wire[7:0]A=00111100;wire[7:0]B=00001101;assignY1=~B;//取反,Y1=11110010

assignY2=A&B;//与运算,Y2=00001100assignY3=A|B;//或运算,Y3=00111101assignY4=A^B;//异或,Y4=0011000128位运算符描述~按位非,~A&按位与,A&B|按位或,A|B^按位异或,A^B^~按位同或,A^~B逻辑运算符

逻辑运算符用来执行逻辑运算操作。操作数可以是reg和wire类型的数据,无论操作数有多少位,运算结果只有一位,值为0或者1。其中“&&”和“||”是双目运算符(即要求运算符两侧各有一个操作数),其优先级别低于关系运算符,而“!”高于算术运算符。assigny1=!a&&b;//a取反后与b相与

assigny2=!(a||b);//a和b相或的结果取反29逻辑运算符描述!逻辑非,!A&&逻辑与,A&&B||逻辑或,A||B位拼接运算符reg[3:0]x=4'b1100;reg[3:0]y=4'b0010;assignz1={x,y[3],y[2],y[1],y[0]};//z1=8'b11000100assignz2={1'b1,1'b1,1'b0,1'b0,1'b0,1'b0,1'b1,1'b0};//z2=8'b1100001030位拼接运算符描述{,,,}用于位的拼接,将小表达式合并形成大表达式条件运算符条件表达式?表达式1:表达式2//如果条件表达式成立,取值表达式1,否则取值表达式2例:assignz=(a>0)?x:y;//如果a>0,z=x,否则z=y31条件运算符描述?:能够根据条件表达式的值来选择表达式移位运算符32移位运算符描述<<左移,A<<n>>右移,A>>n

其中A代表要进行移位的操作数,n代表要移几位,这两种移位运算都用0来填补移出的空位。此外,左移和右移还可以用于实现乘以2n和除以2n的功能。wire[7:0]A=00111100;//60(D)assignY1=A<<2;//Y1=11110000(B)=240(D),相当于乘以4assignY2=A>>3;//Y2=00000111(B)=7((D),相当于除以8运算符优先级33名称运算符优先级求非、求反~,!高乘、除、取模*,/,%↓加、减+,-移位<<,>>关系<,<=,>,>=等式==,!=按位与&按位异或/同或^,^~按位或|逻辑与&&逻辑或||条件?:低常用语句UsefulSentences“

VerilogHDL语句包括过程语句、块语句、赋值语句、条件控制语句、循环控制语句、编译导向语句、实例引用语句等。其中,较为常用的有assign(赋值语句)、initial和always(过程语句)、if...else和case(条件控制语句)、for和while(循环控制语句)、模块例化(实例引用语句)等。3.734assign语句

assign语句用在数据流描述中,表示对信号赋值。assign相当于连线,将一个信号的值不间断地赋值给另一个信号,或将逻辑表达式赋值给信号变量。assign语句常用于组合逻辑电路的建模中,只能对线网型(wire型)信号变量赋值。assignwire型变量=表达式;当右边表达式的变量值或运算结果发生变化时,等式右边的值便会被更新赋值给左边的wire型变量,例如将产生的时钟信号s_clk赋值给时钟输出clk_o。assignclk_o=s_clk;//clk_o随s_clk的变化而变化35initial语句

initial语句主要用于VerilogHDL的测试文件中,用来产生测试环境和设置信号记录,如果在某一条语句前面存在延迟#<delay>,那么这条initial语句的仿真将会停顿下来,在经过指定时长的延迟之后再继续执行,延迟时长与timecale定义的时延单位有关,一个模块中可以有许多个initial块,它们都是并行运行的,且initial语句只执行一次。36initialbegin

语句1语句2…语句nend;initial语句示例37`timescale

1ns/1ps…//端口定义、信号定义等initialbegina=1'b1;#10

a=1'b0;//延迟10ns后a值由1变为0,即高电平信号持续了10nsendalways语句

always语句几乎在所有的时序逻辑设计中都会使用,“敏感事件列表”用于触发always语句的执行,符合触发条件便可以一直重复执行。只有reg类型数据能够在这种语句中被赋值,reg类型数据在被赋新值前保持原有值不变。一个模块可以包含多个always块,它们都是并行执行的。38always@(敏感事件列表)begin

代码部分(详细电路设计)end;always语句示例39

always@(posedges_clk_1hz)

//在s_clk_1hz的上升沿触发

begins_data<={s_rx_data,s_data[7:1]};//逻辑右移s_cnt<=s_cnt+1'b1;//计数end条件控制语句——if...else语句

if...else语句用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的几种操作之一。if...else语句是顺序执行语句,不能单独使用,需要在always块语句中才能使用。40if(表达式1)begin

逻辑电路1endelseif(表达式2)

begin

逻辑电路2end…elsebegin

逻辑电路nendif...else语句示例41always@(posedges_clk_1hzor

negedgerst_n_i)//在s_clk_1hz的上升沿和rst_n_i的下降沿触发beginif(rst_n_i==0)s_cnt<=

2'b0;elseif(s_cnt>=CNT_MAX)s_cnt<=2'b0;else

s_cnt<=s_cnt+1'b1;end条件控制语句——case语句

case语句是多分支选择语句,同样也是顺序执行语句,不能单独使用,要在always语句中使用。42case(控制表达式)分支表达式1:begin

逻辑电路1end分支表达式2:begin

逻辑电路2end

…default:begin

逻辑电路nendendcasecase语句示例43always@(s_cnt)begincase(s_cnt)

2'b00:led_o=LED3_ON;

2'b01:led_o=LED2_ON;

2'b10:led_o=LED1_ON;

2'b11:led_o=LED0_ON;

default:led_o=LED_OFF;endcaseend循环控制语句——for循环语句

for循环语句可以根据指定的条件执行代码块多次,从而大大提高了编程效率。for循环语句可以用来实现以下基本功能:a.重复执行特定的语句或者语句块;b.在满足特定条件时跳出循环;c.根据指定的步长迭代循环变量。for循环语句同样也是顺序执行语句,不能单独使用,要在always语句中使用。44for(初始条件;循环条件;步长)begin

循环体endfor循环语句示例45reg[7:0]s_data;reg[2:0]s_count;integeri;always@(s_data)begins_count=3’b000;for(i=0;i<8;i=i+1)beginif(s_data[i]==0)begin

s_count=s_count+1;endendend循环控制语句——while循环语句

while循环语句首先判断循环条件表达式是否为真,若为假,则其后的语句一次也不执行。在循环语句中,必须有一条改变循环执行条件表达式值的语句,类似于for循环语句中的步长部分。while语句同样不能单独使用,要在always语句中使用。46while(循环条件)begin

循环体endwhile循环语句示例47reg[7:0]s_data;reg[2:0]s_count;integeri;always@(s_data)begins_count=3’b000;i=0;while(i<8)

begin

if(s_data[i]==0)

begins_count=s_count+1;

endi=i+1;endend模块例化语句

FPGA逻辑设计中通常是一个大的模块中包含了一个或多个功能子模块,通过模块调用或称为模块实例化的方式来实现这些子模块与高层模块的连接有利于简化每一个模块的代码,易于维护和修改。Verilog模块的例化有两种方式,一种是基于端口位置来例化模块,另一种则是根据端口名称来例化。48模块名例化名(

.模块端口1(与端口1连接的信号1/留空),.模块端口2(与端口2连接的信号2/留空),....模块端口n(与端口n连接的信号n/留空));模块名例化名(信号1,信号2,...,信号n);//信号与该模块声明时对应位置的端口相连,未连接的端口则在两个逗号间加上空格模块例化语句示例49moduleclk_gen_1hz(

inputwireclk_i,//时钟输入,50MHz

inputwirerst_n_i,//复位输入,低电平有效

outputwireclk_o//时钟输出,1Hz);

......endmodule

//被调用的模块moduleled(

inputwireclk_50mhz_i,//时钟输入,50MHz

inputwirerst_n_i,//复位输入,低电平有效

outputreg[7:0]led_o//8位流水灯输出);

wires_clk_1hz;//1Hz时钟信号

reg[2:0]s_cnt=3'b000;//计数信号,3位,初始值为000clk_gen_1hzu_clk_gen_1hz(.clk_i(clk_50mhz_i),.rst_n_i(rst_n_i),.clk_o(s_clk_1hz));//clk_gen_1hzu_clk_gen_1hz(clk_50mhz_i,rst_n_i,s_clk_1hz);......endmodule描述方法DescriptionMethod“

VerilogHDL语句对电路功能的描述有三种方式,分别是数据流描述、结构化描述、行为级描述。三种描述方式抽象级别不同,各有优缺点,相辅相成,需要配合使用。下面以二选一数据选择器模块的实现来分别介绍三种不同的描述方法。3.850二选一数据选择器——真值表、逻辑表达式、电路图51输入输出SY0D01D1

数据流描述

数据流描述使用连续赋值语句(assign语句)对电路的逻辑功能进行描述,该描述方法用于组合逻辑电路的实现。组合逻辑电路的信号传输其实就类似于数据的流动,数据从中经过但是不会存储,一旦输入改变,输出随之改变。52modulemux2to1_dataflow(

inputwireD0,D1,//输入数据定义

inputwireS,//输入选择信号定义

outputwireY//输出信号定义);

//门电路逻辑表达式

assignY=((~S)&D0)|(S&D1);endmodule结构化描述——门级描述

结构化描述是在描述中按照层级电路的结构形式使用已有的或者已经写好的功能模块对电路进行描述。其中,使用门级原语描述的方式为门级描述,使用自定义功能模块描述的方式为结构级描述。53modulemux2to1_gatelevel(

inputD0,D1,S,//输入数据定义

outputY//输出信号定义);

wires_not,and1,and2;//定义内部信号notU1(s_not,S);//调用非门元件

andU2(and1,s_not,D0);//调用与门元件

andU3(and2,S,D1);

orU4(Y,and1,and2);//调用或门元件endmodule结构化描述——结构级描述54modulemux2to1_gatelevel(

inputD0,D1,S,//输入数据定义

outputY//输出信号定义);

wires_not,s_and1,s_and2;//定义内部信号

notA

U1(S,s_not);//调用非门元件

AandBU2(s_not,D0,s_and1);//调用与门元件

AandB

U3(S,D1,s_and2);

AorB

U4(s_and1,s_and2,Y);//调用或门元件endmodule//自定义非门模块module

notA(

input

wireA,

outputwireY);

assignY=~A;endmodule//自定义与门模块module

AandB(inputwireA,B,

outputwireY);

assignY=A&B;endmodule//自定义或门模块module

AorB(

inputwireA,B,

outputwireY);assignY=A|B;endmodule行为级描述

行为级(Behavioral)描述是最抽象的一种描述方法,也称寄存器传输级描述,使用always语句或initial语句对电路进行描述。55modulemux2to1_behave(

inputwire

D0,D1,S,//输入端口声明

outputregY//输出端口声明);

always@(S,D0,D1)

begin

if(S==1)Y=D1;

elseY=D0;

endendmodule抽象级别56结构化描述:抽象级别最低、最接近于实际硬件结构,可以通过Verilog的形式来描述电路都需要哪些元器件以及器件之间的连接关系数据流描述:比结构化描述抽象级别高、可以比较直观的表达底层逻辑的行为行为级描述:抽象级别最高、概括能力最强,规模稍大的设计往往都以行为级描述为主可综合与不可综合Comprehensiveandnocomprehensive“3.957综合的概念综合是根据Verilog描述的RTL级的电路模型构造出门级网表的过程。综合只是个中间步骤,综合后生成的网表文件,就是由导线相互连接的寄存器传输级功能块(像是触发器、算术逻辑单元和多路选择器等)组成的电路逻辑网络,将其烧录进FPGA后,可以找到与之对应的硬件元件。综合器就是能自动实现上述转换的软件工具,能将原理图或者HDL语言描述的电路功能转化为具体电路网表的工具。58什么是不可综合?

Verilog有不同的抽象层次,可以从门级、RTL级、行为级以及算法级进行建模。但并不是所有层次上的描述方式都可以被综合成想要的硬件元件,即有些语法是不可综合的。比如Verilog中存在一些用于仿真验证的子集,属于仿真验证语言,因为没有相应的硬件元件与其对应,故只能在仿真时候使用,不能被综合成电路。如延时语句#,initial语句等。59可综合语句60Verilog语句可综合性说明module语句√数据类型wire,reg,integer√parameter语句√端口声明input,output,inout√运算符大部分可综合

全等运算符(===,!==)不可综合

对于除法“/”

的运算,只有除数为2的指数时才可综合基本门元件√赋值语句(assign,=,<=)√条件语句(if-else,case)√循环语句

(for,while)只有当循环的次数在编译之前就已确定时可综合,动态改变循环次数的语句不可综合always语句√function语句√编译向导`define,`include等√不可综合语句61Verilog语句可综合性说明延时控制#xx×初始化语句initial×数据类型real×循环语句repeat,forever×字符串常量×全等运算符===,!==×与X,Z的比较把数据和X(或Z)进行比较是不可综合的敏感列表里一个信号同时带有posedge和negedge例always@(posedgeclkornegedgeclk)

这种always块是不可综合的建立可综合模型的原则62不使用initial语句、延时语句#以及循环次数不确定的循环语句尽量使用同步方式设计电路。除非关键

温馨提示

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

评论

0/150

提交评论