第五讲-VHDL数据对象及属性课件_第1页
第五讲-VHDL数据对象及属性课件_第2页
第五讲-VHDL数据对象及属性课件_第3页
第五讲-VHDL数据对象及属性课件_第4页
第五讲-VHDL数据对象及属性课件_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

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

文档简介

1VHDL处理静态数据的两种对象:const和generic。VHDL处理非静态数据的两种对象:信号和变量。常量和信号是全局的,既可以用于顺序代码,也可用于并发代码;变量只能在顺序代码中使用,相对于信号而言,变量只能是局部的,所以变量值不能传递到process、function和procedure外部。但是,在有些情况下,选择信号还是变量却是比较难以抉择的。

信号(Signal)和变量(Variable)。1VHDL处理静态数据的两种对象:const和generic12常量用于确定默认值,语法结构:CONST常量名:type:=值;例子:CONSTset_bit:BIT:=‘1’;CONSTdatamemory:memory:=((‘0’,’0’,’1’,’1’),‘0’,’0’,’1’,’1’));常量可以在包集、实体或结构体中声明:包集中:全局;实体中:对该实体内的所有结构体而言是全局的;结构体中:结构体内是全局的。2常量用于确定默认值,语法结构:CONST常量名:typ23信号VHDL中‘信号’代表电路单元、功能模块间的硬件连线,也可表示电路单元的IN/OUT端口;实体的所有端口都默认为信号,语法结构:Signal

信号名:type[range][:=初始值];注意:当信号用于顺序描述语句如process中时,其值不是立刻更新的;只有当其所在的process、函数或过程完成之后才进行更新。3信号VHDL中‘信号’代表电路单元、功能模块间的硬件连线34信号的赋值符号:<=注意1:对信号赋初值的操作是不可综合的,通常只用于仿真。例如:signalcontrol:BIT:=‘0’;注意2:不要对同一个信号进行多重赋值。(buffer模式的端口信号除外!)例如:

process(...).....foriIN0TO10LOOP

control<=control+1;--error!或最后一次有效!

......4信号的赋值符号:<=45例1“1”计数器功能描述:计算一个二进制矢量中‘1’的个数din[7:0]one[2:0]5例1“1”计数器功能描述:计算一个二进制矢量中‘1’的个56实现代码:---错误使用信号的例子

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.all;ENTITYcount_onesiSPORT(din:INstd_logic_vector(0to7);ones:OUTintegerrange0to8);ENDcount_ones;ARCHITECTUREnot_okOFcount_onesIS

signaltemp:integerrange0to8;BEGINprocess(din)BEGIN

temp<=0;FORiIN0TO7LOOPIF(din(i)=‘1’)thentemp<=temp+1;ENDif;ENDLOOP;

ones<=temp;ENDprocess;ENDnot_ok;进程结束后才更新6实现代码:---错误使用信号的例子进程结束后才更新67两种代码更正方法:1、使用变量来记录中间值,可以将signaltemp...改为variabletemp...;同时修改相应的赋值语句;2、取消temp,同时将端口信号ones重新定义为:

ones:BUFFERintegerrange0to8;使得ones可以被内部调用。在进程结束后,ones值将被更新。(编码风格不好,不提倡此种方式!)7两种代码更正方法:78变量(variable)变量代表电路单元内部的操作,代表暂存的临时数据。与信号和常量相比,变量仅用于局部的电路描述,只能用于进程、函数和过程内部。注意:对变量的赋值是立即生效的,无需等待进程结束。新的值可以在下一行代码中立即使用。变量的赋值符号“:=”,语法结构:variable

变量名:type[range][:=初始值];注意:对变量赋初值的操作也是不可综合的,通常只用于仿真。8变量(variable)变量代表电路单元内部的操作,代表89例:“1”计数器的实现代码:

LIBRARYieee;USEieee.std_logic_1164.all;entitycount_onesisport(din:INstd_logic_vector(0to7);ones:OUTintegerrange0to8);endcount_ones;architectureokofcount_onesisbeginprocess(din)

variabletemp:integerrange0to8;begin

temp:=0;FORiIN0TO7LOOPIF(din(i)=‘1’)thentemp:=temp+1;ENDif;ENDLOOP;

ones<=temp;endprocess;endok;变量的赋值是立即生效9例:“1”计数器的实现代码:变量的赋值是立即生效9OK!!NotOK?OK!!NotOK?1011信号和变量的比较赋值方式的不同:

变量:=表达式;

信号

<=表达式;硬件实现的功能不同:

信号代表电路单元、功能模块间的互联,代表实际的硬件连线;

变量代表电路单元内部的操作,代表暂存的临时数据。

11信号和变量的比较赋值方式的不同:1112有效范围的不同:

信号:程序包、实体、结构体;全局量。

变量:进程、子程序;局部量。

ARCHITECTURE{SIGNALDeclarations}label1:PROCESS{VARIABLEDeclarations}label2:PROCESS{VARIABLEDeclarations}┇12有效范围的不同:{SIGNALDeclarations1213赋值行为的不同:

信号赋值延迟更新数值、时序电路;

变量赋值立即更新数值、组合电路。信号的多次赋值

a.一个进程:最后一次赋值有效b.多个进程:多源驱动,线与、线或、三态

13赋值行为的不同:1314例:信号的多次赋值

architecturertlofexissignala:std_logic;begin

process(…)begina<=b;…a<=c;endprocess;endrtl;architecturertlofexissignala:std_logic;begin

process(…)begina<=b;…endprocess;

process(…)begina<=c;...endprocess;endex;14例:信号的多次赋值architectu1415例:信号赋值与变量赋值的比较

信号赋值:

architecturertlofsigissignala,b:std_logic;--定义信号beginprocess(a,b)begina<=b;b<=a;endprocess;endrtl;--结果是a和b的值互换15例:信号赋值与变量赋值的比较1516

变量赋值

architecturertlofvarisbeginprocessvariablea,b:std_logic;--定义变量begina:=b;b:=a;endprocess;

endrtl;

--结果是a和b的值都等于b的初值

16变量赋值1617例:变量赋值实现循环语句功能

process(indicator,sig)variabletemp:std_logic;begintemp:=‘0’;foriin0to3looptemp:=tempxor(sig(i)andindicator(i));endloop;output<=temp;endprocess;17例:变量赋值实现循环语句功能1718以上语句等效为:process(indicator,sig)variabletemp:std_logic;begintemp:=‘0’;temp:=tempxor(sig(0)andindicator(0));temp:=tempxor(sig(1)andindicator(1));temp:=tempxor(sig(2)andindicator(2));temp:=tempxor(sig(3)andindicator(3));output<=temp;endprocess;18以上语句等效为:1819如改为信号,则无法实现原功能:

……signaltemp:std_logic;

……process(indicator,sig,temp)begintemp<=‘0’;temp<=tempxor(sig(0)andindicator(0));temp<=tempxor(sig(1)andindicator(1));temp<=tempxor(sig(2)andindicator(2));temp<=tempxor(sig(3)andindicator(3));output<=temp;endprocess;19如改为信号,则无法实现原功能:1920例3:多路复用器的对比设计方案一:使用信号(notOK)

LIBRARYieee;USEieee.std_logic_1164.all;entitymuxisport(a,b,c,d,s0,s1:INstd_logic;y:OUTstd_logic);endmux;architecturenot_okofmuxis

signalsel:integerrange0to3;begin

值不能立即更新,不能在process的其它代码中继续使用不能进行同一信号的多次赋值,要么出错,要么“线与”,要么只考虑最后一次赋值,取决于编译器process(a,b,c,d,s0,s1)begin

sel<=0;if(s0=‘1’)thensel<=sel+1;endif;if(s1=‘1’)thensel<=sel+2;endif;caseseliswhen0=>y<=a;when1=>y<=b;when2=>y<=c;when3=>y<=d;endcase;endprocess;endnot_ok;20例3:多路复用器的对比设计值不能立即更新,不能在proc2021例3:案二:使用变量(OK)

LIBRARYieee;USEieee.std_logic_1164.all;entitymuxisport(a,b,c,d,s0,s1:INstd_logic;y:OUTstd_logic);endmux;architectureokofmuxisbeginprocess(a,b,c,d,s0,s1)variablesel:integerrange0to3;

值可以立即更新,能够在process的其它代码中继续使用

begin

sel:=0;if(s0=‘1’)thensel:=sel+1;endif;if(s1=‘1’)thensel:=sel+2;endif;caseseliswhen0=>y<=a;when1=>y<=b;when2=>y<=c;when3=>y<=d;endcase;endprocess;

endok;21例3:案二:使用变量(OK)值可以立即更新,能够在pro2122例5.1.4带q和qbar的DFF

DFFqdclkqbar功能描述:D触发器

qbar为q的反相输出端。22例5.1.4带q和qbar的DFFDFFqdclk2223方案1:not_ok---------------------------------------------------libraryieee;useieee.std_logic_1164.all;--------------------------------------------------entitydffisport(d,clk:INstd_logic;q:BUFFERstd_logic;qbar:OUTstd_logic);enddff;-----------------------------------------------architecturenot_okofdffisbeginprocess(clk)begin

if(clk’eventANDclk=‘1’)then

q<=d;qbar<=NOTq;endif;endprocess;endnot_ok;-------------------------------------方案2:ok------------------------------------------------------libraryieee;useieee.std_logic_1164.all;--------------------------------------------------entitydffisport(d,clk:INstd_logic;q:BUFFERstd_logic;qbar:OUTstd_logic);enddff;-----------------------------------------------architectureokofdffisbeginprocess(clk)beginif(clk’eventANDclk=‘1’)then

q<=d;endif;endprocess;

qbar<=NOTq;endmux2;-----------------------------------q值在process之后更新,引起qbar的同步更新q不能立即更新,导致qbar值将延后一个时钟周期buffer类型输出信号可供内部电路使用23方案1:not_ok方案2:okq值在process23NotokOKNotokOK2425分频器功能描述:对时钟进行6分频;设计要点:两个输出,一个基于信号,另一个基于变量。分频器fclkfclk/625分频器功能描述:对时钟进行6分频;分频器fclkfclk2526实现代码:

LIBRARYieee;USEieee.std_logic_1164.all;entityfreq_dividerisport(clk:INstd_logic;out1,out2:BUFFER

std_logic);endfreq_divider;architectureexampleoffreq_divideris

SIGNALcount1:integerrange0to7;beginprocess(clk)variablecount2:integerrange0to7;beginif(clk’eventANDclk=‘1’)thencount1<=count1+1;

count2:=count2+1;if(count1=___)then

out1<=NOTout1;

count1<=0;endif;if(count2=___)then

out2<=NOTout2;

count2:=0;endif;endif;endprocess;endexample;未赋初值,但范围固定buffer类型,可以实现电平翻转;另,将std_logic改为bit类型更好些!计数清零信号延迟更新,变量即时更新,填空区别?26实现代码:未赋初值,但范围固定bu26第五讲-VHDL数据对象及属性课件2728寄存器的数量--对电路面积的重要影响

不同的编译器(仿真工具、综合工具等)对不同风格的代码进行编译时产生的寄存器数量是不同的。本小节目的:了解可以使用什么方法来减少寄存器数量;了解代码是否可以实现预期的结果;28寄存器的数量--对电路面积的重要影响不同的编28寄存器生成的条件对信号来说:当一个信号的赋值是以另一个信号的边沿或跳变为条件时(即发生同步赋值时),该信号经编译后就会生成寄存器。同步赋值只能在进程、函数或过程等顺序代码中出现,一般在语句ifsignal’event....或waituntil之后。对变量来说:(1)若一个变量是在一个信号跳变时被赋值,并且该值最终又被赋给了另外的信号(数值传递作用),则将生成寄存器。(2)一个变量未进行赋值操作时已经被信号使用,也将产生寄存器(用以存储process上一次执行后c的值)。如果未被进程、函数或过程之外的代码调用,则不一定生成寄存器。寄存器生成的条件2930例:output1和output2都被寄存的情况

process(clk)beginif(clk’eventANDclk=‘1’)thenoutput1<=temp;--被存储或生成寄存器;

output2<=a;--被存储或生成寄存器;

endif;endprocess;原因:对信号来说:当一个信号的赋值是以另一个信号的边沿或跳变为条件时(即发生同步赋值时),该信号经编译后就会生成寄存器。同步赋值只能在进程、函数或过程等顺序代码中出现,一般在语句ifsignal’event....或waituntil之后。30例:output1和output2都被寄存的情况原因:对3031例:output1被寄存、output2未被寄存的情况

process(clk)beginif(clk’eventANDclk=‘1’)thenoutput1<=temp;--被存储或生成寄存器;

endif;output2<=a;--未以另一个信号的边沿跳变进行赋值,--故未被存储;

endif;endprocess;31例:output1被寄存、output2未被寄存的情况3132例:变量被寄存的情况

process(clk)variabletemp:BIT;beginif(clk’eventANDclk=‘1’)thentemp:=a;endif;x<=temp;--temp促使x被存储;

endprocess;原因:对变量来说:

若一个变量是在一个信号跳变时被赋值,并且该值最终又被赋给了另外的信号(数值传递作用),则将生成寄存器。32例:变量被寄存的情况原因:对变量来说:若一个变量是在一3233例6:带q和qbar的DFF

带q和qbar的

DFFqdclkqbar功能描述:D触发器

qbar为q的反相输出端。两种实现方案:方案一生成两个寄存器,方案二生成一个寄存器。33例6:带q和qbar的DFF带q和qbar的DF3334方案1:two-dff---------------------------------------------------libraryieee;useieee.std_logic_1164.all;--------------------------------------------------entitydffisport(d,clk:INstd_logic;q:BUFFERstd_logic;qbar:OUTstd_logic);enddff;-----------------------------------------------architecturetwo_dffofdffisbeginprocess(clk)begin

if(clk’eventANDclk=‘1’)then

q<=d;qbar<=NOTq;endif;endprocess;endtwo_dff;-------------------------------------生成两个寄存器

DFFqdclk

DFFqbar34方案1:two-dff生成两个寄存器DFFqdcl3435方案2:one-dff------------------------------------------------------libraryieee;useieee.std_logic_1164.all;--------------------------------------------------entitydffisport(d,clk:INstd_logic;q:BUFFERstd_logic;qbar:OUTstd_logic);enddff;-----------------------------------------------architectureone_dffofdffisbeginprocess(clk)beginif(clk’eventANDclk=‘1’)then

q<=d;endif;endprocess;

qbar<=NOTq;endone_dff;-----------------------------------

DFFqdclkqbar生成一个寄存器使用组合逻辑,而不是寄存器35方案2:one-dffDFFqdclkqbar生成3536小结

如果不对代码进行有效合理的组织,则会生成额外的寄存器。

另外,在一些FPGA/CPLD器件中,对同一个代码,综合工具与布局布线工具的报告文件显示寄存器的数目可能是不一致的。36小结

如果不对代码进行有效合理的组织,则会生成额3637例7模8计数器

计数器clkcount(2:0)rst功能描述:

模8计数器。两种实现方案:方案一使用变量进行同步赋值,方案二使用信号进行同步赋值。37例7模8计数器计数器clkcount(2:0)rs3738方案1:变量方式------------------------------------------------entitycounterisport(clk,rst:INBIT;count:OUTintegerrange0to7);endcounter;-----------------------------------------------architecturecounterofcounterisbeginprocess(clk,rst)

variabletemp:integerrange0to7;begin

if(rst=‘1’)thentemp:=0;

elsif(clk’eventANDclk=‘1’)thentemp:=temp+1;

endif;

count<=temp;endprocess;endcounter;方案2:信号方式--------------------------------------------------entitycounterisport(rst,clk:INBIT;count:BUFFERintegerrange0to7);endcounter;-----------------------------------------------architecturecounterofcounterisbeginprocess(clk,rst)beginif(rst=‘1’)thencount<=0;elsif(clk’eventANDclk=‘1’)then

count<=count+1;endif;endprocess;endcounter;

buffer类型端口不必声明包集都需要使用寄存器来保存3位的当前计数值,综合时均会生成3个寄存器。38方案1:变量方式方案2:信号方式buffer类型端口3839例8移位寄存器

DFFdoutdinclk

DFF

DFF

DFF三个设计方案:三个变量顺序排列三个信号顺序排列三个变量颠倒顺序排列39例8移位寄存器DFFdoutdinclkDFF3940方案1:三个变量顺序排列------------------------------------------------entityshiftisport(clk,din:INBIT;dout:OUTBIT);endshift;-----------------------------------------------architectureshiftofshiftisbeginprocess(clk)

variablea,b,c:BIT;begin

if(clk’eventANDclk=‘1’)then

dout<=c;c:=b;b:=a;a:=din;endif;endprocess;endshift;方案2:三个信号顺序排列--------------------------------------------------entityshiftisport(din,clk:INBIT;dout:OUTBIT);endshift;-----------------------------------------------architectureshiftofshiftissignala,b,c:BIT;beginprocess(clk)beginif(clk’eventANDclk=‘1’)then

a<=din;b<=a;c<=b;dout<=c;endif;endprocess;endshift;

生成4个寄存器不必声明包集生成1个寄存器c、b、a的值被赋给dout、c、b之前没有被赋过值,综合时会生成3个寄存器,用以存储process上一次执行后c、b、a的值。方案一、二的波形相同,dout较din延后4个时钟周期40方案1:三个变量顺序排列方案2:三个信号顺序排列生成4041方案3:三个变量颠倒顺序排列entityshiftisport(clk,din:INBIT;dout:OUTBIT);endshift;---------------------------------------architectureshiftofshiftisbeginprocess(clk)

variablea,b,c:BIT;beginif(clk’eventANDclk=‘1’)then

a:=din;b:=a;c:=b;

dout<=c;

endif;endprocess;endshift;方案1:三个变量顺序排列------------------------------------------------entityshiftisport(clk,din:INBIT;dout:OUTBIT);endshift;-----------------------------------------------architectureshiftofshiftisbeginprocess(clk)

variablea,b,c:BIT;begin

if(clk’eventANDclk=‘1’)then

dout<=c;c:=b;b:=a;a:=din;

endif;endprocess;endshift;赋值顺序与方案一相反,因对变量的赋值是立即生效的,三行代码可以简化为c:=din。整个四行代码可以简化为dout<=din;方案三中dout较din延后1个时钟周期,未能实现设计初衷41方案3:三个变量颠倒顺序排列方案1:三个变量顺序排列4142例9移位寄存器#2—增加了一个复位端两种设计方案:用信号生成寄存器用变量生成寄存器

DFFdclk

DFF

DFF

DFFrstinternal(3)internal(2)internal(1)internal(0)42例9移位寄存器#2—增加了一个复位端两种设计方案:42方案1:内部信号方式libraryieee;useieee.std_logic_1164.all;entityshiftregisport(d,clk,rst:INstd_logic;q:OUTstd_logic);endshiftreg;architecturebehaviorofshiftregis

signalinternal:std_logic_vector(3downto0);beginprocess(clk,rst)begin

if(rst=‘1’)theninternal<=(ohters=>’0’);elsif(clk’eventANDclk=‘1’)then

internal<=d&internal(3donwto1);

endif;endprocess;

q<=internal(0);endbehavior;生成4个寄存器,输出比输入延后四个时钟周期方案2:内部变量方式

libraryieee;useieee.std_logic_1164.all;entityshiftregisport(d,clk,rst:INstd_logic;q:OUTstd_logic);endshiftreg;architecturebehaviorofshiftregis

variableinternal:std_logic_vector(3downto0);beginprocess(clk,rst)begin

if(rst=‘1’)theninternal:=(ohters=>’0’);elsif(clk’eventANDclk=‘1’)then

internal:=d&internal(3donwto1);

endif;endprocess;

q<=internal(0);endbehavior;方案1:内部信号方式生成4个寄存器,输出比输入延后四个时钟4344属性(ATTRIBUTE)属性是指从指定的客体或对象(如entity/type/architecture等)中获取关心的数据或信息。利用属性可以使VHDL源代码更加简明扼要,易于理解;语法:对象’属性预定义的属性:数值类属性和信号类属性44属性(ATTRIBUTE)属性是指从指定的客体或对象(4445数值类属性:获取数组、块或一般数据的相关信息。VHDL预先定义的、可综合的数值类属性:

left:索引的左边界值

right:索引的右边界值

high:索引的上限值

low:索引的上限值

length:索引的长度值range:索引的位宽范围

reverse_range:索引的反向位宽范围45数值类属性:获取数组、块或一般数据4546例:

variablemy_vector:bit_vector(5downto-5);各属性如下:

my_vector’left5my_vector’right-5my_vector’high5my_vector’low-5my_vector’length11my_vector’range(5downto-5)my_vector’reverse_range(-5to5)46例:4647枚举类型数值的属性:通常是不可综合的VAL(pos):指定位置(pos)的值POS(value):给定数值的位置序号LEFTOF(value):给定数值的左侧值VAL(row,column):位于行、列位置的值

47枚举类型数值的属性:通常是不可综合的4748

信号类属性VHDL预定义的,对于信号s:

EVENT:

如果s值发生了变化,则返回值为true,否则为false,常用于时钟信号的判定。

STABLE如果s值保持不变,则返回值为true,否则为false;

ACTIVE如果s值为‘1’,则返回值为true,否则为false;

QUIET<time>如果在指定的time内s值保持不变,则返回值为true,否则为false;48信号类属性48LAST_EVENT

返回从上一次事件发生的时间到当前时间的时间差;LAST_ACTIVE

最后一次s=‘1’到当前所经历的时间长度值;LAST_VALUE

最后一次变化前s的值;除EVENT和STABLE属性是可以综合的之外,其它的属性都不可综合,仅用于仿真。例:对信号clk是否出现上升沿进行判断

IF(clk’EVENTandclk=‘1’)..IF(NOTclk’STABLEandclk=‘1’)..LAST_EVENT例:对信号clk是否出现上升沿进行判4950用户自定义的属性用户自定义属性的声明,语法如:ATTRIBUTEattribute_name:attribute_type;attribute_type可以是任何数据类型,包括预定义的数据类型。用户自定义属性的描述,语法如:ATTRIBUTEattribute_nameOFtarget_name:classISvalue;

class可以是数据类型、信号、变量、函数、实体或构造体等。

50用户自定义的属性用户自定义属性的声明,语法如:5051例:

attributenumber_of_in:integer;--属性声明;

attributenumber_of_inofnand3:signalis3;--属性描述;inputs<=nand3’number_of_in;--属性调用,返回值为3;例:枚举类型编码:通常采用顺序编码的方式

TYPEcolorIS(red,green,blue,white);

默认的编码是:

red=“00”;green=“01”;blue=“10”;white=“11”;可对编码次序进行修改:

attributeenum_codingofcolor:typeis“11001001”;(值可选,如typeis“1000000101000010”)51例:5152设计实例:

例1:通用译码器功能描述:m-n译码器,m=log2n52设计实例:5253端口描述两个输入端口:ena和sel(m-1:0)一个输出端口:x(n-1:0)功能特征分析根据真值表,确定ena/sel与x的关系:当ena为‘0’时,x为“1111_1111”;当ena为‘1’时,8位的二进制数“1111_1111”的某位变为‘0’,其它位保持‘1’。该位的确定取决于sel的值;确定端口规格:本例中m为3,n为8;设计要点如何根据sel的值确定需由‘1’变‘0’的位置?分析真值表发现:将sel由二进制数转换成十进制数temp2,则需由‘1’变为‘0’的位的位置为temp2。如何将二进制数转换为十进制数?循环累加!53端口描述5354具体实现:1------------------------------------------------------2libraryieee;3useieee.std_logic_1164.all;4--------------------------------------------------5entitydecoderis6port(ena:INstd_logic;7sel:INstd_logic_vector(2downto0);8x:OUTstd_logic_vector(7downto0));9enddecoder;10-----------------------------------------------54具体实现:545511architecturegeneric_decoderofdecoderis12begin13process(ena,sel)14variabletemp1:std_logic_vector(x’highdownto0);15variabletemp2:integerrange0tox’high;16begin17temp1:=(others=>’1’);18temp2:=0;19if(ena=‘1’)then20FOR

iINsel’range

loop21if(sel(i)=‘1’)then22temp2:=2*temp2+1;23else24temp2:=2*temp2;25endif;26ENDloop;27temp1(temp2):=‘0’;28endif;29x<=temp1;30endprocess;31endgeneric_decoder;32-------------------------------------------指2

温馨提示

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

评论

0/150

提交评论