版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于Verilog HDL 的专用处理器的设计与仿真葛文婧, 龚咏梅, 江立平(安徽师范大学 数学计算机科学学院,安徽芜湖,241000)关键词:Verilog HDL;专用处理器;设计;仿真照片尺寸为20mm*30mm;最好不用红色背景摘 要:随着对嵌入式系统研究的不断深入,专用处理器的针对性使其被广泛采用,这对嵌入式系统的运用和发展起到了越来越大的推动作用。本文采用Verilog HDL 来仿真能完成特定功能的专用处理器。论文讨论了包括CPU的系统结构设计、基本组成部件设计、指令系统设计和CPU的RTL级仿真在内的基于Verilog 状态机控制16位指令微处理器的设计。论文还讨论了电路功能
2、的仿真、综合以及实现过程,在Modelsim 的开发环境下对加法器的HDL程序进行仿真,并且根据仿真波形来验证设计的正确性。Design and Simulation of CPU based on Verilog HDLWenjing Ge, Yongmei Gong, Liping Jiang(School of Mathematic Computer Science , Anhui Nornal University, Wuhu, Anhui, 241000, China)Key words:Verilog HDL; CPU; Design; SimulationAbstract:As
3、the embedded systems research went into deeply nowdays, the dedicated-used processor was widely used for its pertinency ,which promoted the use and development of embedded system. The authors simulated and designed a dedicated-used processor based on the verilog HDL. The essay was composed of the de
4、sign of sixteen bits micro dedicated-used processor based on verilog states control machine, which included the designs of the Central Processing Units system structure, basic modules, instructions system ,and RTL level simulation of the dedicated-used processor . The simulation,synthesization,and r
5、ealization of the circuit function were also included in this essay.The summators HDL program was simulated in the environment of Modelsim and checked the correctness of the function of Central Processing Unit by the wave forms in the Modelsim.计算机的核心构件是处理器,处理器也是嵌入式系统中不可缺少的部分。根据处理的问题的不同,处理机可分为三类:通用处理
6、器、单用途处理器和专用处理器。专用处理器有着广泛的用途,这是因为专用处理器具有针对性,针对应用作了优化,性能、功耗等方面有了显著提高。专用处理器的设计可以给设计者创新的空间,设计出创新性的作品。Verilog HDL是一门硬件描述语言,是用于硬件设计的有利工具。 1 概述1.1 研究背景 目前许多的电子产品都使用了CPLD(复杂可编程逻辑器件),这些逻辑器可以使用硬件描述语言设计。Verilog HDL语言具有:设计的行为特性、设计的数据流特性、设计的结构组成及包含响应监控和设计验证方面的时延和波形产生机制1 。用Verilog HDL语言设计硬件也较为方便设计逻辑器件。1.2 功能的实现(1
7、)程序预先存储在程序存储器ROM中;(2)控制器CTRL根据程序计数器PC的值从ROM取指令到指令寄存器IR中,并对IR中的指令进行译码,产生控制信号,将控制信号发送给其它器件;(3)数据通路DP负责接收CTRL传送来的立即数、数据存储器RAM传送过来的操作数,存入寄存器组RF中的寄存器中;负责接收CTRL传送过来的运算指令,并组织算术逻辑单元ALU进行运算;负责将CTRL传送过来的立即数、寄存器中的操作数存入RAM中;(4)RAM可根据DP传送过来的地址和读写控制信号,进行数据读写。2 系统构成及功能模块的划分2.1 专用处理器的组成结构专用处理器的结构框图如图1,专用处理器主要有控制器和数
8、据路径两大部分构成,另外,为了配合专用处理器完成系统任务,还需要有程序存储器和数据存储器,前者用于存放程序指令的机器代码,后者用于存放计算结果。完整的模块划分如表1所示。图1 专用处理器的结构框图 Fig.1 The structure of the dedicated-used processor 2.2 系统的设计方法系统采用自顶向下的设计方法进行设计,顶层设计由专用处理器和存储器通过双向总线相连而构成,其中程序存储器与专用存储器的控制器通过总线进行交互信息,数据路径通过总线和数据存储器进行信息交互。表1 模块列表Table 1 List of modules模块编号 模块名称模块文件名模
9、块功能1dpdp.v数据路径,在控制器的控制下对数据进行相应的运算处理2alualu.v数据逻辑单元,完成算术运算或逻辑运算3registerregister.v寄存器,暂存立即数和中间结果4rfrf.v通用寄存器文件,存放指令所处理的立即数,并且可对寄存器文件中的任一寄存器进行读/写5mux21mux21.v二选一多路选择器,选择立即数或者寄存器数据6romrom程序存储器,存储程序代码7ctrctr.v控制器,提供控制信号8ramram.v数据存储器,实现数据的读写9div2fdiv2f.v分频器,除法时钟控制10cpucpu.v顶层系统cpu,将各个模块连接起来注:具体代码实现参见附录1
10、。2.3 指令系统该专用处理器支持如下指令:(1)数据传送指令将8位立即数传送给寄存器 mov rn,#imm;rn<-imm将8位寄存器数传送给寄存器mov rn,rm;rn<-rm将8位存储器数传送给寄存器mov rn,addr;rn<-addr将8位寄存器数传送给数据存储器mov addr,rn;addr<-rn(2)算术运算指令(不考虑溢出)8位整数加add rn,rm;rn<-rn+rm8位整数减sub rn,rm;rn<-rn-rm8位整数乘mul rn,rm;rn<-rn*rm8位整数除div rn,rm;rn<-rn/rm(3)控
11、制指令无条件跳转指令jmp relative;PC<-relative有条件跳转指令jz rn,relative;PC<-relative(仅当rn=0时)(4)停机指令halt指令系统设计如表2所示,寄存器编号如表3所示。表2 指令系统设计Table 2 The design of instruction system指令 操作码(4)寄存器(4)操作数(8)mov rn,#imm0000rnimmmov rn,rm0001rnimmmov rn,addr0010rnaddrmov addr,rn0011rnaddraddrn,rm0100rnrmsub rn,rm0101rnr
12、mmov rn,#imm0110rnrmdiv rn,rm0111rnrmjmp relative1000relativeJz rn,relative1001rnrelativehalt1111表3 寄存器编号Table 3 Register number寄存器 编号寄存器编号R00000R81000R10001R91001R20010R101010R30011R111011R40100R121100R50101R131101R60110R141110R70111R1511112.4 CTRL设计CTRL模块的状态图如图2所示。 图2 CTRL模块的状态图Fig.2 The modular s
13、tate graph of CTRL 其中:f1:Opcode=0000 f2:Opcode=0001 f3:Opcode=0010 f4:Opcode=0011 f5:Opcode=0100 f6:Opcode=0101 f7:Opcode=0110 f8:Opcode=0111f9:Opcode=1000 f10:Opcode=1001 f11:Opcode=1010 f12:Opcode=1011 f13:Opcode=1100 f14:Opcode=1101 f15 :Opcode=1110 f16:Opcode=11113 仿真验证3.1 仿真分析利用该专用处理器完成如下计算:分析得
14、其汇编代码和对应机器指令如下:MOV R0,#10;ROM0=16b0000_0000_0000_1010MOV 00H,R0;ROM1=16b0011_0000_0000_0000MOV R0,#0;ROM2=16b0000_0000_0000_0000MOV R1,00H;ROM3=16b0010_0001_0000_0000MOV R2,#1;ROM4=16b0000_0010_0000_0001NEXT:JZ R1,EXIT;ROM5=16b1001_0001_0000_1001ADD R0,R1;ROM6=16b0100_0000_0001_0000SUB R1,R2;ROM7=16
15、b0101_0001_0010_0000JMP NEXT;ROM8=16b1000_0000_0000_0101EXIT:MOV R1,00H;ROM9=16b0010_0001_0000_0000DIV R0,R1;ROM10=16b0111_0000_0001_0000MUL R0,R1;ROM11=160110_0000_0001_0000MOV 01H,R0;ROM11=16b0011_0000_0000_0001HATL;ROM12=16b1111_0000_0000_00003.2 仿真测试程序timescale 1ns/100psmodule test; parameter re
16、g_sel_width=4; parameter reg_width=8; parameter addr_width=8; reg start,clk,rst; wire reg_sel_width-1:0reg_sel; wire reg_width-1:0reg_out; wire alu_zero; wire wr_ram_out,cs_ram_out,rd_ram_out; wire addr_width-1:0addr_ram_out; cpu u0(clk,rst,start,reg_sel,reg_out,alu_zero,wr_ram_out,cs_ram_out,rd_ram
17、_out,addr_ram_out); always #20 clk=clk; initial begin clk=0;start=0;rst=1; #100; rst=0;start=1; end initial begin $monitor("reg_sel=%b,reg_out=%b,alu_zero=%b,wr_ram_out=%b,cs_ram_out=%b,rd_ram_out=%b,addr_ram_out=%b",reg_sel,reg_out,alu_zero,wr_ram_out,cs_ram_out,rd_ram_out,addr_ram_out);
18、endendmoduleModelSim仿真波形截图如图3所示,验证了该处理器实现预期功能。图3 ModelSim仿真波形截图Fig.3 The screenshot of ModelSim simulation waveform 4 总结通过此次功能简单专用处理器的设计体会到了Verilog HDL大型电路的设计方法,有不少的心得和体会。首先,确定专用处理器的体系结构及其组成部件;其次,设计希望该专用处理器达到什么预先的功能,由此并确定各个部件的功能,最后,合在一起能够达到总的需要功能;再者,设计该专用处理器的指令系统,最后编写相关的模块,通过一个实例(该实例能够包含其所有的指令系统所含有的
19、指令)进行测试,看能否正确的得出结果,若能则说明该处理机可以达到预期的功能。本次的设计方法采用自顶向下的设计方法,通过对基本部件的设计实现,进而实现大的模块,最后实现总的模块即CPU。 对于这个课题先用汇编语言描述(1+2+n)/n*n算法,再转化为机器码并存放在rom中。控制器部分ctrl使用状态机技术来实现。控制器从rom中取指令,指令有16位,即可表示为IR15:0。IR15:12这4位代表操作码。其中有loadi=4'b0000表示将立即数装入寄存器,在本次实验中,有将存储器中值送到寄存器的模块,为实现此功能,在控制模块中添加了load操作码load=4'b0010。相
20、应的再增加了几个状态,即State_Load=6'b101001,State_Load2=6'b101010,State_Load3=6'b101011;接着具体实现这些新增的状态,如图4所示。图4 部分状态的代码Fig.4 The parts of status's codes 但是在这里遇到了问题:从ram中读数据要用到rd_ram,而原来的代码中没有用到rd_ram,只用到wr_ram(将数据写入ram中)。于是我们继续研究思考,开始用wr_ram<=0,后来找到问题根源后,于是添加了rd_ram这个信号,ctrl.v、cpu.v和test.v的相应
21、位置都做了信号添加。预想就是这样,应该没有问题,可是仿真时出问题了。前面1加到10结果是对的,为55,可是rom中mov R1,00H;div R0,R1;MUL R0,R1;MOV01H,R0这三条指令的结构为高阻态。既然前面10个数相加的结果是对的,说明添加的存储器数送到寄存器状态是对的。我们通过单步分析CPU的取指令、分析指令和执行指令的过程,发现第一个MOV R1,00H写进R1了,但是第二个MOV R1,00H也执行了,但是R1未得00H内的值。难道将存储器数送到寄存器在开始时可以,第二次就不可以了?如果按书上介绍的用立即数送到寄存器,再进行仿真。结果是对的,但是还是未解决我们的问题
22、。更深层进行分析和思考,想起老师以前说过时延问题,还有同步运行的问题。猜测可能是运行一段时间我们无法控制00H中的值进入R1。我们就对00H内重新赋值,即:MOV R2,#10 ;ROM0=16b0000_0010_0000_1010MOV 00H,R2;ROM1=16b0011_0010_0000_0000MOV R1,00H;ROM9=16b0010_0001_0000_0000此时仿真时,就出现我们想要的结果了。经过本次实验,我们知道了构造一个专用处理器需要用到程序存储器ROM、数据存储器RAM、指令寄存器IR、程序计数器PC、控制器CTRL、数据路径DP、算术逻辑单元ALU和寄存器文件
23、RF这些部件之间的相互协调工作。同时,通过单步执行,我们明白了时序的重要性,而且感受到了设计的艰辛,不断地测试修改,直到达到预期的效果。参考文献:1 贺敬凯. Verilog HDL数计设计教程M.西安:西安电子科技大学出版社,2010 附录一 代码模块编号1:test模块模块功能说明:CPU仿真输入信号说明:start,clk,rst,reg_sel。start为使CPU启动信号,clk时钟信号,reg_sel寄存器选择信号。输出信号说明:reg_out,alu_zero,wr_ram_out,cs_ram_out,rd_ram_out,addr_ram_outVerilog HDL代码:t
24、imescale 1ns/100psmodule test; parameter reg_sel_width=4; parameter reg_width=8; parameter addr_width=8; reg start,clk,rst; wire reg_sel_width-1:0reg_sel; wire reg_width-1:0reg_out; wire alu_zero; wire wr_ram_out,cs_ram_out,rd_ram_out; wire addr_width-1:0addr_ram_out; cpu u0(clk,rst,start,reg_sel,re
25、g_out,alu_zero,wr_ram_out,cs_ram_out,rd_ram_out,addr_ram_out); always #20 clk=clk; initial begin clk=0;start=0;rst=1; #100; rst=0;start=1; end initial begin $monitor("reg_sel=%b,reg_out=%b,alu_zero=%b,wr_ram_out=%b,cs_ram_out=%b,rd_ram_out=%b,addr_ram_out=%b",reg_sel,reg_out,alu_zero,wr_ra
26、m_out,cs_ram_out,rd_ram_out,addr_ram_out); endendmodule/*/模块编号2:cpu模块模块功能说明:顶层系统,它的功能就是将各个模块连接起来,形成一个整体,进而可以对该系统进行仿真验证。该模块在对下层元件实例化时,采用的是位置关联法。输入信号说明:clk, rst, start,为输入信号输出信号说明:reg_sel,alu_zero,reg_out, wr_ram_out, cs_ram_out, addr_ram_out为输出信号Verilog HDL代码:module cpu(clk,rst,start, reg_sel, reg_ou
27、t, alu_zero, wr_ram_out, cs_ram_out, rd_ram_out, addr_ram_out ); parameter reg_sel_width=4; parameter reg_width=8; parameter addr_width=8; parameter imm_width=8; parameter sel_rf_width=4; parameter sel_alu_width=4; parameter PC_width=8; parameter IR_width=16; input wire start,rst,clk; output wire re
28、g_sel_width-1:0reg_sel; output wire reg_width-1:0reg_out; output wire alu_zero; output wire wr_ram_out,cs_ram_out,rd_ram_out; output wire addr_width-1:0addr_ram_out; wire imm_width-1:0imm; wire sel_rf_width-1:0sel_rf; wire sel_alu_width-1:0sel_alu; wire sel_mux; wire f_wf,en_rf,en_reg,en_alu,en_imm;
29、 wire PC_width-1:0PC; wire ROM_en; wire IR_width-1:0IR; wire wr_ram,cs_ram,rd_ram; wire addr_width-1:0addr_ram; assign wr_ram_out=wr_ram,cs_ram_out=cs_ram,addr_ram_out=addr_ram,rd_ram_out=rd_ram; wire clk1,clk2; div2f divsion_frequence(clk,rst,clk1,clk2); dp datapth(rst,clk2, r_wf, en_rf, en_reg, en
30、_alu, en_imm, sel_rf, sel_alu,sel_mux,imm,alu_zero, reg_sel, reg_out ); rom rom_instruction(clk2,rst, ROM_en, IR, PC ); ram ram_data( clk1, rd_ram, wr_ram,cs_ram,addr_ram, reg_out, ); ctrl control(rst,start,clk1, alu_zero, r_wf, en_rf, en_reg, en_alu, en_imm, sel_rf, sel_alu,sel_mux,imm, PC,IR, ROM_
31、en, wr_ram,cs_ram, addr_ram, rd_ram );endmodule/*/模块编号3:alu模块模块功能说明:算术逻辑单元,实现算术逻辑运算,这里主要实现算术运算输入信号说明:clk,en,sel,in1,in2为输入信号。sel为选择功能,clk、en共同决定了out和alu_zero的输出时刻。输出信号说明:out,alu_zero为输出运算结果。Verilog HDL代码:module alu(clk,en,sel,in1,in2,out,alu_zero); parameter sel_width=4; parameter data_width=8; inpu
32、t wire en, clk; input wire sel_width-1:0 sel; input wire data_width-1:0 in1, in2; output reg data_width-1:0 out; output reg alu_zero; parameter THROUGH=4'b0000; parameter ZERO=4'b0001; parameter ADD=4'b0100; parameter SUB=4'b0101; parameter MUL=4'b0110; parameter DIV=4'b0111;
33、 always (posedge clk) begin if(en)case(sel)THROUGH:out=in1;ZERO:if(in1=0)alu_zero=1;elsealu_zero=0;ADD:out=in1+in2;SUB:out=in1-in2;MUL:out=in1*in2;DIV:out=in1/in2;endcase endendmodule/*/模块编号4:ctrl模块模块功能说明:控制器的主要功能是对输入的指令IR进行译码,然后产生数据路径各部件按指令要求进行操作所需要的控制信号。输入信号说明: rst,复位信号 start,开始信号 clk,时钟脉冲alu_zero
34、, alu零号输出 r_wf, ram读信号en_rf, 通用寄存器使能信号en_reg, 寄存器使能 en_alu, alu使能信号 en_imm, 立即数使能信号sel_rf, 通用寄存器选择信号sel_alu, alu算术类型选择信号sel_mux, 二路选择器选择信号imm, 立即数PC,指令计数IR,存放输入的指令输出信号说明:ROM_en, rom使能信号wr_ram, ram写信号cs_ram, ram片选信号addr_ram, 要写入/读取数所在的ram地址rd_ram ram读信号Verilog HDL代码:module ctrl( rst,start, clk,alu_ze
35、ro, r_wf, en_rf, en_reg,en_alu,en_imm, sel_rf, sel_alu, sel_mux, imm, PC, IR, ROM_en, wr_ram,cs_ram,addr_ram,rd_ram);parameter instruction_width=16; parameter sel_width=4; parameter data_width=8; parameter instruction_addr_width=8; parameter data_addr_width=8; input wire rst,start,clk; input wire al
36、u_zero; input wire instruction_width-1:0 IR; output reg r_wf,en_rf,en_reg,en_alu,en_imm; output reg sel_width-1:0 sel_rf,sel_alu; output reg sel_mux; output regdata_width-1:0 imm; output reginstruction_addr_width-1:0 PC; /Program Counter output reg ROM_en; output reg wr_ram,cs_ram,rd_ram; output reg
37、data_addr_width-1:0 addr_ram; parameter /state value State_Init=6'b000000, State_Start=6'b000001, State_Fetch=6'b000010, State_IncPC=6'b000011, State_Decode=6'b000100,State_Add=6'b001000,State_Add2=6'b001001,State_Add3=6'b001010,State_Add4=6'b001011,State_Add5=6
38、39;b001100,State_Sub=6'b001101,State_Sub2=6'b001110,State_Sub3=6'b001111,State_Sub4=6'b010000,State_Sub5=6'b010001,State_Mul=6'b010010,State_Mul2=6'b010011,State_Mul3=6'b010100,State_Mul4=6'b010101,State_Mul5=6'b010110,State_Div=6'b010111,State_Div2=6'
39、b011000,State_Div3=6'b011001,State_Div4=6'b011010,State_Div5=6'b011011,State_Jmp=6'b011100,State_Jz=6'b011101,State_Jz2=6'b011110,State_Jz3=6'b011111,State_Next=6'b100000,State_Done=6'b100001,State_Loadi=6'b100010,State_Loadi2=6'b100011,State_Loadi3=6'
40、b100100State_Store=6'b100101,State_Store2=6'b100110,State_Store3=6'b100111,State_Store4=6'b101000,State_Load=6'b101001,State_Load2=6'b101010,State_Load3=6'b101011;parameter state_reg_width=6; reg state_reg_width-1:0 state; parameter /operation code loadi=4'b0000, /mov
41、=4'b0001, load=4'b0010, store=4'b0011, add=4'b0100, sub=4'b0101, mul=4'b0110, div=4'b0111, jmp=4'b1000, jz=4'b1001, halt=4'b1111; parameter OPCODE_width=4; reg OPCODE_width-1:0 OPCODE; reg instruction_addr_width:0 address; reg sel_width-1:0 register; integer v
42、alue,value1,value2; always (posedge rst,posedge clk)Beginsel_mux=1'b1;en_rf=0;en_reg=0;en_alu=0;en_imm=0;ROM_en<=0; /ROM output controlling signalwr_ram<=0;cs_ram<=0;rd_ram=0; /RAM addr_ram<=0;if(rst)/resetbeginstate<=State_Init;PC<=0;$display("%t:.reset.",$time);ende
43、lse /normal workingbegincase(state)State_Init: /start workingbeginPC<=0;$display(".normal.");if(start=1'b1)begin state<=State_Start;$display(".start.");end elsebegin state<=State_Init; $display("#waiting for start#");endendState_Start: /Enable ROMbeginROM_e
44、n<=1;state<=State_Fetch;endState_Fetch: /fetch instructionbeginOPCODE<=IR15:12;register<=IR11:8;/rnaddress<=IR7:0;state<=State_IncPC;endState_IncPC: /PC=PC+1beginPC<=PC+1;state<=State_Decode;endState_Decode: /instrunction decodingbegincase(OPCODE)loadi:/mov rn,#imm:rn=imm sta
45、te<=State_Loadi;store:/mov addr,rn:addr=rn state<=State_Store;add: /add rn,rm:rn=rn+rmstate<=State_Add;sub: /sub rn,rm:rn=rn-rmstate<=State_Sub;mul:/mul rn,rm:rn=rn*rmstate<=State_Mul;div:/div rn,rm:rn=rn/rmstate<=State_Div;state<=State_Jmp;jz: /jz rn,relative:PC=relative iff rn
46、=0state<=State_Jz;load: state<=State_Load;halt: /halt:PC=haltstate<=State_Done;default:state<=State_Start;endcaseendState_Loadi: /load immediate operandbeginimm<=address;/imm=addressen_imm<=1;state<=State_Loadi2;endState_Loadi2:beginsel_mux<=0;en_alu<=1;sel_alu<=4'b
47、0000;state<=State_Loadi3;endState_Loadi3:beginen_rf<=1;r_wf<=0;sel_rf<=register; /rn=registerstate<=State_Next;endState_Add: /plusbeginsel_rf<=IR7:4; /rmen_rf<=1; /enable rfr_wf<=1; /fetch data from rmstate<=State_Add2;endState_Add2:beginen_reg<=1; state<=State_Add3;
48、endState_Add3:beginsel_rf<=register;/rnen_rf<=1; /enable rfr_wf<=1; /fetch data from rnstate<=State_Add4;endState_Add4:begin en_alu<=1; /enable alusel_alu<=4'b0100; /addstate<=State_Add5;endState_Add5:beginsel_rf<=register;/rn en_rf<=1; /enbale rfr_wf<=0; /put data
49、into rnstate<=State_Next;endState_Sub: /minusbeginsel_rf<=IR7:4; /rmen_rf<=1; /enable rfr_wf<=1; /fetch data from rmstate<=State_Sub2;endState_Sub2:beginen_reg<=1;state<=State_Sub3;endState_Sub3:beginsel_rf<=register; /rnen_rf<=1; /enable rfr_wf<=1; /fetch data from rns
50、tate<=State_Sub4; endState_Sub4:beginen_alu<=1; /enable alusel_alu<=4'b0101; /substate<=State_Sub5;endState_Sub5:beginsel_rf<=register; /rnen_rf<=1; /enable rfr_wf<=0; /put data into rnstate<=State_Next;endState_Mul: /timesbeginsel_rf<=IR7:4; /rmen_rf<=1; /enable rf
51、r_wf<=1; /fetch data from rm state<=State_Mul2;endState_Mul2:beginen_reg<=1;state<=State_Mul3;endState_Mul3:beginsel_rf<=register; /rnen_rf<=1; /enable rfr_wf<=1; /fetch data from rnstate<=State_Mul4;endState_Mul4:beginen_alu<=1; /enable alusel_alu<=4'b0110; /mulsta
52、te<=State_Mul5;endState_Mul5:beginsel_rf<=register; /rnen_rf<=1; /enable rfr_wf<=0; /put data into rnstate<=State_Next;endState_Div: /divbeginsel_rf<=IR7:4; /rmen_rf<=1; /enable rfr_wf<=1; /fetch data from rmstate<=State_Div2;endState_Div2:beginen_reg<=1;state<=State_Div3;endState_Div3:beginsel_r
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 利用黑箱法做的课程设计
- 会员管理系统课程设计
- 2024年度健身房与私人教练之间的服务合同3篇
- 21堂财富思维课程设计
- 合肥吊装工程课程设计
- 2024二手房产买卖合同范本
- 外贸仓库培训课程设计
- 体育课程设计论文
- 光与彩课程设计
- 2024村集体鱼塘承包合同
- 普通诊所污水、污物、粪便处理方案及周边环境情况说明
- 三新模式下物理教学的得与失课件
- 网络空间安全导论-西北工业大学中国大学mooc课后章节答案期末考试题库2023年
- 国开大学2023年01月23793《交流变频调速应用技术》期末考试答案
- 国开2023年春《理工英语3》机考网考期末复习资料参考答案
- SpaceClaim.中文教程完整版
- 膳食委员会及职责
- 220kV输电线路继电保护设计
- DB11 2007-2022城镇污水处理厂大气污染物排放标准
- 肠内营养(讲稿)
- 元音及字母组合发音规则
评论
0/150
提交评论