第三章 硬件描述语言VHDL基础_第1页
第三章 硬件描述语言VHDL基础_第2页
第三章 硬件描述语言VHDL基础_第3页
第三章 硬件描述语言VHDL基础_第4页
第三章 硬件描述语言VHDL基础_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

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

文档简介

1、1,第三章 硬件描述语言VHDL基础,3.1 VHDL语言程序的基本结构 3.2 VHDL语言的数据类型及运算操作符 3.3 VHDL语言的主要描述语句 3.4 VHDL语言构造体的描述方式,2,3.1 VHDL语言程序的基本结构 实体(Entity),构造体(Architecture),配置(Configuration),包集合(Package),和库(Library),VHDL 大小写不敏感,3,3.1.1 VHDL语言设计的基本设计单元 实体(Entity) 描述此设计功能输入输出端口(Port);在层次化设计时,Port为模块之间的接口;在芯片级,则代表具体芯片的管脚。 实体说明 EN

2、TITY 实体名 IS PORT(端口名(,端口名):方向 数据类型名; : 端口名(,端口名):方向 数据类型名); END 实体名;,Entity eqcomp4 is port(a, b: in std_logic_vector(3 downto 0); equal:out std_logic ); end eqcomp4;,4,基本数据类型: BIT和BIT_VECTOR STD_LOGIC和STD_LOGIC_VECTOR 端口模式,5,Out与Buffer的区别,Entity test1 is port(a : in std_logic; b,c: out std_logic );

3、 end test1; architecture a of test1 is begin b = not(a); c = b;-Error end a;,Entity test2 is port(a: in std_logic; b : buffer std_logic; c: out std_logic ); end test2; architecture a of test2 is begin b = not(a); c = b; end a;,结论:均表示输出,但BUFFER声明的信号可以反馈到实体内部,而OUT声明的信号却不可以。,6,构造体 描述设计单元具有的具体功能 结构体有三种描

4、述方式 行为描述(behavioral) 数据流描述(dataflow) 结构化描述(structural) 格式: ARCHITECTURE 构造体名 OF 实体名 IS 定义语句 内部信号,常数,数据类型,函数等的定义 BEGIN 并行处理语句 END 构造体名;,7,构造体中的描述语句 并行语句 : 同时执行 ,在进程语句(PROCESS)的外部。 顺序语句 :按书写顺序执行,在进程语句(PROCESS)的内部 。,例如: entity sample is port (a,b:in std_logic; c:out std_logic); end sample; architecture

5、 beha of sample is signal d: std_logic; begin d=a and b; C=not(d); end beha;,8,3.1.2 构造体的子结构描述 3种形式的子结构描述: BLOCK描述(块描述) PROCESS描述(进程描述) SUBPROGRAMS描述(子程序描述) BLOCK语句描述 格式: 块标号:BLOCK BEGIN : END BLOCK 块标号; BLOCK内的语句执行顺序:并行执行,9,例如: 二选一电路 ENTITY mux IS PORT (d0,d1,sel: IN BIT; q: OUT BIT); END mux; ARCH

6、ITECTURE connect OF mux IS SIGNAL tmp1,tmp2,tmp3: BIT; BEGIN cale:BLOCK BEGIN tmp1=d1 AND sel; tmp2=d0 AND (NOT sel); tmp3=tmp1 OR tmp2; q=tmp3; END BLOCK cale; END connect;,10,进程(PROCESS)描述 格式: 进程名:PROCESS(信号1,信号2,) BEGIN : END PROCESS 进程名; 敏感量: 是PROCESS的输入信号,写在“PROCESS”后面的括号中 当PROCESS所带的敏感量任何一个发生变

7、化时,PROCESS中的语句就会执行一遍。 语句执行顺序:顺序执行。 多进程的关系:并行执行。,11,例如:二选一电路 ENTITY mux1 IS PORT (d0,d1,sel: IN BIT; q : OUT BIT); END mux1; ARCHITECTURE connect OF mux1 IS BEGIN cale: PROCESS(d0,d1,sel) VARIABLE tmp1,tmp2,tmp3 : BIT;-在进程中定义的变量 BEGIN tmp1:=d0 AND sel; -输入端口向变量赋值 tmp2:=d1 AND (NOT sel); tmp3:=tmp1 OR

8、 tmp2; q=tmp3; END PROCESS cale; END connect;,12,子程序描述 过程 格式 PROCEDURE 过程名(参数1,参数2) IS 定义变量语句 BEGIN 顺序处理语句 END 过程名; 参数:可以是输入也可以是输出 语句执行方式: 调用者在调用过程前先将初始值传递给过程的输入参数,然后过程语句启动,按顺序自上至下执行过程结构中的语句,执行结束后,将输出值拷贝到调用者的“OUT”和“INOUT”所定义的变量或信号中。,13,例如:求最大值电路 library ieee; use ieee.std_logic_1164.all; entity conp

9、ro is port(da,db: in std_logic_vector(7 downto 0); o1: out std_logic_vector(7 downto 0); end conpro;,14,architecture beha of conpro is,procedure max(a:in std_logic_vector; b:in std_logic_vector; q:out std_logic_vector) is begin if (ab) then q:=a; else q:=b; end if; end max;,begin process(da,db) vari

10、able temp:std_logic_vector(7 downto 0); begin max(da,db,temp); o1=temp; end process; end beha;,15,函数 格式 FUNCTION 函数名(参数1,参数2.) RETURN 数据类型名 IS 定义变量语句 BEGIN 顺序处理语句 RETURN 返回变量名; END 函数名; 参数:输入参数的个数不受限制,在函数名后的括号内声明,而输出参数只有一个,在return语句后声明;输入输出参数的属性均可省略。 语句执行方式:顺序执行。,16,例如:求最大值电路 architecture beha of co

11、npack is,function max(a:std_logic_vector; b:std_logic_vector) return std_logic_vector is variable temp:std_logic_vector(7 downto 0); begin if (ab) then temp:=a; else temp:=b; end if; return temp; end max;,begin o1=max(da,db); end beha;,17,3.1.3 包集合、库和配置 库:存放编译后的数据集合 库的种类 IEEE库:std_logic STD库: standa

12、rd、textio WORK库: ASIC库: 用户自定义库: 例如: vhdl87文件夹下的altera、std、vital、ieee 库的使用 LIBRARY 库名; USE LIBRARY_name.package_name.ITEM_name;,18,例如:LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; 例如:LIBRARY STD; USE STD.TEXTIO.ALL; 库的作用范围 : 从一个实体说明开始到它所属的结构体、配置为止。 当一个源程序中出现两个以上实体的使用说明语句时,应在每个实体说明语句前重复书写。 例如:,19,Library

13、 ieee; Use ieee.std_logic_1164.all; Entity and1 is End and1; Architecture beha1 of and1 is Begin End beha1; Library ieee; Use ieee.std_logic_1164.all; Entity and1 is End and1; Architecture beha2 of and1 is Begin End beha2;,20,包集合:通过编译成为库结构中的一个层次 格式 PACKAGE 包集合名 IS 说明语句 END 包集合名; PACKAGE BODY 包名 IS 说

14、明语句 END 包集合名; 使用 USE LIBRARY_name.package_name.ITEM_name 例如:使用在包集合bpac中定义的max函数。,21,library ieee; use ieee.std_logic_1164.all;,package bpac is function max(a:std_logic_vector; b:std_logic_vector) return std_logic_vector; end bpac;,package body bpac is function max(a:std_logic_vector; b:std_logic_vec

15、tor) return std_logic_vector is variable temp:std_logic_vector(7 downto 0); begin if (ab) then temp:=a; else temp:=b; end if; return temp; end max; end bpac;,22,library ieee; use ieee.std_logic_1164.all; library work; use work.bpac.all; entity conpack is port(da,db: in std_logic_vector(7 downto 0);

16、o1: out std_logic_vector(7 downto 0); end conpack; architecture beha of conpack is begin o1=max(da,db); end beha;,现行作业库可以省略,23,配置 作用:描述层与层之间的连接关系以及实体与结构之间的连接关系,便于调试和设计。 格式: CONFIGURATION 配置名 OF 实体名 IS 说明语句 END配置名; 例如:用两个不同构造体的配置实现rs触发器。 ENTITY rs IS PORT(set,reset:IN BIT; q,qb: BUFFER BIT); END rs;,

17、24,ARCHITECTURE rsff1 OF rs IS COMPONENT nand2 PORT(a,b: IN BIT; c: OUT BIT); END COMPONENT; BEGIN U1:nand2 PORT MAP(a=set, b=qb, c=q) U2:nand2 PORT MAP(a=reset, b=q, c=qb) END rsff1; ARCHITECTURE rsff2 OF rs IS BEGIN q=NOT(qb AND set); qb=NOT(q AND reset); END rsff2; CONFIGRATION rscon OF rs IS -选择

18、构造体rsff1 FOR rsff1 END FOR; END rscon;,25,32 VHDL语言的数据类型及运算操作符 321 VHDL语言的客体(数据对象) 客体:在VHDL语言中,凡是可以赋予一个值的对象就称为客体。 分类 信号(signal):代表物理设计中的某一条硬件连接线。 变量(variable):代表暂存某些值的载体。 常数(constant):代表数字电路中的电源和地线。,26,常数 意义:对某一常数名赋予一个固定的值 ;综合后,连接到电源和地。 格式:CONSTANT 常数名:数据类型:=表达式; 例如: CONSTANT Vcc: REAL:=5.0; 变量 格式:

19、VARIABLE 变量名:数据类型 约束条件:=表达式 ; 例如:VARIABLE count: INTEGER RANGE 0 TO 255:=10; 特点:临时数据,没有物理意义;只能在进程、函数和过程中使用,一旦赋值立即生效;用:= 进行赋值。 信号 格式: SIGNAL 信号名:数据类型 约束条件:=表达式; 例如:SIGNAL ground: BIT:=0 ;,27,特点: 没有方向性,可给它赋值,也可当作输入。 例如: tmp3=tmp1 OR tmp2; q=tmp3; 设定的初始值在综合时没有用,只是在仿真时在开始设定一个起始值。在MaxPlusII中被忽略。 用 = 进行赋值

20、 信号与变量的区别 信号赋值可以有附加延迟,变量赋值不可以有附加延迟; 例如:s1=s2 AFTER 10ns 信号可以看作硬件的一根连线,而变量存放临时数据,没有物理意义。 作用范围不同:进程对信号敏感,对变量不敏感;信号可以是多个进程的全局信号,但变量只在定义它之后的顺序域可见。,28,architecture a of start is signal tmp : std_logic; begin s0:process(a_bus) begin tmp = 1; for i in 3 downto 0 loop tmp = a_bus(i) and tmp; end loop; carry

21、out = tmp; end process s0; s1: process(tmp) begin end process s1; end a;,architecture a of start is begin s0:process(a_bus) variable tmp:std_logic; begin tmp := 1; for i in 3 downto 0 loop tmp := a_bus(i) and tmp; end loop; carryout = tmp; end process s0; s1:process(tmp) -error begin end process s1;

22、 end a;,29,代入方式不同:信号的代入过程和代入语句的处理是分开进行的,而变量赋值语句一旦执行,其值立即被赋予变量。,process(a,b,c,d) begin d=a; x=b+d; d=c; y=b+d; end process; 运行结果:x=b+c; y=b+c;,process(a,b,c) variable d: std_logic_vector(3 downto 0); begin d:=a; x=b+d; d:=c; y=b+d; end process; 运行结果:x=b+a; y=b+c;,30,VHDL标识符(Identifiers) 基本标识符由字母、数字和下

23、划线组成 第一个字符必须是字母 最后一个字符不能是下划线 不允许连续2个下划线 保留字(关键字)不能用于标识符 大小写是等效的,31,322 数据类型 标准数据类型:实数、整数、位、位矢量、布尔量、字符、字符串、时间、正整数、错误等级。 整数、浮点数 方便用于数值方面的运算:加减乘除 整数: integer ,经常用于计数器 实数: real,MaxPLusII不支持 例如: Variable a : integer range 255 to +255; 位:表示位信号,位的值用带单引号的1或0来表示。 例如:signal a: bit:=0;或 a=0; 位矢量:表示多位组成的信号,位矢量的

24、值用双引号括起来。 例如:signal a: bit_vector(3 downto 0):=“0011”; 或 a=“0011”;,32,用户定义的数据类型 格式: TYPE 数据类型名 ,数据类型名 数据类型定义 不完整的数据类型格式: TYPE 数据类型名 ,数据类型名; -假定义 可由用户定义的数据类型包括:枚举(ENUMERATED)、整数(INTEGER)、实数(REAL)、数组(ARRAY)、时间(TIME)、记录(RECODE) 枚举(ENUMERATED): 格式:TYPE 数据类型名 IS(元素、元素、); 作用:列举数据对象可能存在的值 例如:用于定义状态机的状态 Typ

25、e states is (idle, start, running, pause, stop) Signal current_state : states;,33,例如:IEEE1076标准中预定义了两个枚举类型 Type boolean is (False, True); Type bit is (0, 1) ; Signal a : bit; 例如: IEEE1164标准中预定义了一个枚举类型 Type std_logic is(U, X,0, 1, Z, W, L, H, -); 该类型能比较全面地包括数字电路中信号会出现的几种状态,因此一般情况把这种类型代替bit U初始值;X不定;0

26、0;11;Z高阻; W弱信号不定;L 弱信号0;H 弱信号1;-不可能情况。 Signal a : std_logic; 注意:这里的大小写是敏感的,34,数组(ARRAY) 格式: TYPE 数据类型名 ISARRAY 范围 OF 原数据类型名; 多个相同类型成员组成的队列,一般用于定义数据总线、地址总线等。例如: Signal a: std_logic_vector(7 downto 0); a = B“00111010”; a = X “3A”; 可自定义复合类型 Type word is array (15 downto 0) of bit; Signal b : word; Type

27、 table8x4 is array (0 to 7, 0 to 3) of bit;,35,记录(RECODE) 格式: TYPE 数组类型名 IS RECORD 元素名:数据类型名; 元素名:数据类型名; : END RECORD; 相同或不同类型的元素组成,类似C中的结构 具有模型抽象能力,用于描述一个功能模块。 例如:Type iocell is record Enable :bit; DataBus :bit_vector(7 downto 0); end record; singal bus : iocell; bus.Enable = 1; bus.DataBus = “0011

28、0110”;,36,数据类型的转换: VHDL是强类型语言,必须用类型转换函数才能进行不同类型之间的转换。,37,例如:由STD_BIT_VECTOR转换成INTEGER LIBRARYIEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY add5 IS PORT(num: IN STD_LOGIC_VECTOR(2 DOWNTO 0); : ); END add5; ARCHITECTURE rtl OF add5 IS SIGNAL in_num: INTEGER RANGE 0 TO 5; :

29、 BEGIN In_num=CONV_INTEGER(num); END rtl;,38,属性(Attributes) 提供Entity、Architecture、Type和Signals的信息 有许多预定义的值、信号和范围的属性 一个最常用的属性:event if clkevent and clk=1 then left,right, high, low,length 例如: type count is integer range 0 to 127 countleft = 0; countright = 127; counthigh = 127; countlow = 0; countlen

30、gth = 128;,39,323 运算操作符 逻辑运算符 AND、OR、NAND、NOR、XOR、NOT 关系运算符 =、/=、= 算术运算符 +、-、*、/ 并置(连接)运算符 ,41,33 VHDL语言的主要描述语句 331 顺序描述语句 只能用在进程或子程序中,按照语句的出现的顺序加以执行的。 WAIT语句 WAIT 无限等待 WAIT ON 敏感信号变化 此时,与process等价,例如:,PROCESS(a,b) BEGIN y=a AND b; END PROCESS;,PROCESS BEGIN y=a AND b; WAIT ON a,b; END PROCESS;,42,W

31、AIT UNTIL 直到条件满足 WAIT FOR等到时间到 多条件WAIT 语句 超时等待,Architecture beha of wait_example signal sendB,sendA : std_logic; Begin sendA=0; a:process begin wait until sendB=1; sendA=1 after 10 ns; wait until sendB=0; sendA=0 after 10 ns; end process a; b:process begin wait until sendA=0; sendB=0 after 10 ns; wa

32、it until sendA=1; sendB=1 after 10 ns; end process a; end beha;,43,信号代入语句 格式: 目的信号量=信号量表达式 例如: a=b; 变量赋值语句 格式: 目的变量:=表达式 例如: c:=a+d; IF 语句 IF的门闩控制 格式: IF 条件 THEN 顺序执行语句 END IF; 例如: 锁存器 IF (en=1) THEN q=d; END IF;,44,IF 语句的二选择控制 格式: IF 条件 THEN 顺序执行语句 ELSE 顺序执行语句 END IF; IF 语句的多选择控制 格式: IF 条件 THEN 顺序执

33、行语句 ELSIF 条件 THEN 顺序执行语句 : ELSIF 条件 THEN 顺序执行语句 END IF;,Entity mux2 is port( a,b,sel: in bit; c: out bit); End mux2; Architecture rtl of mux2 is Begin process(a,b,sel) begin if (sel=1) then c=a; else c=b; end if; end process End rtl;,45,例如:用于作地址译码 If addr = X “0000” and addr = X “4000” and addr = X

34、“4008” and addr = X “8000” and addr = X “C000” then EEPRom = 1; end if;,46,CASE 语句 实现从许多不同语句的序列中选择其中之一执行 格式 CASE 表达式 IS WHEN 条件表达式=顺序处理语句; ENDCASE; WHEN的条件表达式可以有4种形式 WHEN 值 =顺序处理语句; WHEN 值|值|值|值=顺序处理语句; WHEN 值TO 值=顺序处理语句; WHEN OTHERS=顺序处理语句;,47,例如:83编码器 library ieee; use ieee.std_logic_1164.all; ent

35、ity encoder is port(input: in std_logic_vector(7 downto 0); y: out std_logic_vector(2 downto 0); end encoder;,architecture beha of encoder is begin process(input) begin case input is when 01111111= y y y y y y y y y=XXX; end case; end process; End beha;,If语句和case语句的区别,48,LOOP语句 格式: 标号: FOR 循环变量 IN离散

36、范围LOOP 顺序处理语句 END LOOP 标号; 标号: WHILE 条件 LOOP 顺序处理语句 END LOOP 标号; 例如: sum:=0 abcd: WHILE (I10) LOOP sum:=I+sum; I:=I+1; END LOOP abcd;,49,library ieee; use ieee.std_logic_1164.all; entity check is port(a: in std_logic_vector(7 downto 0); y: out std_logic); end check; architecture beha of check is beg

37、in process(a) variable temp: std_logic; begin temp:=0; for i in 0 to 7 loop temp:=temp xor a(i); end loop; y=temp; end process; end beha;,奇偶校验基本原理: 奇数个“1”异或的结果为1, 偶数个“1”异或的结果为0。 例如:若采用奇校验, 1101=11010 0011=00111,50,NEXT语句 跳出本次循环 格式:NEXT 标号WHEN 条件; 与EXIT语句的区别 例如: PROCESS (a,b) CONSTANT max_limit: INTE

38、GER:=255 BEGIN FOR I IN 0 TO max_limit LOOP IF (done(I)=TRUE) THEN NEXT; ELSE done(I):=TRUE; END IF; q(I)=a(I) AND b(I); END LOOP; END PROCESS;,51,332 并发描述语句 可以直接在构造体中使用 进程语句 可以和其它进程语句同时执行,并可以存取构造体和实体中所定义的信号。 进程结构中的所有语句都按照顺序执行。 为启动进程,在进程中必须包含一个敏感信号表或WAIT语句。 进程之间的通信是通过信号量来实现的。 例如:,entity pros_com is

39、port(event_a: in bit); end pros_com; architecture catch_ball of pros_com is signal to_a,to_b: bit:=0;,52,begin a:process(enent_a,to_a) begin if (event_aevent and event_a=1) or (to_aevent and to_a=1) then to_b=1 after 20 ns, 0 after 30 ns; end if; end process a; b:process(to_b) begin if (to_bevent an

40、d to_b=1) then to_a=1 after 20 ns, 0 after 30 ns; end if; end process b; end catch_ball;,53,并发信号代入 代入语句在进程中使用是顺序语句,但是在构造体的进程之外使用就是并发语句,相当于一个进程。 例如:以下两种结构等价 ARCHITECTURE behave OF a_var IS BEGIN Output=a(I); END behave; ARCHITECTURE behave OF a_var IS BEGIN ss:PROCESS(a,I) BEGIN Output=a(I); END PROC

41、ESS ss; END behave;,54,条件信号代入 将符合条件的表达式代入信号量 格式 目的信号量=表达式1 WHEN 条件1 ELSE 表达式2 WHEN 条件2 ELSE 表达式3 WHEN 条件3 : ELSE 表达式n; 例如:四选一电路 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux44 IS PORT(i0,i1,i2,i3,a,b : IN STD_LOGIC; q : OUT STD_LOGIC); END mux44;,55,ARCHITECTURE aa OF mux44 IS SIGNAL sel: ST

42、D_LOGIC_VECTOR(1 DOWNTO 0); BEGIN sel=b ,56,选择信号代入 对表达式进行测试,当表达式取值不同时,将使不同的值代入目的信号量 格式 WITH 表达式 SELECT 目的信号量=表达式1 WHEN 条件1 表达式2 WHEN 条件2 : 表达式n WHEN 条件n; 例如:四选一电路,57,ARCHITECTURE bb OF mux45 IS SIGNAL sel: INTEGER range 0 to 3; BEGIN WITH sel SELECT q=i0 WHEN 0, i1 WHEN 1, i2 WHEN 2, i3 WHEN 3; sel=

43、0 WHEN a=0 AND b=0 ELSE 1 WHEN a=1 AND b=0 ELSE 2 WHEN a=0 AND b=1 ELSE 3 WHEN a=1 AND b=1 ; END bb;,a,b,i0,q,i1,i2,i3,选择信号代入,条件信号代入,58,并发过程调用语句 并发过程调用语句可以出现在构造体中,而且是一种可以在进程之外执行的过程调用语句。 并发过程调用是一个完整的语句,在它之前可以加标号; 并发过程调用语句应带有IN,OUT或INOUT的参数,它们应该列在过程名后的括号内; 并发过程调用可以有多个返回值。,59,ARCHITECTURE. BEGIN vector

44、_to_int(z,x_flag,q); END; ARCHITECTURE. BEGIN PROCESS(z,q) BEGIN vector_to_int(z,x_flag,q); : END PROCESS; END;,60,几种语句的比较,61,34 VHDL语言构造体的描述方式 在VHDL结构体中,可以采用三种不同的描述方式 行为描述 RTL描述 (寄存器传输描述) 结构描述 341 行为描述 高层次的功能描述,主要用于仿真和系统工作原理的研究 。 只表示输入与输出间转换的行为,它不包含任何结构信息,即不必考虑在电路中到底是怎样实现的 。 例如:比较器的行为描述。,62,Library

45、 ieee; Use ieee.std_logic_1164.all; ENTITY compra IS PORT(a,b : in std_logic; equal: out std_logic); End compra; Architecture behavioral of eqcomp4 is begin comp: process (a,b) begin if a=b then equal = 1; else equal =0; end if; end process comp; end behavioral ;,63,342 数据流描述方式 描述输入信号经过怎样的变换得到输出信号。 以规定设计中的各种寄存器形式为特征,然后在寄存器之间插入组合逻辑。 例如:,Architecture dataflow2 of eqcomp4 is begin equal = not(a(0) xor

温馨提示

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

最新文档

评论

0/150

提交评论