Verilog 精简指令集计算机_第1页
Verilog 精简指令集计算机_第2页
Verilog 精简指令集计算机_第3页
Verilog 精简指令集计算机_第4页
Verilog 精简指令集计算机_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

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

文档简介

1、Verilog HDL精简指令集计算机简介nRISC RISC 即精简指令集计算机(即精简指令集计算机(Reduced Instruction Set ComputerReduced Instruction Set Computer)的缩写。它是一种八十年代才出现的的缩写。它是一种八十年代才出现的CPUCPU,与一般的与一般的CPU CPU 相比不仅相比不仅只是简化了指令系统,而且是通过简化指令系统使计算机的结构更只是简化了指令系统,而且是通过简化指令系统使计算机的结构更加简单合理,从而提高了运算速度。从实现的途径看,加简单合理,从而提高了运算速度。从实现的途径看,RISC_CPURISC_C

2、PU与与一般的一般的CPUCPU的不同处在于:它的时序控制信号形成部件是用硬布线的不同处在于:它的时序控制信号形成部件是用硬布线逻辑实现的而不是采用微程序控制的方式。所谓硬布线逻辑也就是逻辑实现的而不是采用微程序控制的方式。所谓硬布线逻辑也就是用触发器和逻辑门直接连线所构成的状态机和组合逻辑,故产生控用触发器和逻辑门直接连线所构成的状态机和组合逻辑,故产生控制序列的速度比用制序列的速度比用微程序控制方式微程序控制方式快得多,因为这样做省去了读取快得多,因为这样做省去了读取微指令的时微指令的时间间RISC CPURISC CPU结构结构 RISC_CPURISC_CPU是一个复杂的数字逻辑电路,

3、但是它的基本部件的逻辑并不复是一个复杂的数字逻辑电路,但是它的基本部件的逻辑并不复杂。可把它分成八个基本部件:杂。可把它分成八个基本部件: 1) 1) 时钟发生器时钟发生器 2) 2) 指令寄存器指令寄存器 3) 3) 累加器累加器 4) 4) RISC CPURISC CPU算术逻辑运算单元算术逻辑运算单元 5) 5) 数据控制器数据控制器 6) 6) 状态控制器状态控制器 7) 7) 程序计数器程序计数器 8) 8) 地址多路地址多路器器 9 9)存储器()存储器(RAM,ROM)RAM,ROM)主要特征: 8位数据、13位地址、8条指令,每条指令8Tclk指令格式:D15-D13D12-

4、D0操作码地址码1) HLT停机操作。该操作将空一个指令周期,即8个时钟周期。2) SKZ为零跳过下一条语句。该操作先判断当前alu中的结果是否为零,若是零就跳过下一条语句,否则继续执行。3) ADD相加。该操作将累加器中的值与地址所指的存储器或端口的数据相加,结果仍送回累加器中。4) AND相与。该操作将累加器的值与地址所指的存储器或端口的数据相与,结果仍送回累加器中。5) XOR异或。该操作将累加器的值与指令中给出地址的数据异或,结果仍送回累加器中。6) LDA读数据。该操作将指令中给出地址的数据放入累加器。7) STO写数据。该操作将累加器的数据放入指令中给出的地址。8) JMP无条件跳

5、转语句。该操作将跳转至指令给出的目的地址,继续执行。 RISC_CPU是8位微处理器,一律采用直接寻址方式,即数据总是放在存储器中,寻址单元的地址由指令直接给出。这是最简单的寻址方式。n控制器在clk1下降沿输出控制信号。PC随inc_pc上升沿动作(即clk1下降沿)n其它部件在clk1上升沿动作。即在Ti中间输出控制信号,在Ti结束时动作。n如取高8位指令:rd=1,load_ir=1,而ir锁存在T1上升沿锁存(即T0结束时)clk1T0T1T2T3T4T5T6T7fetchrdload_irADDRinc_pc时 序alu_clkCPU执行指令过程:T0: 状态控制器输出rd=1,lo

6、ad_ir=1,另state=0,由M读1字节,在T0结束时锁存到ir高8位。即取高字节指令。T1: inc_pc=1使地址加1, rd=1,load_ir=1,另state=1,由M读1字节,在T1结束时锁存到ir低8位。即取低字节指令。T2: 空操作T3: inc_pc=1。若opcord=HLT, 则HALT=1;T4: 若opcord=ADD,AND,XOR,LDA,则rd=1,根据ir_addr读Mem 若opcord=JMP,则load_pc=1 若opcord=STO,则datactl_ena=1,将accum通过alu _out送DBT5: 若opcord=ADD,AND,XO

7、R, LDA,则rd=1(继续读Mem)且load_acc=1,由于acc已送alu, alu操作结果在T5结束时锁存到acc; 若opcord=STO,则 datactl_ena =1(继续将accum通过alu _out送DB )且wr=1,在T5结束时写到Mem;若opcord=JMP,则inc_pc=1,load_pc=1,在inc_pc 上升沿锁存ir_addr到pc;若opcord=SKZ且acc=0 ,则inc_pc=1。T6:空操作T7:若opcord=SKZ且acc=0,则inc_pc=1,即跳过一条指令。DATA ALU_OUTACCUM zeroalu_clk alu o

8、pcodedata opc_iraddrenarst registerclk1data accumena accumrstclk1 CLK1 INC_PCZERO LOAD_ACCFETCH LOAD_PCRST CONTROL RD WR OPCODE LOAD_IR HALT DATACTL_ENA In data datactldata_ena fetch addrir_addr adrpc_addrir_addr pc_addrloadclock counterrst clk 1fetch clk alu_clk clk_genDATAIRSTICLKI OPCODE IR_ADDR

9、ALU_OUTACCUMZEROOPCODEDATA_ENAPC_ADDRADDRDATAIHALTILOAD_IRIR_ADDRWRIRDILOAD_ACCINC_PCLOAD_PCRISCCPU中各部件的相互连接关系中各部件的相互连接关系RTL 视图顶层模块n代码:module CPU(zero,clk,reset,halt,rd,wr,ir_addr,addr,data,inc_pc,rom_sel,ram_sel, accum,load_acc,datactl_ena,opcode,alu_clk);ninput clk,reset;noutput zero,rd,wr, halt,i

10、nc_pc,rom_sel,ram_sel,load_acc,datactl_ena,alu_clk;noutput12:0ir_addr,addr;noutput2:0opcode;noutput 7:0data,accum;nwire clk,reset,halt;nwire 7:0 data;nwire 12:0 addr;nwire rd,wr;nwire clk1,fetch,alu_clk;nwire 2:0 opcode;nwire 12:0 ir_addr,pc_addr;nwire 7:0 alu_out,accum;nwire zero,inc_pc,load_acc,lo

11、ad_pc,load_ir,data_ena,contr_ena;nwire 15:0opc_iraddr;nassign opcode=opc_iraddr15:13;nassign ir_addr=opc_iraddr12:0;nclk_gen m_clk_gen(.clk(clk), .reset(reset),.clk1(clk1),.clk2(clk2),n.clk4(clk4),.fetch(fetch),.alu_clk(alu_clk);代码nregister m_register(.opc_iraddr(opc_iraddr),.data(data) ,.ena(load_i

12、r),n.clk1(clk1),.rst(reset);naccum m_accum(.accum(accum),.data(alu_out),.ena(load_acc),n.clk1(clk1),.rst(reset);nalu m_alu(.alu_out(alu_out),.zero(zero),.opcode(opcode),n.data(data),.accum(accum),.alu_clk(alu_clk);nmachinect m_machinect(.ena(ena),.fetch(fetch),.rst(reset);nmachine m_machine(.inc_pc(

13、inc_pc), .load_acc(load_acc ), .load_pc(load_pc ),n.rd(rd),.wr(wr),.load_ir(load_ir ),.datactl_ena(datactl_ena ),.halt (halt), .clk1 (clk1), .zero (zero), .ena (ena ),.opcode(opcode);ndatactl m_datactl(.data(data), .in (alu_out),.data_ena(datactl_ena);ncounter m_counter(.pc_addr(pc_addr ),.ir_addr(i

14、r_addr ),.load(load_pc),n.clock(inc_pc),.rst(reset);/.op(opc_iraddr12:0),nadr m_adr(.addr (addr),.fetch (fetch),.ir_addr (ir_addr ),.pc_addr (pc_addr );naddr_decode addr_decode1(addr,rom_sel,ram_sel);nram ram1(.data(data),.addr(addr),.ena(ram_sel),.read(rd),.write(wr);nrom rom1(.data(data),.addr(add

15、r),.read(rd),.ena(rom_sel); endmodule时钟发生器时钟发生器时钟发生器 clkgen 利用外来时钟信号clk 来生成一系列时钟信号clk1、fetch、alu_clk 送往CPU的其他部件。其中fetch是外来时钟 clk 的八分频信号。利用fetch的上升沿来触发CPU控制器开始执行一条指令,同时fetch信号还将控制地址多路器输出指令地址和数据地址。clk1信号用作指令寄存器、累加器、状态控制器的时钟信号。alu_clk 则用于触发算术逻辑运算单元。 CLKCLK1CLKGENALU_CLKFETCHCLKCLK1ALU_CLK FETCH时钟发生器RES

16、ETRESET clkclk1clk2clk4fetchalu_clk时钟发生器clkgen的波形REL视图时钟发生器代码nmodule clk_gen (clk,reset,clk1,clk2,clk4,fetch,alu_clk);ninput clk,reset;noutput clk1,clk2,clk4,fetch,alu_clk;nwire clk,reset;nreg clk2,clk4,fetch,alu_clk;nreg7:0 state;nparameter S1 = 8b00000001,n S2 = 8b00000010,n S3 = 8b00000100,n S4 =

17、 8b00001000,n S5 = 8b00010000,n S6 = 8b00100000,n S7 = 8b01000000,n S8 = 8b10000000,n idle = 8b00000000;n assign clk1 = clk;nalways (negedge clk)n if(reset)n beginn clk2 = 0;n clk4 = 1;n fetch = 0;n alu_clk = 0;n state = idle;n 代码n endn elsen begin n case(state)n S1: beginn clk2 = clk2;n alu_clk = a

18、lu_clk; n state = S2;n endn S2: beginn clk2 = clk2;n clk4 = clk4;n alu_clk = alu_clk;n state = S3;n end n S3: begin n clk2 = clk2;n state = S4;n endn S4: beginn clk2 = clk2;n clk4 = clk4;n fetch = fetch;n state = S5;n endn S5: beginn clk2 = clk2;n state = S6;n end n S6:n beginn clk2 = clk2;n clk4 =

19、clk4;n state = S7;n endn S7:n beginn clk2 = clk2;n state = S8;n endn n S8:n beginn clk2 = clk2;n clk4 = clk4;n fetch = fetch;n state = S1;n endn idle: state = S1; n default: state = idle; n endcasen endnendmodule代码n endn S5: beginn clk2 = clk2;n state = S6;n end n S6:n beginn clk2 = clk2;n clk4 = cl

20、k4;n state = S7;n endn S7:n beginn clk2 = clk2;n state = S8;n endn n S8:n beginn clk2 = clk2;n clk4 = clk4;n fetch = fetch;n state = S1;n endn idle: state = S1; n default: state = idle; n endcasen endnendmodule指令寄存器指令寄存器 顾名思义,指令寄存器用于寄存指令。顾名思义,指令寄存器用于寄存指令。指令寄存器的触发时钟是指令寄存器的触发时钟是clk1clk1,在在clk1clk1的正沿触

21、发下,寄存器将数据总线送来的指令的正沿触发下,寄存器将数据总线送来的指令存入高存入高8 8位或低位或低8 8位寄存器中。但并不是每个位寄存器中。但并不是每个clk1clk1的上升沿都寄存数据总线的数据,因的上升沿都寄存数据总线的数据,因为数据总线上有时传输指令,有时传输数据。什么时候寄存,什么时候不寄存由为数据总线上有时传输指令,有时传输数据。什么时候寄存,什么时候不寄存由CPUCPU状状态控制器的态控制器的load_irload_ir信号控制。信号控制。load_irload_ir信号通过信号通过enaena 口输入到指令寄存器。复位后,口输入到指令寄存器。复位后,指令寄存器被清为零。指令寄

22、存器被清为零。每条指令为每条指令为2 2个字节,即个字节,即1616位。高位。高3 3位是操作码,低位是操作码,低1313位是地址。(位是地址。(CPUCPU的地址总线为的地址总线为1313位,寻址空间为位,寻址空间为8 8K K字节。)本设计的数据总线为字节。)本设计的数据总线为8 8位,所以每条指令需取两次。先取高位,所以每条指令需取两次。先取高8 8位,后取低位,后取低8 8位。而当前取的是高位。而当前取的是高8 8位还是低位还是低8 8位,由变量位,由变量statestate记录。记录。statestate为零表示取为零表示取的高的高8 8位,存入高位,存入高8 8位寄存器,同时将变量

23、位寄存器,同时将变量statestate置为置为1 1。下次再寄存时,由于。下次再寄存时,由于statestate为为1 1,可知取的是低可知取的是低8 8位,存入低位,存入低8 8位寄存器中。位寄存器中。RTL视图代码nmodule register(opc_iraddr,data,ena,clk1,rst);noutput 15:0 opc_iraddr;ninput 7:0 data;ninput ena, clk1, rst;nreg 15:0 opc_iraddr;nreg state;nalways (posedge clk1)n beginn if(rst)n beginn op

24、c_iraddr=16b0000_0000_0000_0000;n state=1b0;n endnelsenbeginn if(ena) /如果加载指令寄存器信号load_ir到来,n begin /分两个时钟每次8位加载指令寄存器n casex(state) /先高字节,后低字节n 1b0: beginn opc_iraddr15:8=data;n state=1; endn 1b1: beginn opc_iraddr7:0=data;n state=0;endn default: n beginn opc_iraddr15:0=16bxxxxxxxxxxxxxxxx;n state=1

25、bx;n endn endcasen endn elsen state=1b0;n endnendnendmodule代码nbeginn if(ena) /如果加载指令寄存器信号load_ir到来,n begin /分两个时钟每次8位加载指令寄存器n casex(state)/先高字节,后低字节n 1b0: beginn opc_iraddr15:8=data;n state=1; endn 1b1: beginn opc_iraddr7:0=data;n state=0;endn default: n beginn opc_iraddr15:0=16bxxxxxxxxxxxxxxxx;n s

26、tate=1bx;n endn endcasen endn elsen state=1b0;end;endmodule累加器累加器累加器用于存放当前的结果,它也是双目运算其中一个数据来源。复位后,累加器的值是零。当累加器通过ena口收到来自CPU状态控制器load_acc信号时,在clk1时钟正跳沿时就收到来自于数据总线的数据。RTL视图代码nmodule accum( accum, data, ena, clk1, rst);noutput7:0accum;ninput7:0data;ninput ena,clk1,rst;nreg7:0accum;nalways(posedge clk1)

27、n beginn if(rst)n accum=8b0000_0000;/Resetn else if(ena)/当CPU状态控制器发出load_acc信号n accum=data;/Accumulaten endnendmodule算术运算器算术运算器n算术逻辑运算单元 根据输入的8种不同操作码分别实现相应的加、与、异或、跳转等8种基本操作运算。利用这几种基本运算可以实现很多种其它运算以及逻辑判断等操作。 RTL视图代码nmodule alu (alu_out, zero, data, accum, alu_clk, opcode);noutput 7:0alu_out;noutput ze

28、ro;ninput 7:0 data, accum;ninput 2:0 opcode;ninput alu_clk;nreg 7:0 alu_out;nparameter HLT =3b000,nSKZ =3b001,nADD =3b010,nANDD =3b011,nXORR =3b100,nLDA =3b101,nSTO =3b110,nJMP =3b111;nassign zero = !accum;nalways (posedge alu_clk)n begin /操作码来自指令寄存器的输出opc_iaddr的 n /低3位代码n casex (opcode)n HLT: alu_o

29、ut=accum;n SKZ: alu_out=accum;n ADD: alu_out=data+accum;n ANDD: alu_out=data&accum;n XORR: alu_out=dataaccum;n LDA: alu_out=data;n STO: alu_out=accum;n JMP: alu_out=accum;n default: alu_out=8bxxxx_xxxx;n endcasen endnendmodule数据控制器数据控制器n数据控制器的作用是控制累加器数据输出,由于数据总线是各种操作时传送数据的公共通道,不同的情况下传送不同的内容。有时要传输指令,

30、有时要传送RAM区或接口的数据。计算单元的数据只有在需要往RAM区或端口写时才允许输出,否则应呈现高阻态,以允许其它部件使用数据总线。 所以任何部件往总线上输出数据时,都需要一控制信号。而此控制信号的启、停,则由CPU状态控制器输出的各信号控制决定。数据控制器何时输出ALU的数据则由状态控制器输出的控制信号datactl_ena决定RTL视图代码nmodule datactl (data,in,data_ena);noutput 7:0data;ninput 7:0in;ninput data_ena;n assign data = (data_ena)? in : 8bzzzz_zzzz;n

31、endmodule地址多路器地址多路器n地址多路器用于选择输出的地址是PC(程序计数)地址还是数据/端口地址。每个指令周期的前4个时钟周期用于从ROM中读取指令,输出的应是PC地址。后4个时钟周期用于对RAM或端口的读写,该地址由指令中给出。地址的选择输出信号由时钟信号的8分频信号fetch提供。RTL视图代码nmodule adr(addr,fetch,ir_addr,pc_addr);noutput 12:0 addr;ninput 12:0 ir_addr, pc_addr;ninput fetch;nassign addr = fetch? pc_addr : ir_addr;nend

32、module程序计数器程序计数器程序计数器用于提供指令地址。以便读取指令,指令按地址顺序存放在存储器中。有两种途径可形成指令地址:其一是顺序执行的情况,其二是遇到要改变顺序执行程序的情况,例如执行JMP指令后,需要形成新的指令地址。复位后,指令指针为零,即每次CPU重新启动将从ROM的零地址开始读取指令并执行。每条指令执行完需2个时钟,这时pc_addr已被增2,指向下一条指令。(因为每条指令占两个字节。)如果正执行的指令是跳转语句,这时CPU状态控制器将会输出load_pc信号,通过load口进入程序计数器。程序计数器(pc_addr)将装入目标地址(ir_addr),而不是增2。RTL视图

33、代码module counter ( pc_addr, ir_addr, load, clock, rst);output 12:0 pc_addr;input 12:0 ir_addr;input load, clock, rst;reg 12:0 pc_addr; always ( posedge clock or posedge rst ) begin if(rst) pc_addr=13b0_0000_0000_0000; else if(load) pc_addr=ir_addr; else pc_addr = pc_addr + 1; endendmodule状态控制器状态控制器状

34、态控制器由两部分组成: 1.状态机(图中的MACHINE部分)2.状态机控制器(图中的MACHINECTL部分) 状态机控制器接受复位信号RST,当RST有效时通过信号ena使其为0,输入到状态机中停止状态机的工作。简介状态机是CPU的控制核心,用于产生一系列的控制信号,启动或停止某些部件。CPU何时进行读指令读写I/O端口,RAM区等操作,都是由状态机来控制的。状态机的当前状态,由变量state记录,state的值就是当前这个指令周期中已经过的时钟数(从零计起)。 指令周期是由8个时钟周期组成,每个时钟周期都要完成固定的操作1)第0个时钟,因为CPU状态控制器的输出:rd和load_ir为高

35、电平,其余均为低电平。指令寄存器寄存由ROM送来的高8位指令代码。2)第1个时钟,与上一时钟相比只是inc_pc从0变为1故PC增1,ROM送来低8位指令代码,指令寄存器寄存该8位代码。3)第2个时钟,空操作。4)第3个时钟,PC增1,指向下一条指令。若操作符为HLT,则输出信号HLT为高。如果操作符不为HLT,除了PC增一外(指向下一条指令),其它各控制线输出为零。5)第4个时钟,若操作符为AND、ADD、XOR或LDA,读相应地址的数据;若为JMP,将目的地址送给程序计数器;若为STO,输出累加器数据。6)第5个时钟,若操作符为ANDD、ADD或XORR,算术运算器就进行相应的运算;若为L

36、DA,就把数据通过算术运算器送给累加器;若为SKZ,先判断累加器的值是否为0,如果为0,PC就增1,否则保持原值;若为JMP,锁存目的地址;若为STO,将数据写入地址处。7)第6个时钟,空操作。8)第7个时钟,若操作符为SKZ且累加器值为0,则PC值再增1,跳过一条指令,否则PC无变化。RTL视图代码nmodule machine( inc_pc, load_acc, load_pc, rd,wr, load_ir,ndatactl_ena, halt, clk1, zero, ena, opcode );noutput inc_pc, load_acc, load_pc, rd, wr, l

37、oad_ir;noutput datactl_ena, halt;ninput clk1, zero, ena;ninput 2:0 opcode;nreg inc_pc, load_acc, load_pc, rd, wr, load_ir;nreg datactl_ena, halt;nreg 2:0 state;nparameter HLT = 3 b000,n SKZ = 3 b001,n ADD = 3 b010,n ANDD = 3 b011,n XORR = 3 b100,n LDA = 3 b101,n STO = 3 b110,n JMP = 3 b111;n always

38、( negedge clk1 )n beginn if ( !ena ) /接收到复位信号RST,进行复位操作n beginn state=3b000;n inc_pc,load_acc,load_pc,rd=4b0000;n wr,load_ir,datactl_ena,halt=4b0000;nstate=3b011;n endn3b011:/next instruction address setup 分析指令从这里开始n beginn if(opcode=HLT)/指令为暂停HLTn beginn inc_pc,load_acc,load_pc,rd=4b1000;n wr,load_

39、ir,datactl_ena,halt=4b0001;n endn elsen beginn inc_pc,load_acc,load_pc,rd=4b1000;n wr,load_ir,datactl_ena,halt=4b0000;n endn state=3b100;nendn3b100: /fetch oprandn beginn if(opcode=JMP) n beginn inc_pc,load_acc,load_pc,rd=4b0010;n wr,load_ir,datactl_ena,halt=4b0000;n end n else if( opcode=ADD | opco

40、de=ANDD | n opcode=XORR | opcode=LDA)n beginn inc_pc,load_acc,load_pc,rd=4b0001;n wr,load_ir,datactl_ena,halt=4b0000;n endnelse if(opcode=STO)n beginn inc_pc,load_acc,load_pc,rd=4b0000;n nwr,load_ir,datactl_ena,halt=4b0010;n endn else if ( opcode=ADD|opcode=ANDD|n opcode=XORR|opcode=LDA)n beginn inc

41、_pc,load_acc,load_pc,rd=4b0001;n wr,load_ir,datactl_ena,halt=4b0000;n endn elsen beginn inc_pc,load_acc,load_pc,rd=4b0000;n wr,load_ir,datactl_ena,halt=4b0000;n endn state=3b111;n endn3b111:/n beginn if( opcode=SKZ & zero=1 )n beginn inc_pc,load_acc,load_pc,rd=4b1000;n wr,load_ir,datactl_ena,halt=4b

42、0000;n endn elsen beginn inc_pc,load_acc,load_pc,rd=4b0000;n wr,load_ir,datactl_ena,halt=4b0000;n endn state=3b000;n endndefault:n beginn inc_pc,load_acc,load_pc,rd=4b0000;n wr,load_ir,datactl_ena,halt=4b0000;n state=3b000;n endnendcasenendnendtaskn/-end of task ctl_cycle-nendmodulen wr,load_ir,data

43、ctl_ena,halt=4b0000;n state=3b000;n endnendcasenendnendtaskn/-end of task ctl_cycle-nendmodule外围模块外围模块n为了对为了对RISC_CPU进行测试,需要有存储测试程序的进行测试,需要有存储测试程序的ROM和装载数据的和装载数据的RAM、地址译码器。地址译码器。1.1.地址译码器地址译码器module module addr_decodeaddr_decode( ( addraddr, , rom_selrom_sel, , ram_selram_sel););output output rom_selrom_sel, , ram_selram_sel; ;input 12:0 input 12:0 addraddr; ;regreg rom_selrom_sel, , ram_selram_sel; ;always always ( ( addraddr ) ) begin begin casexcasex( (addraddr) ) 13b1_1xxx_xxxx_x

温馨提示

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

评论

0/150

提交评论