DSP技术 备课11_第1页
DSP技术 备课11_第2页
DSP技术 备课11_第3页
DSP技术 备课11_第4页
DSP技术 备课11_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

1、第一章 绪论信息化已成为社会发展的大趋势。信息化是以数字化为背景的,DSP技术是数字化最重要的基本技术之一。1.1 DSP技术的概念和发展自从70年代为处理器生产以来,主要有三个方向的发展。1, 通用CUP。2, 微控制器MCU,即单片机。3, DSP。这三类处理器各有特点,技术上虽有借鉴,但又用各自用在不同的领域。DSP技术的发展分为了两个领域:1, 数字信号处理的理论和方法今年来的到迅速的发展。2, DSP的性能也在迅速提高。见P2,表一。1.2 数字信号处理的优势所在。1, 可控性2, 稳定性3, 可重复性4, 抗干扰性5, 实现自适应算法6, 数据压缩7, 大规模集成模拟信号的不可代替

2、性:自然界信号大多为模拟信号;实时性;射频信号的处理(频谱搬移)。1.3 DSP的主要结构特点1, 哈佛结构和改进型的哈佛结构。2, 流水线技术。3, 硬件乘法器和乘加指令。4, 独立的直接存储器(DMA)总线及其控制器。5, 数据地址发生器。第二章本章将详细讲述TMS320C54X系列DSP芯片内核的结构和原理。DSP芯片时一个复杂的硬件系统,我们只有深入的了解它的内部结构和原理,才能充分的利用它开发我们所需要的软件和程序。3.1中央处理单元CPU对于TMS320C54X系列DSP芯片来说,CPU的功能非常强大,可以在一个周期内高速的完成多项算数运算。下面我们首先从总体上来看看它有哪几部分构

3、成:(1)40位的算数逻辑运算单元(ALU);(2)2个40位的累加器(A和B);(3)-1631位的桶形移位寄存器;(4)乘法器/加法器单元;(5)比较、选择和存储单元;(6)指数编码器;(7)CPU状态和控制寄存器;311算术逻辑运算单元ALU首先,我们来看第一项,ALU单元。ALU单元是DSP芯片的大脑,它可以对各种数据进行处理,(由图可知)。具有多种40位的数学和逻辑运算功能。1 从图上我们可以看出来,ALU的输入有下面两个部分构成;X:(1)来自数据总线DB的数据存储操作数; (2)移位寄存器的输出。Y:(1)累加器A 中的数据; (2)B中的数据; (3)寄存器T 中的数据; (4

4、)数据总线CB中的操作数。2再看,它的运算结果输出通常都被送到了A和B 中3由于它是一个40位的运算单元,那么在运算的时候可能就会出现进位或借位、或者是溢出的情况。在这种情况下就会影响到状态寄存器。 当在发生进位和借位的时候,状态寄存器ST0中的进位位C将被置1。可以对该位的判断来进行分支转移、调用和返回等操作。 当发生溢出时呢?ALU也具有处理溢出功能的结构。当溢出发生的时候,溢出标志位(ST0中的)OVA或OVB将被置1,直到运行复位指令或者是溢出条件指令。 当发生溢出的时候,我们还要关心ST0中的OVM位。当OVM=1时,如果发生的是正向溢出,那么当会用一个32位的最大正数(007FFF

5、FFFFH)加载到累加器中;如果是发生的是负向溢出,则用最大负数(FF80000000H)。如果OVM=0时,那么就不用做溢出处理了,直接将实际运算结果加载到累加器中。4ALU还有另外一个功能,刚刚我们所说的运算都是40位的运算。也就是说ALU在运算的时候就会用到它内部的40位全部资源。但是如果我们要求的计算位数并不是那么高呢?这时候,我们就可以通过设置ST1中的C16位为1,有什么作用呢?它的作用就是可以让ALU在单个周期内进行双(也就是两个)16位的算术运算。312累加器A和B累加器A和B是CPU内核中最为繁忙的寄存器了,ALU要进行的大部分运算都要通过A和B进行中转。累加器A和B都是40

6、位的寄存器,这40位的数据我们把它分成3个部分:低位(AL/BL0、高位(AH/BH)和保护位9AG/BG)3932 3116 150AG/BGAH/BHAL/BL其中,保护位是为了防止迭代运算时溢出的。因为以上3个部分都是存储器映射寄存器,所以我们在操作是可以分别对三个部分进行操作。A和B的差别仅仅在于A的31b16b可以做为乘法器的一个输入。例:当我们使用STH、STL等指令对累加器进行存储操作时,通常在操作时对累加器中的内容进行移位。当右移时,会将AG中的数据移动到AH中;左移时,会将AL中的数据移动到AH中,并将低位添0。如,A中内容为FF43211234H,执行下面操作,STH A,

7、8,TEMP ;TEMP=2112HSTH A,-8,TEMP ;TEMP=FF43HSTL A,8,TEMP ;TEMP=3400HSTL A,-8,TEMP ;TEMP=2112H313桶形移位寄存器桶形移位寄存器是一个40位的单元寄存器,能够将输入的数据进行031b的左移和016b的右移(通常写成-16b31b)。移动的位数可以由下面几种方式定义:(1) 立即数(-1615);如我们上例中的8、-8;(2) 状态寄存器ST1的累加器移位方式(ASM)位,共5位(-1615);(3) 用T寄存器中的低6位数值来定义(-1631)。例:ADD A,-4,B ;A右移4位加到B中ADD A,A

8、SM,B ;A按ASM中的定义移位后加到B中NORM A ;按T中的定义对A进行移位(归一化,这条指令一般不单独使用,和取指指令使用)桶形移位寄存器的主要任务就是为输入数据进行定标。为什么要定标呢?因为计算当中我们的数据范围是受到了位数的限制,移动定标可以使在计算精度要求的范围以内表示出更大范围的数据。314乘法器和加法器 这个单元当中主要包含了3个部分: (1)17b乘17b的硬件乘法器;能够执行无符号数的乘法(16位操作数前面加一个0)、有符号数乘法(16位操作数加符号位扩展成17位的有符号数)和无符号数和有符号数的乘法运算。 当乘法器工作在小数方式相乘的时候(由状态寄存器ST1中的FRC

9、T位决定,若为1则是小数位方式),将相乘结果左移一位以消去多余的符号位 (2)40b的相加器; (3)零检测器、舍入器、溢出/饱和逻辑电路。有些乘法指令如:MAC、MAS等,如果带后缀R,就表示要对结果进行舍入处理,即加如2的15次方,然后对累加器的低16位清零。315比较、选择和存储单元在数据通信和模式识别当中,存在的大量的“加-比-选”的运算,也就是维特比(Viteri)运算,CSSU(比较、选择和存储单元)也就正是针对这个特点而设置的。维特比(Viteri)算法是先对两个操作数相加,然后对相加过后的结果进行比较,最后选出较大的操作数。其中加法运算是用ALU单元完成的,我们前面学过了,如果

10、将ST1中的C16位置1,这样就可以在一个周期之内完成两个16b的加法运算了。完成之后分别存储在累加器的高16b和低16b中。然后利用指令CMPS就可以对AH和AL中的内容进行比较了。如:CMPS A,*AR1 ;如果A(3116)<A(150), ;则*AR1=A(3116),TRN左移1位,TRN(0)=0,TC=0 ;否则*AR1=A(150),TRN左移1位,TRN(0)=1,TC=1TRN将自动记录比较结果。316指数编码器指数编码器用于支持单周期EXP(指数运算指令)的一个专用硬件。在EXP指令中累加器的指数值能以二进制补码的形式存储在T寄存器(低6位,联系桶形移位寄存器)中

11、,范围是-831。指数值定义为前面的冗余位数减8的差值。如:000000FFFFH,前面冗余位数为24位,指数值为24-8=16 0FFFFFFFFFFH,前面冗余位数为4位,指数值为4-8=-4我们看看下面的例子:EXP A ;指数值送入T中ST T,EXPONET ;将指数值存入定义的数据存储器中NORM A ;对累加器归一化317CPU状态和控制寄存器TMS320C5X有3个状态和控制寄存器:(1) 状态寄存器ST0(2) 状态寄存器ST1(3) 处理器工作方式状态寄存器PMST这3个寄存器是整个芯片的控制部分,相当于芯片的神经中枢,控制着整个芯片的运行状态。这3个寄存器中,ST0和ST

12、1中包含着芯片的各种工作条件和工作状态;PMST中包含了寄存器的设置状态和其他一些控制信息。1 处理器工作方式状态寄存器PMSTPMST主要设定并控制处理器的工作方式,放映处理器的工作状态。其结构如下:157 6 5 4 3 2 1 0IPTP MP/MCOVLYAVISDROMCLKOFFSMULSST(1) IPTR,中断向量指针。IPTR共9位,它标志着中断向量驻留的128b字的程序存储区地址。复位时,这9b全部置1,因此复位向量总是驻留在程序存储空间地址为FF80H处。 (2) MP/MC,微处理器或微计算机工作方式选择位。通过设置该位来选择芯片工作在哪种工作方式。若连接引脚为高电平时

13、,工作在微处理器状态,这时不能寻址片内的程序寄存器;若为低电平时,工作在微计算机状态,此时可以选择片内程序存储器。(3) OVLY,RAM重复占用标志位。如果此位置位,允许片内双寻址数据RAM映射到程序空间,也就是可以将片上的RAM作为程序空间寻址。注意:数据0页(07FH)为特殊寄存器空间,不能映射。(4) AVIS,地址可见位。此位置位,允许在地址引脚上看见内部程序空间的地址内容。(5) DROM,数据ROM位。这一位用来控制片内的ROM是否映射到数据空间。(同OVLY位联系讲)(6) CLKOFF,时钟关断位。该位决定引脚CLKOUT(输出时钟脉冲)是否允许输出。为1是禁止输出。(7)

14、SMUL,乘法饱和位。该位只有在OVM=1,FRCT=1时才有效,对乘法结果进行饱和处理。(8) SST,存储饱和位。当SST=1时,对存储前累加器进行饱和处理。2 状态寄存器ST0状态寄存器ST0,主要反映寻址要求和计算中间运行状态。1513 12 11 10 9 80ARPTCCOVAOVBDP各位定义如下:(1) ARP,辅助寄存器指针。ARP共3位,用于间接寻址当中辅助寄存器的选择。(2) TC,测试/控制位。用于保存ALU的测试位操作结果,也可根据该位状态辅助一些状态转移指令的执行。(3) C,进位标志位。(4) OVA,累加器A的溢出标志。(5) OVB,累加器A的溢出标志。(6)

15、 DP,数据存储器页指针。DP是一个9b的字段,常常作为高9b和指令中的低7b想结合,直接寻址。3 状态寄存器ST1ST1反映了寻址要求、计算的初始设置、I/O及中断控制。 15 14 13 12 11 10 9 8 7 6 5 40BRAFCPLXFHMINTM0OVMSXMC16FRCTCMPTASM各位定义如下。(1) BRAF,块重复操作标志。如果BRAF=1,表示正在执行块重复操作指令;(2) CPL,直接寻址编辑方式标志位。该标志为标志直接寻址方式选用何种指针。如过CPL=1,表示选用堆栈指针(SP),若CPL=0,表示选用页指针(DP)。(3) XF,XF引脚状态控制位。控制XF

16、通用外部I/O引脚输出状态。(4) HM,CPU保持工作方式标志。该位是当芯片响应HOLD信号时,CPU保持工作方式标志。(5) INTM,中断方式控制位。可开关所有可屏蔽中断。(6) “0”位。(7) OVM,溢出方式控制位。(前面内容中讲过,ALU中)(8) SXM,符号扩展方式控制位。该位用于决定符号位是否扩展。当SXM=1时,数据进入ALU之前进行符号位扩展。(9) C16,双16b/双精度算术运算方式控制位。(前面介绍过,CSSU中)(10) FRCT,小数方式控制位。(前面介绍过,乘法器中)(11) CMPT,间接寻址辅助寄存器修正方式控制位。当CMPT=1时,可通过修改ARP内容

17、改变当前辅助寄存器AR1AR7的值。如果CMPT=0,则ARP必须清零,且不能被修正。(12) ASM,累加器移位方式控制位。(前面讲过,移位寄存器)3.2 总线结构我们来看看,DSP芯片内部的数据是怎么传输的呢?TMS320C54系列的芯片内部总线结构是一样的,均有8条总线,分别是4条地址总线、3条数据总线和一条程序总线,其中每条总线都是16位。TMS320C54系列芯片之所以有如此优良的性能,正是由于这8条并行的总线结构。TMS320C54系列芯片可以在一个机器周期内完成4次访问存储器的操作:取1次指令、读2个操作数、写1个操作数。1 程序总线PB和程序地址总线PAB程序地址总线PAB用于

18、传送程序存储器的地址,而程序总线PB则传送来自程序存储器的指令代码和操作数。程序存储器总选中的内容是根据程序存储器中地址来选择实现的。2 数据总线DB、CB和数据地址总线DAB、CAB数据总线DB和CB是与读操作相关的数据总线,由于具有两条这样的总线,所以TMS320C54系列芯片可以实现在单周期内读取两个操作数,而数据地址总线DAB与CAB就是这两条总线对应的地址总线。3 数据总线EB和数据地址总线EAB数据总线EB是一个与写操作数相关的数据总线,任何一条写指令都是通过这条总线来传送数据的,EAB就是与之相对应的地址总线。由于分离的读写总线,所以在一个周期内可以同时执行读写操作。下面我们以一

19、个表格的形式来展示一下个总总线的功能列表 读写方式数据总线程序总线数据地址总线CBDBEBPBPABCABDABEAB程序写程序读单数据写单数据读双数据读长数据(32b)读(hw)(lw) (hw)(lw)数据读/数据写双数据读/系数读外设读外设写指令系统部分1 算术指令: ABDST:ABS:ADD:ADDC:ADDM:ADDS:EXP:FIRS:LTD:LMS:MACRMACARMACDMACP:MACUS:MASR:MASAR:MAX:MIN:MPYR:MPYA:MPYU:第6章第3部分在数字信号处理的过程当中,我们会大量的遇到比如相乘,相加,比较等各种各样的算数运算。那么这样多的运算的

20、对象是什么呢?当然是各种各样的数据,也就是我们在DSP当中常常说到的”操作数”(运算当中的大部分”操作数”通常放在数据存储器中,而立即数放在程序存储器当中)。所谓寻址,也就是我们拿到这样一些操作数进行运算。寻址方法,当然就是我们(拿到)寻找所指定的参与运算的操作数的方法。(程序的跳转或者重复操作也可称之为寻址,后面课程中会提到的)在编写程序时,我们可以根据程序不同的要求采用不同的寻址方式,从而缩短程序运行的时间和提高代码执行效率。今天我们讲授的内容就是TMS320C54X系列DSP芯片的寻址方式。6.1 数据寻址方式TMS320C54X系列DSP器件具有下列基本的寻址方式:(1) 立即寻址,指

21、令编码本身带有操作数。(2) 绝对寻址,指令编码中含有操作数地址。(3) 累加器寻址,累加器的内容是程序存储器中操作数的地址。(4) 直接寻址,指令编码中含有的7b地址与DP或SP一起合成数据存储器中操作数的实际地址。(5) 间接寻址,同过辅助寄存器寻址。(6) 存储器映像寄存器寻址,这种寻址方式不影响当前数据页面指针DP和当前堆栈指针SP的值。6.1.1 立即寻址 什么是立即寻址呢?是指指令里包含了立即操作数。 指令当中的立即数编码可以是一个字,也可以是两个字长(根据立即数的长短而定)。(1) 长度为3b或5b、8b、9b的立即数我们称之为短立即数。(2) 长度为16b的长立即数。我们来看一

22、些立即数不同时,用立即数寻址的例子:LD #2,ARP ;ARP=2,ARP(ST0:辅助寄存器指针,1513)LD #3,ASM ;ASM=3,ASM(ST1:累加器移位寄存器,40)LD #50,DP ;DP=50,DP(ST0:数据存储页面指针,80)ADD #0ffh,A ;将0ffh加给AccA上面这些都是短立即数寻址,我们以最后一个位例,来看看他的编码方式是怎样的?由上图我们可以很轻松的看出,对于短立即数寻址,译成机器码的时候只占两个字节,操作码一个字节,短立即数一个字节。我们再来看这样两条指令:STM #FFFFH,IMR ;IMR=FFFFH,开所有中断(当然,需要ST1中的I

23、NTM=0)ADD #1234h,A ;将#1234h加给AccA以上两个立即数都是16b长度的立即数,那么它们就属于场立即数寻址了。我们以第二个指令来看看它的编码方式,看和短立即数寻址有什么不同?由上图我们可以看出,它的编码总共占了两个字(4个字节),其中操作码和操作数各占了一个字。很明显,长立即数寻址占用的存储空间要大。立即数寻址由此,可分为长立即数寻址和短立即数寻址两种方式。6.1.2 绝对寻址 绝对寻址,就是在指令中包含有所需寻址的存储单元的16位地址。在绝对寻址指令语法中,存储单元的16位地址,可以用其所在单元的地址标号或者16位符号常数来表示。所以编码长度总是16b,占两个字以上。

24、有以下4类:1数据存储器地址(dmad)寻址: MVDK Smem, dmad data(dmad)=Smem MVDM dmad, MMR MVKD dmad, Smem MVMD MMR, dmad2程序存储器地址(pmad)寻址: FIRS Xmem, Ymem, pmad MACD Smem, pmad, src MACP Smem, pmad, src MVPD pmad, Smem3端口地址(PA)寻址 PORTR PA, Smem PORTW Smem, PA4*(lk)寻址适用于支持单数据存储器操作数的指令例:MVKD SAMPLE,*AR5 ; 将数据存储器SAMPLE地址单

25、元中的数据传送到又AR5 寄存器所指向的存储器单元中。SAMPLE为一符号常数,代表一个数据存储单元的地址。 MVPD TABLE,*AR7- ; 将程序存储器标号为TABLE地址单元中的数据传送到由AR7寄存器所指向的数据存储器单元中。TABLE代表一个程序存储单元的地址。 PORTR FIFO,*AR5 ;从FIFO端口读入一个数据,将其存放到由AR5寄存器所指向的数据存储器单元中。FIFO是一个I/O端口地址标号。 LD *(BUFFER) A ;将BUFFER符号所指的数据存储器单元中的数据传送到累加器A。BUFFER是一个16位符号常数。6.1.3 累加器寻址 累加器寻址,就是利用累

26、加器的数值作为地址来读写程序存储器。有两条指令用的是累加器寻址方式: READA Smem ;以累加器A中的数位地址,从程序存储器中读入一个数,并传送到由Smem所指定的数据存储器单元之中。 WRITA Smem ;将Smem所指定的数据存储单元中的一个数,传送到累加器A所指定的程序存储器单元中。6.1.4 直接寻址 在直接寻址中,指令包含了有数据存储器地址(dma)的低7b,这7b作为地址偏移量,结合数据页指针DP或堆栈指针SP形成16b的数据存储器地址。 使用这种寻址,我们可以在不修改DP和SP的情况下,对128个数据寻址。 在直接寻址方式中,指令中包含了数据存储器的低7b地址: ST1中

27、的编译模式位CPL用于选择DP或SP来产生数据存储器的地址。(1)当CPL=0时,7b地址与DP中的9b字段形成16b的数据存储器地址。Ps:为什么我们将DP叫做页面指针?应为DP占高9位地址,也就是将存储器逻辑的分为了512页,每页有128个地址单元。(2)当CPL=1时,7b地址作为一个正数,与SP相加形成16b的数据存储器地址。 直接寻址的语法是利用一个“”(在变量的前面加上),或者一个数来设定偏移地址的值。直接寻址是一个单周期执行指令,但要注意数据所在的页面指针。6.1.5 间接寻址 在间接寻址中,64K数据空间任意单元都可通过一个辅助寄存器中的16-bit地址进行访问。C54x有8个

28、16-bit辅助寄存器(AR0-AR7)。两个辅助寄存器算术单元(ARAU0和ARAU1),根据辅助寄存器的内容进行操作,完成无符号的16-bit算术运算。间接寻址很灵活,不仅能从存储器中读或写一个单16-bit数据操作数,而且能在一条指令中访问两个数据存储器单元(即从两个独立的存储器单元读数据,或读一个存储器单元同时写另一个存储器单元,或读写两个连续的存储器单元)。单操作数间接寻址方框图:单操作数间接寻址类型:*Arx:ARx包含了数据存储器地址。*ARx-/ *ARx+ :访问后,ARx中的地址减1/加1。*+ARx:在寻址之前,ARx中的地址加1。*ARx-0B /*ARx+0B :访问

29、后,从ARx中以位倒序进位的方式减去/加上AR0。*ARx-0/ *ARx+0 :访问后,从ARx中减去/加上 AR0。*ARx-%/*ARx+% :访问后,ARx中的地址以循环寻址的方式减1/加1。*ARx-0%/ *ARx+0% :访问后,从ARx中以循环寻址的方式减去/加上AR0。*ARx(lk):ARx和16-bit的长偏移(lk) 的和用来作为数据存储器地址。ARx本身不被修改。*+ARx(lk):在寻址之前,把一个带符号的16-bit的长偏移(lk)加到ARx中,然后用新的ARx的值作为数据存储器的地址。*+ARx(lk)%:在寻址之前,把一个带符号的16-bit的长偏移以循环寻址

30、的方式加到ARx中,然后再用新的ARx的值作为数据存储器的地址。编程举例:间接寻址编程:.mmregs.bss x, 4, 1a.word 1, 2, 3, 4.sect “program”STM #a, AR1STM #x, AR2LD #0, ALD *AR1+,TMAC *AR2+,A ;乘加指令LD *AR1+,TMAC *AR2+,A LD *AR1+,T MAC *AR2+,A LD *AR1,T MAC *AR2,A .双操作数寻址方式:双数据操作数间接寻址方框图:双数据存储器操作数间接寻址类型*Arx: ARx是数据存储器地址*ARx-/ *ARx+: 访问后,ARx中的地址减

31、1/加1*ARx+0%: 访问后,AR0以循环寻址的方式加到ARx中。例如:MPY *AR2,*AR3,A ;乘法指令1.位倒序寻址位倒序寻址提高了执行速度和在FFT算法的程序中使用存储器的效率。在这种寻址方式中,AR0存放的整数N是FFT点数的一半。一个辅助寄存器指向一数据存放的物理单元。当使用位倒序寻址把AR0加到辅助寄存器中时,地址以位倒序的方式产生,即进位是从左向右,而不是从右向左。间接寻址中*Arn+0B/-0B表示位倒序寻址。例:8点的FFT蝶型结运算FFT运算时输出/输入序列中必有其一要混序。(时域抽取或频域抽取)为了方便读取数据,我们采用位倒序的方式进行寻址,FFT长度N=8,

32、则AR0赋值为4,位倒序方式读入数据情况如下:*AR2+0B ;AR2=0110 0000*AR2+0B ;AR2=0110 0100*AR2+0B ;AR2=0110 0010*AR2+0B ;AR2=0110 0110*AR2+0B ;AR2=0110 0001*AR2+0B ;AR2=0110 0101*AR2+0B ;AR2=0110 0011*AR2+0B ;AR2=0110 01112.循环寻址:许多算法,如卷积,相关和FIR滤波等,都需要在存储器中实现一个循环缓冲器。在这些算法中,一个循环缓冲器就是一个包含了最近的数据的滑动窗口。当新的数据来到时,缓冲器就会覆盖最早的数据。循环缓冲器实现的关键是循环寻址的实现。C54x间接寻址中提供了循环寻址的方式,以%表示。 如何对循环寻址的有效地址进行计算呢? 首先, 定义循环缓冲器大小寄存器(BK)来确定了循环缓冲器的大小。大小为R的循环缓冲器必须从一个N-bit边界开始。循环缓冲器的有效基地址(EFB)就是用户选定的辅助寄存器(ARx)的低N位置 0后所得到的值。 满足条件: 循环缓冲器的尾地址(EOB)是通过用BK的低N位代替ARx的低N位得到。循环缓冲器的INDEX就是ARx的低N位,step就是加到辅助

温馨提示

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

评论

0/150

提交评论