




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十三章基于XilinxFPGA的微处理器13.1PicoBlaze架构介绍13.2指令设置13.3PicoBlaze文件结构本章小结
13.1PicoBlaze架构介绍
第六章详细介绍了通过RTL级代码描述的带数据路径的状态机,可以提供将时序逻辑转化成定制硬件电路的方法。如图13-1(a)所示,在ASMD状态图中,所有的组件包括寄存器的个数、输入输出路径、功能单元的数目和类型以及控制状态机,都可以根据目标应用来裁剪,其中数据路径可能包括多个功能单元和路径。图13-1FSMD状态图以及微控制器基本框图还有一种方法,就是在保持硬件不变的情况下,采用不同的定制软件指令来实现不同的应用。那么数据传输可以按照下面的步骤来执行:
(1)用固定配置模式来替换可定制数据路径。如图13-1(b)所示,数据寄存器和定制路径网络用寄存器文件替换。寄存器文件包括一定数目的寄存器以及两个读端口和一个写端口;可定制功能单元用算术逻辑单元(ArithmeticandLogicUnit,ALU)来替换。ALU仅仅执行设置和预定义功能。这样一来,执行寄存器传输就按照下面的格式来操作:
rd←r1opr2;
r1和r2为源寄存器地址,而rd为目的寄存器地址,op为可用的ALU函数。
(2)可以将定制状态机用可编程状态机来替换,如图13-1(b)下半部分所示。我们回忆一下状态机的功能:①状态寄存器时刻与当前状态有关;②输出逻辑输出哪个信号是由当前状态来决定的;③新状态是由下一状态逻辑决定的。那么如果采用可编程状态机修改这些状态机,则操作如下:
(1)用可编程的计数器来替换状态寄存器,计数器作为当前状态的控制路径。
(2)在状态机中,在每个状态都激活特定的输出信号来控制数据路径的操作,可编程状态机对这些输出操作进行编码,形成指令并存储在可编程存储器或称为指令存储器中。指令存储器的地址与可编程状态机的计数器相对应。在执行过程中,由指令存储器从程序计数器所指向地址取回执行码并解码产生控制信号,指令存储器和译码逻辑产生所有的输出逻辑电路。
(3)在状态机中,对下一个状态没有限制,只要有一个给定的状态,状态机可以根据输入条件跳转到任何可能的逻辑状态。在可编程状态机中,下一个状态往往是当前状态机的状态值加1,也就是说,是顺序逻辑执行。执行顺序如果被打乱,也是由某些指令的执行所导致的,比如jump跳转指令,这时程序计数器赋予了一个不同的值。
当用寄存器文件和ALU替换了数据路径,用可编程状态机替换了特定的状态机时,定制系统就变成了开发一系列新的顺序指令并装载到指令存储器中这么一个过程。这种结构也就是今天我们习惯的微处理器硬件平台。PicoBlaze微处理器也是基于这样的架构。13.1.1微处理器的应用
在带数据路径的状态机中,数据路径可以用来适应独立的应用需求。它可以包含多种定制功能单元和并行执行路径,并且能够在一个状态(通常为一个时钟周期内)完成复杂的运算。PicoBlaze微处理器在同一时刻只可以执行一条预定的命令操作(一条指令)。在很多情况下,相对于前者,如要完成同一任务,需要花费更多的指令和时间。许多任务用定制FSMD和微处理器都可以完成。可以通过对硬件复杂度、程序执行效率以及开发容易度三方面来评估使用哪一种方案。没有一定的原则去选择某一种方案。由于开发软件在很多情况下比开发可定制的FSMD状态机要容易的多,所以在对时序要求不严格的情况下通常选择微处理器开发。我们可以根据运算复杂度来判断可行性。PicoBlaze完成一条指令需要两个时钟周期。如果系统时钟为50MHz,那么在1秒钟可以执行25 × 106条指令,对于一个任务来说,可以判断该任务的请求执行频繁度以及完成任务的时间,来估计有效指令时间。比如,对于我们前面讲述的键盘接口程序,每1ms产生一个输入数据,并且在这1ms的时间间隔内需要完成数据处理,然而在1ms中,PicoBlaze可以完成25000条指令,所以如果所需要的数据处理能够用25000条指令完成,则可以用PicoBlaze来控制。通常情况下,微处理器适合许多非实时的I/O接口以及自我管理任务。13.1.2PicoBlaze处理器的特点
PicoBlaze是8位的精简微处理器,其特性如下:
(1) 8位数据位宽;
(2) 8位带进位和清零标志的ALU;
(3) 16个8位的通用寄存器;
(4) 64B的数据存储器;
(5) 18bit的指令位宽;
(6) 10bit的地址位宽,支持1024条指令;
(7) 31字深度堆栈;
(8) 256个输入端口和256个输出端口;
(9)每条指令执行时间为2个时钟周期;
(10)中断处理时间为5个时钟周期。
PicoBlaze处理器基于图13-1(b)所示架构,增加了一些增强功能,使得其用起来更加人性化。扩展的功能框图如图13-2所示。为了描述简洁,仅仅描述了主要流程图,主要存储器的大小都标注在分支上。处理器在原始的架构上增加的功能如下:
(1)增加了64字的数据存储器。该存储器用来存储处理器处理过程中的临时数据。需要注意的是,数据RAM和ALU之间没有直接的路径可以到达,如果数据要处理,则必须先被取回到寄存器中,然后存储到数据RAM中。
(2)有些指令增加了立即常数区,允许ALU或者其他操作中使用常数,而不是寄存器中的内容。如图13-2所示,在ALU的输入端口有一个2选1数据选择器,用来选择寄存器输出和常数。
(3)增加了31字的栈区,方便指令的跳转。在后面的章节中我们将详细讨论调用和返回指令的执行过程。
(4)增加了输入输出路径的额外数据。一个8位的port_id信号用来表示端口号,256个输入端口和256个输出端口都可以支持,第十五章将详细讨论I/O接口。
(5)增加了中断处理电路。中断机制将在第十六章详细讨论。图13-2PicoBlaze微处理器结构图13.1.3顶层HDL模型
在综合时,PicoBlaze系统由两个顶层HDL模块组成,如图13-3所示。KCPSM3模块是PicoBlaze处理器。其代表的意思是“Constant(K)CodedProgrammableStateMachine”,即常数可编程状态机,也是PicoBlaze处理器的原始定义。其输入输出端口定义如下:
(1) clk(input,1bit):系统时钟信号;
(2) reset(input,1bit):复位信号;
(3) address(output,10bit):指令存储地址;
(4) instruction(input,18bit):取指令;
(5) port_id(output,8bit):输入或者输出端口地址;
(6) in_port(input,8bit):输入数据I/O端口;
(7) read_storbe(output,1bit):输入操作选通信号;
(8) out_port(output,1bit):输出数据I/O端口;
(9) write_strobe(output,1bit):输出操作选通信号;
(10) interrupt(input,1bit):外围设备中断请求;
(11) interrupt_ack(output,1bit):应答外围设备中断请求。图13-3PicoBlaze的顶层模块13.1.4设计流程
当开发基于微处理器的嵌入式系统时,首先针对需要的功能选择“合适”的处理器。这里的“合适”,包括微处理器的处理能力、可用的I/O口的数目、开发难易程度等;另外,如果考虑一些特殊功能,则还需要选择一些具备特殊功能应用的ASIC处理器才可以。我们采用“软核”处理器的好处就在于在同一个FPGA系统中,可以将微处理器能够实现的功能实现;微处理不容易实现的特殊功能,也可以用硬件定制电路来实现。这样,为设计者提供了极大方便。因为一个大型的系统往往包含很多不同的任务,一般在FPGA上采用微处理器的设计原则是:将执行时序要求高的任务用硬件方式实现,而一些低速的I/O接口功能或者单独模块的任务在微处理器中执行。基于PicoBlaze微处理器开发的流程如图13-4所示,包含如下几个步骤:
(1)划分软硬件任务。
(2)开发软件部分的汇编程序。
(3)编译汇编程序,产生指令ROM,并且生成HDL语言可以调用的模块。
(4)进行软件指令的仿真。
(5)开发硬件部分的HDL代码。硬件部分包括针对特殊的I/O口的定制电路、时序要求严格的功能单元以及与PicoPlaze微处理器的接口单元等。
(6)创建包含PicoBlaze软核、指令集ROM以及所开发的硬件电路的软硬件系统顶层。
(7)开发TestBench,针对整个系统进行HDL仿真。
(8)综合编程代码到FPGA验证板上进行调试。
(9)整个系统综合之后,采用JTAG工具进行调试。图13-4PicoBlaze系统设计流程图 13.2指令设置
PicoBlaze总共有57条指令、5种指令形式。这里按照指令的操作属性将其分成如下7种指令:①逻辑指令;②运算指令;③比较测试指令;④移位和循环指令;⑤数据指令;⑥程序流程控制指令;⑦中断相关指令。
在本节中,首先介绍编程模型和指令格式,然后详细解释每条指令的用法。13.2.1编程模型
从汇编的角度来说,PicoBlaze包含16个8位的寄存器、64字节的数据RAM、三个标志位(清零、进位和中断)、程序计数器和堆栈指针。其编程模型(有时也称指令架构)如图13-5所示,当指令执行完之后,这些组件的内容被明确地或者隐含地修改掉。每条指令的操作后面将详细解释。图13-5PicoBlaze编程模型可以采用如下的伪标记对存储器组件和一些常数进行定义:
(1) sX,sY:分别代表16个通用寄存器,X和Y代表十六进制数值(从0到F)。
(2) pc:程序计数器。
(3) tos:堆栈的栈顶。
(4) c、z、i:进位、清零和中断标志。
(5) KK:8位常数数值或端口的id,常用十六进制数值表示。
(6) SS:6位常数数据存储器地址,通常用十六进制数值表示。
(7) AAA:10位常数指令存储器地址,通常用3个十六进制数值表示。13.2.2指令格式
在汇编程序中,依然沿用HDL编码的习惯,关键字用黑体表示,常数用大写字母表示。PicoBlaze指令包含如下5种格式:
(1) opsX,sY(寄存器—寄存器格式):op表示操作符,sX和sY为两个操作数,操作结果放在sX中。其操作过程简单表示如下:
sX←sXopsY
(2) opsX,KK(寄存器—常数格式):这与寄存器—寄存器模式类似,只是第二个操作数变为立即数。其执行操作过程如下:
sX←sXopKK
(3) opsX(单个寄存器模式):这种格式用在移位和循环指令操作中,仅有一个操作数。其执行操作过程如下:
sX← opsX;
(4) opAAA(单地址格式):这种指令用在跳转指令jump和调用指令call中,AAA表示指令存储器的地址。如果特殊情况发生,则AAA的值装载在程序计数器中。
(5) op(空操作运算符):这种格式常用在不需要进行任何操作时。
对于PicoBlaze来说,有两种编程工具,一种是Xilinx开发的KCPSM3,另外一种是Mediatronix开发的PBlazeIDE。两种开发环境不兼容,对一些指令采用了不同的伪指令。下面的章节中,将以KCPSM3开发环境为例来讲述指令应用,而将PBlazeIDE的开发环境下的伪指令表示方法在括弧中注明。13.2.3逻辑指令
有六种逻辑指令,包括与、或、异或、位等操作。逻辑指令可以用于寄存器之间或者寄存器与常数之间的逻辑操作。进位标志c通常被清除。清零标志z反映操作的结果。为了描述简单,这里举例来说明。
(1) andsX,sY:位与操作。
伪操作:sX←sX&SY;
c←0;
(2) andsX,KK:位与操作。
伪操作:sX←sX&KK;
c←0;
(3) orsX,sY:位或操作。
伪操作:sX←sX|sY;
c←0;
(4) orsX,KK:位或操作。
伪操作:sX←sX|KK;
c←0;
(5)xorsX,sY:位异或操作。
伪操作:sX←sX^sY;
c←0;
(6) xorsX,KK:位异或操作。
伪操作:sX←sX^KK;
c←0;13.2.4算术指令
PicoBlaze包括八条算术指令:带进位(不带进位)加法、带进位(不带进位)减法。进位标志c和清零标志z反映操作结果。详细解释如下:
(1) addsX,sY:不带进位加法。
伪操作:sX←sX+sY;
(2) addsX,KK:不带进位加法。
伪操作:sX←sX+KK;
(3) addcysX,sY:带进位加法。
伪操作:sX←sX+sY+c;
(4) addcysX,KK:带进位加法。
伪操作:sX←sX+KK+c;
(5) subsX,sY:不带进位减法。
伪操作:sX←sX-sY;
(6) subsX,KK:不带进位减法。
伪操作:sX←sX-KK;
(7) subcysX,sY:带进位减法。
伪操作:sX←sX–sY-c;
(8) subcysX,KK:带进位减法。
伪操作:sX←sX-KK-c;13.2.5比较和测试指令
1.比较指令
比较指令本身执行的是减法运算,结果由进位和清零标志反映,而不是存储在任何寄存器中。为了容易理解,下面举例说明:
(1) comparesX,sY(compsX,sX):比较两个寄存器的结果并置位标志位。
伪操作:ifsX==sYthenz←1elsez←0;
ifsX>sYthenc←1elsec←0;
(2) comparesX,KK(compsX,KK):比较寄存器和常数的结果,然后置位标志位。
伪操作:ifsX==KKthenz←1elsez←0;
ifsX>KKthenc←1elsec←0;
2.测试指令
测试指令执行“与”操作,其结果同样不会存储在任何寄存器中,而是直接通过标志位显示。如果结果为0,则清零位设置为1,结果同时反馈到8输入的异或电路中,则输出奇校验码。如果结果中1的数目为奇数,则进位标志设置为1。为了理解方便,下面详细说明:
(1) testsX,sY:测试两个寄存器,然后设置标志位。
伪操作: t←sX&sY;
if(t==0)thenz←1elsez←0;
c←t[7]^t[6]^…^t[0];
(2) testsX,KK:测试一个寄存器和常数,然后设置标志位。
伪操作: t←sX&KK;
if(t==0)thenz←1elsez←0;
c←t[7]^t[6]^…^t[0];13.2.6移位和循环指令
PicoBlaze包含四条左移指令、四条右移指令和两条循环指令。移位和循环指令都是单操作符,并且针对单寄存器操作。如图13-6所示为移位和循环指令的执行过程。下面举例来说明每条指令的用法:
(1) sl0sX:将寄存器值左移1bit,最低位补0。
伪操作:sX←{sX[6:0],0};
c←sX[7];
(2) sl1sX:将寄存器值左移1bit,最低位补1。
伪操作:sX←{sX[6:0],1};
c←sX[7];
(3) slxsX:将寄存器值左移1bit,最低位补sX[0]。
伪操作:sX←{sX[6:0],sX[0]};
c←sX[7];
(4) slasX:将寄存器值左移1bit,最低位补c。
伪操作:sX←{sX[6:0],c};
c←sX[7];
(5) sr0sX:将寄存器值右移1bit,最高位补0。
伪操作:sX←{0,sX[7:1]};
c←sX[0];
(6) sr1sX:将寄存器值右移1bit,最高位补1。
伪操作:sX←{1,sX[7:1]};
c←sX[0];
(7) srxsX:将寄存器值右移1bit,最高位补sX[0]。
伪操作:sX←{sX[0],sX[7:1]};
c←sX[0];
(8) srasX:将寄存器值右移1bit,最高位补c。
伪操作:sX←{c,sX[7:1]};
c←sX[0];
(9) rlsX:循环左移1bit。
伪操作:sX←{sX[6:0],sX[7]};
c←sX[7];
(10) rrsX:循环右移1bit。
伪操作:sX←{sX[0],sX[7:1]};
c←sX[0];图13-6移位和循环指令示意图13.2.7数据传输指令
在PicoBlaze中,运算是通过寄存器和ALU进行的。数据存储器RAM提供临时数据的存储,I/O端口提供与外设之间的接口。有5条指令用于寄存器、数据RAM、I/O口之间的数据传输。根据传输路径不同,这5条指令可以分为三类:
(1)寄存器之间传输指令:load指令。
(2)寄存器和数据RAM之间数据传输:fetch和store指令。
(3)寄存器和I/O口之间数据传输:input和output指令。
为了便于记忆和理解,下面用伪操作来详细解释每一条指令的操作。其中,RAM[]代表数据RAM的内容。注意在一些指令中,直接寻址指令(sY)表明sY寄存器内容被使用到。
(1) loadsX,sY:两个寄存器之间的数据传输。
伪操作:sX←sY;
(2) loadsX,KK:寄存器和常数之间的数据传输。
伪操作:sX←KK;
(3) fetchsX,(sY)(fetchsX,sY):从数据RAM将数据传输到寄存器中。
伪操作:sX←RAM[(sY)];
(4) fetchsX,SS:从数据RAM将数据传输到寄存器中。
伪操作:sX←RAM[SS];
(5) storesX,(sY)(storesX,sY):数据从寄存器传输到数据RAM中。
伪操作:RAM[(sY)]←sX;
(6) storesX,SS:数据从寄存器传输到数据RAM中。
伪操作:RAM[SS]←sX;
(7) inputsX,(sY)(insX,sY):从输入端口传输到寄存器中。
伪操作:port_id←sY;
sX←in_port:
(8) inputsX,KK(insX,sY):从输入端口传输到寄存器中。
伪操作:port_id←KK;
sX←in_port:
(9) outputsX,(sY)(outsX,sY):从寄存器传输到输出端口。
伪操作:port_id←sY;
out_port←sX;
(10) outputsX,KK(outsX,sY):从寄存器传输到输出端口。
伪操作:port_id←KK;
out_port←sX;13.2.8程序流程控制指令
在PicoBlaze处理器中,程序计数器代表取指令的地址。在默认情况下,程序执行指令存储器中的下一条指令。每条指令执行结束,程序计数器值自动加1。而jump、call、return指令可以给程序计数器置入新值,从而修改程序执行的流程。这些指令可以根据进位值和清零标记进行有条件或者无条件的跳转。
(1) jump指令:如果条件满足,可以置入新值到程序计数器,程序改变当前的执行流程,而从新的地址继续顺序执行。下面举例来说明。其中:OPR为10bit的指令存储器空间,pc是程序计数器。① jumpOPR:无条件跳转。
伪操作:pc←OPR;
② jumpc,OPR:如果进位标志置位,则跳转。
伪操作:if(c==1)then
pc←OPR
else
pc←pc+1;
③ jumpnc,OPR:如果进位标志没有置位,则跳转。
伪操作:if(c==0)thenpc←OPRelsepc←pc+1;
④ jumpz,OPR:如果清零标志置位,则跳转。
伪操作:if(z==1)thenpc←OPRelsepc←pc+1;
⑤ jumpnz,OPR:如果清零标志没有置位,则跳转。
伪操作:ifz==0thenpc←OPRelsepc←pc+1;
(2) call和return指令:用来执行软件功能。当函数被调用时,处理器终止当前操作跳转到新的函数去执行。当新的函数执行结束时,处理器重新返回到刚才终止的地方,然后继续执行。与jump执行相似,call指令在跳转条件成熟时同样也是给程序计数器装载新的值。另外,它在跳转之前会保护现场,会将当前程序执行产生的结果以及状态保存在一个特殊的缓冲器中—栈,然后才装载新的地址。在新函数的结束处需要包含return指令,这样才能保证正确返回原来跳出时的值。return指令的具体作用就是从栈中获取原来的执行地址,然后加1并装载到程序计数器中。具体的流程如图13-7所示。图13-7子程序调用流程图
PicoBlaze为了能够支持嵌套调用,允许函数中调用函数,采用栈缓冲器(后进先出)存储程序计数器的值。在这个缓冲器中,新调用的地址会保存到栈顶。如果该子函数没有调用其它函数,那么栈中压入的值就会首先出栈。PicoBlaze提供了31个字的栈空间,用来进行函数调用操作。
(3) call和return应用举例:
① callOPR:无条件调用子函数。
伪操作:tos←tos+1
STACK[tos]←pc;
pc←OPR;
② callc,OPR:如果进位标志有效,则跳转。
伪操作:if(c==1)thentos←tos+1
STACK[tos]←pc;
pc←OPR;
else
pc←pc+1;③ callnc,OPR:如果进位标志无效,则跳转。
伪操作:if(c==0)thentos←tos+1
STACK[tos]←pc;
pc←OPR;
else
pc←pc+1;
④ callz,OPR:如果清零标志有效,则跳转。
伪操作:if(z==1)thentos←tos+1
STACK[tos]←pc;
pc←OPR;
else
pc←pc+1;⑤ callnz,OPR:如果清零标志无效,则跳转。
伪操作:if(z==0)then
tos←tos+1
STACK[tos]←pc;
pc←OPR;
else
pc←pc+1;
⑥ return(ret):无条件返回。
伪操作:pc←STACK[tos]+1;
tos←tos-1;⑦ returnc(retc):如果进位标志有效,则返回。
伪操作:if(c==1)then
pc←STACK[tos]+1;
tos←tos-1;
else
pc←pc+1;
⑧ returnnc(retnc):如果进位标志无效,则返回。
伪操作:if(c==0)then
pc←STACK[tos]+1;
tos←tos-1;
else
pc←pc+1;⑨ returnz(retz):如果清零标志有效,则返回。
伪操作:if(z==1)then
pc←STACK[tos]+1;
tos←tos-1;
else
pc←pc+1;
⑩ returnnz(retnz):如果清零标志无效,则返回。
伪操作:if(z==0)then
pc←STACK[tos]+1;
tos←tos-1;
else
pc←pc+1;13.2.9中断相关指令
中断属于另外一种可以改变程序执行顺序的机制。和jump、call指令不同之处在于它是由外部设备引发的。当中断标志有效时,中断请求开始执行,PicoBlaze完成当前指令的执行,在栈中保存下一条指令的地址,保存进位清零标志,禁止中断标志,装载程序计数器值为3FF,即中断服务程序的起始地址。PicoBlaze有两个中断返回指令,用来从中断发生位置恢复过来,还有两条指令能够通过设置和清除中断标志位来使能和禁止中断请求。下面举例来说明中断操作指令:
(1) returnidisable(retidisable):从中断服务程序返回并禁止中断标志位。
伪操作:pc←STACK[tos];
tos←tos-1;
i←0;
c←保存c;
z←保存z;
(2) returnienable(retienable):从中断服务程序返回并使能中断标志位。
伪操作:pc←STACK[tos];
tos←tos-1;
i←1;
c←保存c;
z←保存z;
(3) enableinterrupt(eint):使能中断请求。
伪操作:i←1;
(4) disableinterrupt(dint):禁止中断请求。
伪操作:i←0;
注意:中断机制保存下一条指令的地址,当returni指令执行时,地址保存到栈的顶部。这一点和return是不一样的,在return中存储的是地址加1的值。13.2.10KCPSM3汇编宏命令
汇编宏命令表面上看,也就是汇编程序中的指令。然而它不是处理器能够执行的指令,而是用来帮助编程开发的指令。正如其名字一样,用来命令汇编程序执行特殊的任务。比如,定义一个常数或者重新分配地址空间等。KCPSM3汇编宏指令和PBlazeIDE汇编器在汇编命令上有所不同,下面举例说明。
1) KCPSM3汇编宏命令
(1) address:指下面的程序从指令ROM的某一指定位置开始执行。
比如:address3FF
(2) nemereg:为寄存器提供一个新的名称,使得代码更加容易描述。
比如:nemeregs5,index
(3) constant:用助记符赋值一个8位立即数,使得代码容易读。
比如:constantmax,F0
2) PBlazeIDE汇编器
(1) org:定义代码会被放在指令ROM的地址。
比如:org$3FF;
(2) equ:为了提高程序的可读性,用一个代号可以代表常数或者寄存器。
比如:MAXequ128
INDEXequs5;
(3) dsin,dsout,dsio:用一个符号来代表I/O端口的id号,对应的端口可以定义为输入、输出或者双向端口。与equ不同的地方在于仿真时,PBlazeIDE可以为其添加仿真输出端口,用以显示仿真结果。
比如:KEYBOARDdsin$0E;
SWITCHdsin$0F;
LEDdsout$16;
13.3
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 学校图书馆建设规划方案
- 2025年粮油机械项目投资可行性研究分析报告
- 2025-2030年中国筒装湿巾机项目投资可行性研究分析报告
- 电大国际私法对国际贸易的影响分析
- 2025-2030年中国输瓶行业深度研究分析报告
- 医药项目研究与开发合作协议
- 2025年幼儿园春季环保教育计划
- 2025年建筑铝挤压材合作协议书
- 年度团队建设活动方案及预算报告
- 2025年数字校园建设方案(二)
- 建筑垃圾商业计划书
- 2024年兰州市高三诊断考试(一诊)地理试卷(含答案)
- 小学中高年级语文整本书阅读教学策略
- 危化品运输安全应急救援演练
- 2024年青岛版数学五年级下册第一单元、第二单元测试题及答案(各一套)
- 自行车的力学知识研究报告
- 《高危药品管理》课件
- 脑梗动脉取栓护理查房课件
- 泊松过程与应用
- 密闭取芯完整
- 《会计分录》课件
评论
0/150
提交评论