版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第二章SOPC开发流程及QuartusII的使用2.1 SOPC开发流程和开发工具2.2QuartusII操作基础2.3SOPC硬件开发实例2.4 创建NiosII系统模块2.5 设计优化2.6 编译2.7 编程下载第二章SOPC开发流程及QuartusII的使用2.11SOPC开发流程和开发工具SOPC设计包括硬件和软件两部分。硬件设计:主要基于QuartusII和SOPCBuilder。软件设计:基于NiosIIIDE。SOPC开发流程和开发工具SOPC设计包括硬件和软件两部分。2SOPC开发流程分析系统需求:在进行SOPC开发之前,首先必须确定系统的需求,如应用系统需求的计算性能、需要的带宽和吞吐量、需求的接口类型以及是否需求多线程的软件等。建立QuartusII工程:每个开发过程开始时都应建立一个工程,QuartusII是以工程的方式对设计过程进行管理。在工程中建立顶层模块文件.bdf相当于传统电路设计中的电路板(PCB)。定义和生成系统:在SOPCBuilder中添加需要的功能模块(NiosII及其标准外设模块),完成后生成一个系统模块。定制指令&定制外设逻辑:如果需要,用户可以定制指令和外设逻辑。(可参考第8章)自定义的功能模块:当设计中现有模块不能满足设计要求时,可设计自己的功能模块。并在顶层模块中使用;Altera的LPM模块:在QuartusII软件中包含了大量的Altera公司提供的LPM功能模块,相当于传统设计中除处理器以外的逻辑芯片(如74系列);
集成SOPC生成的系统到QuartusII工程:在顶层模块中,分别将SOPCBuilder生成的系统模块、LPM功能模块以及用户自定义功能模块添加到顶层模块中;连接各功能模块:将各个功能模块用连线连起来组成系统功能原理图。选择FPGA型号并进行管脚分配:为系统功能原理图选择芯片载体并为各个输入输出信号分配芯片的管脚;进行编译选项设置:设置编译选项,从而让编译器按照用户设定来进行编译;编译硬件系统生成配置文件sof:编译系统生成硬件系统的配置文件*.sof和*.pof。编译系统是一个非常复杂的过程,包括优化逻辑的组合、综合逻辑、适配FPGA、布线以及时序分析等步骤。下载配置文件到FPGA器件:将配置文件.sof下载到FPGA.设置软件运行硬件环境属性:设置好软件运行的硬件环境属性后,便可进行编译、链接和调试、运行程序。编译软件:对用户程序进行编译,生成可执行文件*.elf。ISS运行/调试:接下来在IDE的指令集仿真器(ISS)上仿真软件和运行/调试软件。在目标板上下载可执行软件到NiosII系统:将可执行文件.elf下载到RAM。在目标板上运行/调试软件:在目标板上反复调试软件。使用IDE编程工具烧写配置文件和软件代码:最后利用IDE的编程工具将配置文件烧写到FPGA的配置芯片或Flash,将可执行文件*.elf编程到Flash中。
SOPC开发流程分析系统需求:在进行SOPC开发之前,首先3QuartusII操作基础——QuartusⅡ软件的安装QuartusII操作基础——QuartusⅡ软件的安装4——QuartusⅡ软件的用户界面启动QuartusⅡ软件后默认的界面主要由标题栏、菜单栏、工具栏、资源管理窗口、编译状态显示窗口、信息显示窗口和工程工作区等部分组成。QuartusII操作基础——QuartusⅡ软件的用户界面启动Quartus5——QuartusⅡ软件的用户界面QuartusII操作基础标题栏中显示当前工程的路径和工程名。——QuartusⅡ软件的用户界面QuartusII操作基6——QuartusⅡ软件的用户界面QuartusII操作基础菜单栏主要由文件(File)、编辑(Edit)、视图(View)、工程(Project)、资源分配(Assignments)、操作(Processing)、工具(Tools)、窗口(Window)和帮助(Help)等下拉菜单组成。——QuartusⅡ软件的用户界面QuartusII操作基7——QuartusⅡ软件的用户界面QuartusII操作基础工具栏中包含了常用命令的快捷图标。——QuartusⅡ软件的用户界面QuartusII操作基8——QuartusⅡ软件的用户界面QuartusII操作基础资源管理窗口用于显示当前工程中所有相关的资源文件。——QuartusⅡ软件的用户界面QuartusII操作基9——QuartusⅡ软件的用户界面QuartusII操作基础工程工作区当QuartusⅡ实现不同的功能时,此区域将打开对应的操作窗口,显示不同的内容,进行不同的操作,如器件设置、定时约束设置、编译报告等均显示在此窗口中。——QuartusⅡ软件的用户界面QuartusII操作基10——QuartusⅡ软件的用户界面QuartusII操作基础编译状态显示窗口此窗口主要显示模块综合、布局布线过程及时间。——QuartusⅡ软件的用户界面QuartusII操作基11——QuartusⅡ软件的用户界面QuartusII操作基础信息显示窗口该窗口主要显示模块综合、布局布线过程中的信息,如编译中出现的警告、错误等,同时给出警告和错误的具体原因。——QuartusⅡ软件的用户界面QuartusII操作基12——QuartusⅡ的开发流程按照一般编程逻辑设计的步骤,利用QuartusⅡ软件进行开发可以分为以下四个步骤:(1)输入设计文件;(2)编译设计文件;(3)仿真设计文件;(4)编程下载设计文件。
QuartusII操作基础——QuartusⅡ的开发流程按照一般编程逻辑设计的步骤,利13——输入设计文件QuartusⅡ软件的输入法有:
1)原理图输入方式、
2)文本输入方式(如VHDL、VerilogHDL)
3)AHDL输入方式、
4)模块输入方式以及
5)第三方EDA工具产生的文件以及混合使用以上几种设计输入方法进行设计原理图输入法原理图输入法也称为图形编辑输入法,用QuartusⅡ原理图输入设计法进行数字系统设计时,不需要任何硬件描述语言的知识,在具有数字逻辑电路基本知识的基础上,利用QuartusⅡ软件提供的EDA平台设计数字电路或系统。QuartusII操作基础——输入设计文件QuartusⅡ软件的输入法有:Quartu141、原理图输入法-建立设计工程建立设计工程的方法如图示:新建工程选项新建工程第一页QuartusII操作基础1、原理图输入法-建立设计工程新建工程选项新建工程第一页151、原理图输入法-建立设计工程建立设计工程的方法图示:新建工程第二页新建工程第三页QuartusII操作基础1、原理图输入法-建立设计工程新建工程第二页新建工程第三页161、原理图输入法-建立设计工程建立设计工程的方法图示:新建工程第四页
新建工程第五页QuartusII操作基础1、原理图输入法-建立设计工程新建工程第四页新建工程第五172、原理图输入法-输入设计文件
1)新建工程之后,便可以进行电路系统设计文件的输入。选择file菜单中的New命令,弹出如图所示的新建设计文件类型选择窗口。QuartusII操作基础2)选择New对话框中的DeviceDesignfiles页下的BlockDiagram/SchematicFile,点击OK,打开下图所示的图形编辑器对话框,进行设计文件输入。2、原理图输入法-输入设计文件QuartusII操作基础18图形编辑器对话框2、原理图输入法-输入设计文件QuartusII操作基础图形编辑器对话框2、原理图输入法-输入设计文件Quartu192、原理图输入法-输入设计文件3)在图形编辑窗口中的任何一个位置双击鼠标,或点击
图中的“符号工具”
按钮,或选择菜单Edit下的InsertSymbol命令,弹出
如右图所示的元件选择窗口Symbol
对话框。元件选择窗口QuartusII操作基础2、原理图输入法-输入设计文件元件选择窗口Quartus202、原理图输入法-输入设计文件元件选择窗口QuartusII操作基础4)用鼠标点击单元库前面的加号(+),库中的元件符号以列表的方式显示出来,选择所需要的元件符号,该符号显示在Symbol对话框的右边,点击OK按钮,添加相应元件符号在图像编辑工作区中,连接原理图。2、原理图输入法-输入设计文件元件选择窗口Quartus212、原理图输入法-输入设计文件十六进制同步计数器的原理图如下:
QuartusII操作基础2、原理图输入法-输入设计文件QuartusII操作基础223、原理图输入法-优缺点:优点:1)可以与传统的数字电路设计法接轨,即使用传统设计方法得到电路原理图,然后在QuartusⅡ平台完成设计电路的输入、仿真验证和综合,最后下载到目标芯片中。
2)它将传统的电路设计过程的布局布线、绘制印刷电路板、电路焊接、电路加电测试等过程取消,提高了设计效率,降低了设计成本,减轻了设计者的劳动强度。缺点:
1)原理图设计方法没有实现标准化,不同的EDA软件中的图形处理工具对图形的设计规则、存档格式和图形编译方式都不同,因此兼容性差,难以交换和管理。
2)由于兼容性不好,性能优秀的电路模块的移植和再利用非常困难,难以实现用户所希望的面积、速度以及不同风格的综合优化
3)原理图输入的设计方法不能实现真实意义上的自顶向下的设计方案,无法建立行为模型,从而偏离了电子设计自动化最本质的涵义。QuartusII操作基础3、原理图输入法-优缺点:QuartusII操作基础23——编译设计文件QuartusⅡ编译器的主要任务是对设计项目进行检查并完成逻辑综合,同时将项目最终设计结果生成器件的下载文件。编译开始前,可以先对工程的参数进行设置。QuartusⅡ软件中的编译类型有全编译和分步编译两种。选择QuartusⅡ主窗口Process菜单下StartCompilation命令,或者在主窗口的工具栏上直接点击图标
可以进行全编译
全编译的过程包括分析与综合(Analysis&Synthesis)、适配(Fitter)、编程(Assembler)、时序分析(ClassicalTimingAnalysis)这4个环节,而这4个环节各自对应相应的菜单命令,可以单独分步执行,也就是分步编译。在设计的调试和优化过程中,可以使用RTL阅读器观察设计电路的综合结果。
QuartusII操作基础——编译设计文件QuartusⅡ编译器的主要任务是对设计项目24分步编译就是使用对应命令分步执行对应的编译环节,每完成一个编译环节,生成一个对应的编译报告。分步编译跟全编译一样分为四步:
1、分析与综合(Analysis&Synthesis):设计文件进行分析和检查输入文件是否有错误,对应的菜单命令是QuartusⅡ主窗口Process菜单下Start\StartAnalysis&Synthesis,对应的快捷图标是在主窗口的工具栏上的;
2、适配(Fitter):在适配过程中,完成设计逻辑器件中的布局布线、选择适当的内部互连路径、引脚分配、逻辑元件分配等,对应的菜单命令是QuartusⅡ主窗口Process菜单下Start\StartFitter;(注:两种编译方式引脚分配有所区别)
QuartusII操作基础分步编译就是使用对应命令分步执行对应的25
3、编程(Assembler):产生多种形式的器件编程映像文件,通过软件下载到目标器件当中去,应用的菜单命令是QuartusⅡ主窗口Process菜单下Start\StartAssembler;
4、时序分析(ClassicalTimingAnalyzer)
:计算给定设计与器件上的延时,完成设计分析的时序分析和所有逻辑的性能分析,菜单命令是QuartusⅡ主窗口Process菜单下Start\StartClassicalTimingAnalyzer,对应的快捷图标是在主窗口的工具栏上的。
编译完成以后,编译报告窗口CompilationReport会报告工程文件编译的相关信息,如编译的顶层文件名、目标芯片的信号、引脚的数目等等。全编译操作简单,适合简单的设计。对于复杂的设计,选择分步编译可以及时发现问题,提高设计纠错的效率,从而提高设计效率。QuartusII操作基础QuartusII操作基础26
5、RTL阅读器:在设计的调试和优化过程中,可以使用RTL阅读器观察设计电路的综合结果,同时也可以观察源设计如何被翻译成逻辑门、原语等。
RTL阅读器是观察和确定源设计是否实现了设计要求的理想工具。执行仿真验证设计功能之前使用RTL阅读器查找设计中的问题,可以在设计早期发现问题,为后期的验证工作节省时间。当设计通过编译后,选择QuartusⅡ主窗口Tools菜单下NetlistViewers\RTLViewer命令,弹出RTL阅读器窗口QuartusII操作基础5、RTL阅读器:在设计的调试和优化过程275、RTL阅读器
RTL阅读器窗口图QuartusII操作基础RTL阅读器窗口的右边,是过程设计结果的主窗口,包括设计电路的模块和连线5、RTL阅读器QuartusII操作基础RT285、RTL阅读器
RTL阅读器窗口图QuartusII操作基础RTL阅读器的左边是层次列表,在每个层次上以树状形式列出了设计电路的所有单元。层次列表的内容包括以下几个方面:(1)实例Instances,能够被展开成低层次模块或实例;(2)原语Primitives,不能被展开为任何低层次模块的低层次节点;(3)引脚Pin,当前层次的I/O端口,如果端口是总线,也可以将其展开,观察到端口中每一个端口的信号;(4)网线Net,是连接节点的连线,当网线是总线时也可以展开,观察每条网线。5、RTL阅读器QuartusII操作基础RT295、RTL阅读器双击结构图中的实例,可以展开此模块的下一级结构图
QuartusII操作基础5、RTL阅读器QuartusII操作基础30——仿真设计文件仿真的目的就是在软件环境下,验证电路的行为和设想中的是否一致。
FPGA/CPLD中的仿真分为功能仿真和时序仿真。功能仿真着重考察电路在理想环境下的行为和设计构想的一致性,时序仿真则在电路已经映射到特定的工艺环境后,考察器件在延时情况下对布局布线网表文件进行的一种仿真。仿真一般需要建立波形文件、输入信号节点、编辑输入信号、波形文件的保存和运行仿真器等过程。QuartusII操作基础——仿真设计文件仿真的目的就是在软件环境下,验证电路的行为311、建立波形文件波形文件用来为设计产生输入激励信号。利用
QuartusII波形编辑器可以创建矢量波形文件(.vwf)创建一个新的矢量波形文件步骤如下:(1)选择QuartusⅡ主界面
File菜单下的New命令,弹出新建对话框;
QuartusII操作基础1、建立波形文件QuartusII操作基础32(2)在新建话框中选择
OtherFiles标签页,从中选择
VectorWaveformFile,点击OK按钮,则打开一个空的波形编辑器窗口。(2)在新建话框中选择OtherFiles标签页,从中331、建立波形文件
波形编辑器窗口:主要分为信号栏、工具栏和波形栏。QuartusII操作基础1、建立波形文件QuartusII操作基础342、输入信号节点
(1)在波形编辑方式下,执行Edit菜单中的InsertNodeorBus命令,或者在波形编辑器左边Name列的空白处点击鼠标右键,弹出的InsertNodeorBus对话框
QuartusII操作基础2、输入信号节点QuartusII操作基础352、输入信号节点
(2)点击InsertNodeorBus对话框中的NodeFinder…按钮,弹出NodeFinder窗口,在此窗口中添加信号节点。QuartusII操作基础2、输入信号节点QuartusII操作基础363、编辑输入信号编辑输入信号是指在波形编辑器中指定输入节点的逻辑电平变化,编辑输入节点的波形。在仿真编辑窗口的工具栏中列出了各种功能选择按钮,主要用于绘制、编辑波形,给输入信号赋值。具体功能如下::在波形文件中添加注释;:修改信号的波形值,把选定区域的波形更改成原值的相反值;:全屏显示波形文件;:放大、缩小波形;:在波形文件信号栏中查找信号名,可以快捷找到待观察信号;:将某个波形替换为另一个波形;:给选定信号赋原值的反值;:输入任意固定的值;:输入随机值:给选定的信号赋值,X表示不定态,0表示赋0,1表示赋1,Z表示高阻态,W表示弱信号,L表示低电平,H表示高电平,DC表示不赋值。QuartusII操作基础3、编辑输入信号QuartusII操作基础373、编辑输入信号:设置时钟信号的波形参数,先选中需要赋值的信号,然后鼠标右键点击此图标弹出Clock对话框,在此对话框中可以设置输入时钟信号的起始时间(StartTime)、结束时间(EndTime)、时钟脉冲周期(Period),相位偏置(Offset)以及占空比。:给信号赋计数值,先选中需要赋值的信号,然后鼠标右键点击此图标弹出如下图所示的CountValue对话框,然后赋值。CountValue对话框的Counting页CountValue对话框的Timing页QuartusII操作基础3、编辑输入信号CountValue对话框的Count384、仿真波形文件
QuartusⅡ软件中默认的是时序仿真,如果进行功能仿真则需要先对仿真进行设置,步骤如下:(1)选择QuartusⅡ主窗口Assignments菜单下的Settings…命令,可以进入参数设置页面,如下图所示,然后单击SimulationSettings,在右边的对话框中的Simulationmode中选择“Function”;
QuartusII操作基础4、仿真波形文件QuartusII操作基础394、仿真波形文件(2)选择QuartusⅡ主窗口Processing菜单下的GenerateFunctionalSimulationNetlist命令,生成功能仿真网表文件;(3)选择QuartusⅡ主窗口Processing菜单下的StartSimulation进行功能仿真。功能仿真满足要求后,还要对设计进行时序仿真,时序仿真可以在编译后直接进行,但是要将上图中的Simulationmode中设置为“Timing”,设置好以后直接选择StartSimulation命令,执行时序仿真。QuartusII操作基础4、仿真波形文件QuartusII操作基础40——编程下载设计文件对设计进行验证后,即可对目标器件进行编程和配置,下载设计文件到硬件中进行硬件验证。
QuartusⅡ编程器Programmer最常用的编程模式是JTAG模式和主动串行编程模式AS。
JTAG模式主要用在调试阶段,主动串行编程模式用于板级调试无误后将用户程序固化在串行配置芯片EPCS中。
QuartusII操作基础——编程下载设计文件对设计进行验证后,即可对目标器件进行编程41编程下载对话框1、JTAG编程下载模式QuartusII操作基础1)、选择QuartusⅡ主窗口的Tools菜单下的Programmer命令或点击图标,进入器件编程和配置对话框。如果此对话框中的HardwareSetup后为“NoHardware”,则需要选择编程的硬件。点击HardwareSetup,进入HardwareSetup对话框,在此添加硬件设备。此方式的操作步骤主要分为3步:编程下载对话框1、JTAG编程下载模式QuartusII42编程下载对话框1、JTAG编程下载模式QuartusII操作基础2)、配置编程硬件后,选择下载模式,在Mode中指定的编程模式为JTAG模式;编程下载对话框1、JTAG编程下载模式QuartusII43编程下载对话框1、JTAG编程下载模式QuartusII操作基础3)、确定编程模式后,单击添加相应的counter.sof编程文件,选中counter.sof文件后的Program/Configure选项,然后点击图标下载设计文件到器件中,Process进度条中显示编程进度,编程下载完成后就可以进行目标芯片的硬件验证了。编程下载对话框1、JTAG编程下载模式QuartusII44AS主动串行编程式的操作步骤如下:(1)选择QuartusⅡ主窗口Assignments菜单Device命令,进入Settings对话框的Device页面进行设置,如右图。2、AS主动串行编程模式QuartusII操作基础AS主动串行编程式的2、AS主动串行编QuartusII操452、AS主动串行编程模式(2)选择QuartusⅡ主窗口的Tools菜单下的Programmer命令或点击图标,进入器件编程和配置对话框,添加硬件,选择编程模式为ActiveSerialProgram;(3)单击添加相应的counter.pof编程文件,选中文件后的Program/Configure、Verify和BlankCheck项,单击图标下载设计文件到器件中,Process进度条中显示编程进度。下载完成后程序固化在EPCS中,开发板上电后EPCS将自动完成对目标芯片的配置,无须再从计算机上下载程序。
QuartusII操作基础2、AS主动串行编程模式QuartusII操作基础46——QuartusⅡ中宏功能模块的调用方法使用QuartusⅡ软件的MegaWizardPlug-InManager中的宏功能模块可以帮助用户调用QuartusⅡ内部已有的IP(知识产权)核来完成一些复杂系统的设计,并可以方便的对调用的IP核的参数进行修改。下面以一个调用lpm_counter宏功能模块来实现一个十六进制的加法同步计数器为例,简单介绍宏功能模块的使用。设计开始前新建立一个名为counter16的工程,在工程中新建一个新的bdf文件,选择QuartusⅡ主窗口的Tools菜单下的MegaWizardPlug-InManager命令,进入MegaWizardPlug-InManager对话框第一页,然后依此进行参数的设定,具体的流程如图所示:QuartusII操作基础——QuartusⅡ中宏功能模块的调用方法QuartusI47MegaWizardPlug-InManager第一页QuartusII操作基础MegaWizardPlug-InManager第一页48MegaWizardPlug-InManager第二页MegaWizardPlug-InManager第三页QuartusII操作基础MegaWizardPlug-InManager第二页49MegaWizardPlug-InManager第四页MegaWizardPlug-InManager第五页QuartusII操作基础MegaWizardPlug-InManager第四页50MegaWizardPlug-InManager第六页MegaWizardPlug-InManager第七页QuartusII操作基础MegaWizardPlug-InManager第六页51SOPC硬件开发实例例子:设计一个电子钟第一步是要进行需求分析,根据这个要求来建立硬件系统。电子钟的设计要求:在液晶屏上显示日期、时间;可以设置日期、时间;SOPC硬件开发实例例子:设计一个电子钟52SOPC硬件开发实例根据系统要求,电子钟的设计要用到的外围器件有:LCD:电子钟显示屏幕;按键:电子钟设置功能键;Flash存储器:存储软、硬件程序;SRAM存储器:程序运行时将其导入SRAM。根据所要用到的外设、要实现的功能以及开发板的配置,在SOPCBuilder中建立系统要添加的模块包括:NiosIICPU、定时器、按键PIO、LCD控制器、AVALON三态桥、外部RAM接口、外部Flash接口。使用的开发环境如下:WinXP操作系统NiosII6.0嵌入式处理器QuartusII6.0基于CycloneII的SOPC开发板SOPC硬件开发实例根据系统要求,电子钟的设53SOPC硬件开发实例创建工程进行完需求分析之后,进行硬件系统的创建。首先必须建立一个QuartusII的工程,步骤如下:1.开始->程序->AlteraQuartusII6.1QuartusII6.1(32bit),启动QuartusII软件;SOPC硬件开发实例创建工程54SOPC硬件开发实例2.选择File菜单NewProjectWizard,出现Introduction页面,该页面介绍所要完成的具体任务,点击next。SOPC硬件开发实例2.选择File菜单NewProje55SOPC硬件开发实例3.进行项目名称的设定、工作目录的选择。指定工程存放的目录,工程名和顶层实体名,工程名和顶层实体名要求相同,工程目录可以随意设置,但必须是英文的目录,工程名和顶层实体名也要求是英文名字,我们的工程名和顶层实体名为clock,选择Next。SOPC硬件开发实例3.进行项目名称的设定、工作目录的选择56SOPC硬件开发实例4.可以为工程添加先期已经输入的设计文件,指定用户自定义的元件库的路径,这里我们没有事先输入好的文件,也没有自定义的元件库,点击Next进入下一步。SOPC硬件开发实例4.可以为工程添加先期已经输入的设计文件57SOPC硬件开发实例5.用户指定目标器件,根据开发板的所使用的器件来选择,实际开发中,通过查看核心板的参考手册来获取所使用的器件具体型号,可以使用窗口右边的Filters来加快器件的选择,选择完毕点击Next。SOPC硬件开发实例5.用户指定目标器件,根据开发板的所使58SOPC硬件开发实例6.指定在QuartusII之外的用于,设计输入、综合、仿真、时序分析的第三方EDA工具,QuartusII对第三方工具的支持比较完善。这里我们不做选择,直接点击Next。SOPC硬件开发实例6.指定在QuartusII之外的59SOPC硬件开发实例所见新工程的信息,确认所创建工程的主要信息,点击Finish完成工程的建立,在开发的过程中,还可以通过菜单assignmentSettings来对这些配置进行修改。点击Finish按钮,QuartusII自动会打开这个工程,可以看到顶层实体名出现在工程导航窗口中。SOPC硬件开发实例所见新工程的信息,确认所创建工程的主要信60SOPC硬件开发实例SOPC硬件开发实例61创建NiosII系统模块创建完成工程之后,需要创建顶层实体。创建完顶层设计文件之后,使用SOPCBuilder创建NIOSII嵌入式处理器,添加、配置系统的外设IP,组成NiosII系统模块。NiosII系统模块设计完成之后要加入到该顶层实体中,然后进行其他片上逻辑的开发。一、创建顶层实体(1)新建的工程窗口中,选择FileNew;(2)在DeviceDesignFile页中,选择BlockDiagram/SchematicFile,即原理图文件,也可以选择硬件描述语言的文件形式。单击OK。(3)出现一个模块编辑窗口。创建NiosII系统模块创建完成工程之后62创建NiosII系统模块创建NiosII系统模块63创建NiosII系统模块(4)选择FileSaveAs,出现SaveAs对话框,显示的目录为之前设置的工程目录,文件名为之前设置的顶层实体名(由于这是工程的第一个文件,系统会默认为顶层设计实体的名字)。确定AddtoCurrentProject选项被选中,点击Save文件被保存并被加入到工程中。创建NiosII系统模块(4)选择FileSave64创建NiosII系统模块二、创建NiosII系统模块创建NIOSII系统模块需要使用SOPCBuilder,它是QuartusII中的一个工具,使用SOPCBuilder可以创建一个NiosII系统模块,或者创建多主设备SOPC模块。一个完整NiosII的系统模块包括NiosII处理器和相关的系统外设。所以创建系统模块的流程是先创建一个系统,然后添加NiosIICPU和外设IP,然后进行相应的设置,最后生成实例,然后将其加入到工程的顶层实体中去。创建NiosII系统模块二、创建NiosII系统模块65创建NiosII系统模块(一)、创建系统启动SOPCBuilder,选择ToolsSOPCBuilder,出现下图所示的CreateNewSystem对话框。键入系统的名字,选择硬件描述语言Verilog或者是VHDL。单击OK按钮后,出现SOPCBuider系统模块设计窗口。创建NiosII系统模块(一)、创建系统单击OK按钮后66创建NiosII系统模块用户需要设置系统的时钟频率,该频率用于计算硬件和软件开发中的定时,比如时钟分频或波特率。这里我们设成85MHz,还可以选择是否选用流水线。(二)、设置系统主频和指定目标FPGA
在Target栏中的Board部分指定我们这本书使用的核心开发板——CycloneII(EP2C35)。也可以在Board部分选择Unspecified,然后在DeviceFamily选择CycloneII。创建NiosII系统模块用户需要设置系统的时钟频率,该频67创建NiosII系统模块(三)、加入NiosIICPU和IP模块
首先加入NiosII软核,NiosII是软核CPU,共有三种类型的CPU可供选择:NiosII/e(经济型)、NiosII/s(标准型)和NiosII/f(快速型)。用户可以根据实际的情况进行选择。NiosII是一个用户可以自行进行定制的CPU,用户可以增加新的外设、新的指令等。添加NiosIICPU的步骤如下:1.在上图“SOPCBuider系统模块设计窗口”AvalonComponents下面选择NiosIIProcessor;2.点击Add,出现NiosIICPU的配置向导,共有三种类型的CPU可供选择;创建NiosII系统模块(三)、加入NiosIICP68创建NiosII系统模块根据需要选择相应的一种NiosII核,我们选择标准型的NiosII核,HardwareMultiply选择none,不选择HardwareDivide点击Next,进入Caches&TightlyCoupledMemories设置窗口;创建NiosII系统模块根据需要选择相应69创建NiosII系统模块设置NiosII的Cache和与CPU直接相连的存储器端口(不通过Avalon总线),选择InstructionCache为4Kbytes,不选中Includetightlycoupledinstructionmasterport(s),点击Next进入AdvancedFeatures设置页面。创建NiosII系统模块设置NiosI70创建NiosII系统模块
AdvancedFeatures的设置页面是QuartusII6.1版本才有的设置,这里不选择Includecpu_resetrequestandcpu_resettakensignals点击Next进入JTAGDebugModule设置。创建NiosII系统模块Advance71创建NiosII系统模块共有4个调试级别可供选择,这里选择Level1即可,该级别支持软件的断点调试。JTAG调试模块要占用较多的逻辑资源,如果整个系统调试完毕了可以选用NoDebugger以减少系统占用资源点击Next进入自定义指令的设置。因为本例不用到任何的自定义指令,这里不作任何的设置,点击Finish完成CPU模块的添加。创建NiosII系统模块共有4个调试级别72创建NiosII系统模块创建NiosII系统模块73创建NiosII系统模块除了NiosIICPU,电子钟设计需要添加的IP模块包括:TimerButtonPIOLCD控制器ExternalRAMBusExternalFlashBusExternalRAMinterfaceExternalFlashInterface创建NiosII系统模块除了NiosIICPU,电子74创建NiosII系统模块
1.添加定时器定时器和NiosIICPU一样,用户可以对其进行定制。添加定时器的步骤如下:(1)在Avaloncomponents下的other库中选择IntervalTimer并单击Add,Avalon_Timer-timer_0的向导窗口出现;(2)配置定时器,点击Finish,完成定时器的添加。(3)可以对Timer进行重命名,我们这里取缺省的名字。创建NiosII系统模块1.添加定时75创建NiosII系统模块
2.添加ButtonPIO(1)在Avaloncomponents下的other下选择PIO,单击Add,出现AvalonPIO-PIO_0的向导;(2)在BasicSettings页中,设置width=4bits,direction为InputPortsOnly;创建NiosII系统模块2.添加Bu76创建NiosII系统模块(3)在InputOptions页中,在EdgeCaptureRegister下选中SynchronouslyCapture,然后选择EitherEdge;(4)在Interrupt下选中GenerateIRQ,然后选择Edge;(5)点击Finish,返回到AlteraSOPCBuilderNIOS2的窗口;(6)右键单击ModuleName下的pio_0,从菜单选择rename,重命名为button_pio.创建NiosII系统模块(3)在InputOpti77创建NiosII系统模块
3.添加LCD控制器(1)在“SOPCBuider系统模块设计窗口”的左侧的Avaloncomponents下的display库中选择CharacterLCD(162,Optrex16027),单击Add;(2)ModuleName下出现,lcd_16027_0;(3)将其重命名lcd_display。创建NiosII系统模块3.添加LC78
4.添加外部RAM接口(1)Avaloncomponents下的Memory下面选择CypressCY7C1380CSSRAM,单击Add,出现SSRAM(CypressCY7C1380C)-ext_ssram的向导;(2)在TimingParameters下面设置ReadLatency为2clocks,在SSRAM下面设置MemorySize为2Mbytes(3)单击Finish,返回到AlteraSOPCBuilderNIOS2的窗口;(4)右键单击ModuleName下的ssram_0,从菜单选择rename,重命名为ext-ssram。4.添加外部RAM接口79
5.添加外部闪存接口(1)在Avaloncomponents下的Memory下面选择FlashMemory(CommonFlashInterface),单击Add,出现外部闪存接口向导;(2)在Attributes页中,可以在Presets列表中选择相应的闪存的接口,这些闪存的接口都是经过测试的,如果列表中没有,用户可以自己定义闪存的Size和DataWidth;创建NiosII系统模块5.添加外部闪存接口创建NiosII系统模块80
(3)在timing页中,可以设置闪存的读写时序要求,可以设置Setup,Waite,hold时间等参数,通常保留缺省的设置;(4)如应用选择的闪存接口不在列表中,需要自己定义Size和DataWidth,和时序要求;(5)点击Finish,返回到AlteraSOPCBuilderNIOS2的窗口,ModuleName出现cfi_flash_0,对其重命名为ext_flash。创建NiosII系统模块(3)在timing页中,可以设置闪存的读写时序要求,可81
6.添加外部RAM总线和外部flash总线(Avalon三态总线桥)为了使NiosII系统能与开发板上的外部存储器通信,必须在Avalon总线和外部存储器之间加入Avalon三态桥。步骤如下:(1)在Bridge下,选择AvalonTri-StateBridge,点击Add,出现AvalonTri-StateBridge–tri_state_bridge_0向导;(2)Registered选项默认为选中;(3)单击Finish,返回到AlteraSOPCBuilderNIOS2的窗口;(4)将其重命名为ext_ssram_bus;(5)重复前三个步骤,在添加一个Avalon三态总线桥,并重命名为ext_flash_bus.6.添加外部RAM总线和外部flash总线(Avalo82
7.添加JTAGUART(1)在Avaloncomponents下的Communication下选择JTAGUART,点击ADD,出现添加向导。(2)按照缺省设置,点击Finish。(3)将其重命名为JTAG_UART.8.NiosII系统的连接主要是外部RAM接口要和RAM的三态桥连接,外部的Flash接口要和flash的三态桥连接。所有添加的IP连接都是系统自动完成的,除了上面提到的三态桥和外部存储器的接口的连接之外,其它的连接用户不用修改,但对于三态桥和外部存储器接口的连接,系统的自动连接可能和用户的开发板不匹配,用户需要进行手动的更改。针对我们所用的开发板的情况进行的设置,因为本书用到的开发板外部的SRAM和外部的Flash没有使用共用的数据线和地址线,所以必须为它们分别添加一个三态桥。创建NiosII系统模块7.添加JTAGUART创建NiosII系统模块83创建NiosII系统模块创建NiosII系统模块84三、分配IP模块的地址和中断号在以上添加IP的过程中,SOPCBuilder为各个IP模块分配了一个默认的基地址,用户可以改变这些默认的分配。如果用户自己分配的地址出现冲突,SOPCBuilder会给出警告,用户可以按照下面的步骤来进行分配和解决地址冲突问题。创建NiosII系统模块三、分配IP模块的地址和中断号创建NiosII系统模块85下面我们给出一种自定义的地址分配实例,将闪存的基地址设定为0x00000000,步骤如下:(1)单击Flash外设的Base栏,将地址改为0x0,然后回车,这时SOPCBuilder的消息框中出现错误的提示信息,这是因为闪存的地址和其它的外设地址发生了冲突。(2)选择Module菜单中的LockBaseAddress操作,一个挂锁的图标出现在闪存基地址的旁边。(3)选择System菜单中的AutoAssignBaseAddress操作,来解决外设的地址分配冲突问题,SOPCBuilder调整其它外设的地址来避开与闪存地址的冲突,错误提示的消息就会消失了。(4)用户可以手动修改各个外设的中断号,中断号越低,中断优先级越高,用户也可以采用自动分配中断号,选择System菜单中的AutoAssignIRQs,但SOPCBuilder不处理软件操作,采用自动分配中断的策略不一定是最优的,用户最好是根据自己的应用来确定外设的中断优先级,采用手动的分配。创建NiosII系统模块下面我们给出一种自定义的地址分配实例,将闪存86四、配置NIOSII系统系统的IP模块添加完成之后,还需要对系统进行配置。点击NiosIIMore“cpu_0”Settings页,用户可以进行如下的设置:ResetAddress:可以选择存放BootLoader的存储器和设置BootLoader在存储器中的偏移,我们这里选择ext_flash,偏移选择默认;ExceptionAddress:可以选择存放异常向量表的存放的存储器和设置异常向量表在存储器中的偏移,我们选择ext_ssram,偏移选择默认;BreakLocation:如果NIOSII包含有一个JTAGDebug模块,SOPCBuilder会显示这项内容。其MemoryModule总是JTAGDebugModule,Offset固定为0x20,地址由JTAGdebugmodule基地址决定。用户不能修改BreakLocation的各个域的内容。四、配置NIOSII系统系统的IP模87五、生成NIOSII并加入到工程中
NIOSII系统是工程的一部分,我们首先是生成它,然后加入到工程中去,然后将整个工程下载到FPGA芯片中去。单击SystemGeneration,在Option下进行如下的设置:创建NiosII系统模块五、生成NIOSII并加入到工程中创建NiosII系统88选中Simulation,如果安装了ModelSim软件,会生成用于仿真的相应的文件。单击exit退出SOPCBuilder。单击Generate,SOPCBuilder会提示生成系统的进程,系统生成完成时会提示”SUCCESS:SYSTEMGENERATIONCOMPLETED”。选中HDL,会生成系统模块的硬件语言文件。选中Simulation,如果安装了ModelSim软件,89系统生成完成之后,SOPCBuilder为这个定制的NIOSII系统模块创建了一个符号,要把NiosII系统加入到工程中去,遵循如下的步骤:(1)在QuartusII软件中,打开顶层实体(BDF格式),在BDF窗口中任意处双击,出现Symbol对话框;(2)在Symbol对话框中单击Project来展开工程目录,其下出现NIOS2(本例采用的系统名),选中它,右侧出现了系统的符号表示;(3)单击OK,Symbol对话框关闭,NIOS2的符号轮廓被附着在鼠标的指针上。(4)BDF窗口中任意空白处单击一下,NIOS2的符号出现在BDF窗口中,这样我们创建的系统已经被加入到工程中了。创建NiosII系统模块系统生成完成之后,SOPCBuilder为90创建NiosII系统模块创建NiosII系统模块91六、引脚和嵌入式锁相环除了NIOSII系统之外,可能还要有其它的硬件逻辑,我们这里加入一个嵌入式锁相环,嵌入式锁相环有两个时钟输出,一个输出SSRAM提供时钟,另一个时钟的输出为NIOSIICPU提供时钟,然后添加输入、输出、双向引脚,以实现和FPGA外部的外设进行通信。加入嵌入式锁相环的步骤如下:创建NiosII系统模块六、引脚和嵌入式锁相环创建NiosII系统模块92(1)点击ToolsMegaWizardPlug-InManager,出现MegaWizardPlug-InManager向导Page1窗口,点击next创建NiosII系统模块(1)点击ToolsMegaWizardPlug-In93(2)在MegaWizardPlug-InManagerPage2窗口中的IO下面选择ALTPLL,器件选择CycloneII,输出文件类型选择VHDL,文件名为ssram_pll,选中Returntothispageforanothercreateoperation,然后点击Next,出现MegaWizardPlug-InManager-ALTPLL[Page3of10];创建NiosII系统模块(2)在MegaWizardPlug-InManage94(3)在窗口中,做如图选择,点击next,进入page4(4)在page4中不作任何配置,直接点击next;创建NiosII系统模块(3)在窗口中,做如图选择,点击next,创建NiosII95(5)点击next创建NiosII系统模块(5)点击next创建NiosII系统模块96(6)在Page6窗口中,设置c0输出时钟,首先选中Usethisclock选项,设置时钟频率为85MHz,占空比为50%。点击Next会进入c1输出时钟的设置;创建NiosII系统模块(6)在Page6窗口中,设置c0输出时钟,首先选中Us97(7)嵌入式PLL可提供3个输出时钟,我们使用其中的两个,Page7窗口中,在c1时钟的设置页面上,选中Usethisclock选项,设置时钟频率为85MHz,点击Next;创建NiosII系统模块(7)嵌入式PLL可提供3个输出时钟,我们使用其中的两个,98创建NiosII系统模块(8)在MegaWizardPlug-InManager-ALTPLL[Page8of10]窗口中,不选中Usethisclock选项,即我们不使用c2时钟,点击Next;(9)在MegaWizardPlug-InManager-ALTPLL[Page9of10]窗口中,给出了用于仿真必须要产生的文件,点击Next;(10)在MegaWizardPlug-InManager-ALTPLL[Page10of10]窗口中,给出了用户选择要产生的文件,不做改变,采用默认配置,点击Finish完成PLL的生成。
在顶层实体的bdf窗口中双击鼠标,出现Symbol添加窗口,在project下面选择刚才建立的ssram_pll,点击OK。ssram_pll的轮廓会附着在鼠标上,点击bdf窗口的空白处,将嵌入式锁相环加入到了工程中。创建NiosII系统模块(8)在MegaWizardP99引脚添加的步骤如下:
(1)在顶层实体的bdf窗口的空白处双击鼠标,出现Symbol添加窗口(2)在altera/quartus/libraries下面选择primitives,再在其下选择pin,在其中有三种类型的引脚,有bidir,input,output,分别为双向、输入和输出引脚,选择相应类型的引脚,点击OK。(3)点击bdf窗口的空白处,即将引脚加入到了工程中。(4)重复上面的步骤添加为各个端口添加相应类型的引脚。引脚添加的步骤如下:(2)在altera/quartus/100创建NiosII系统模块连接引脚和命名引脚
第一个加入的引脚的名称缺省为pin_name,之后加入的引脚名称依次为pin_name1,pin_name2向上递增,为了便于理解和记忆,需要对引脚重新命名,使其和其传输的信号联系起来。
命名引脚的方法如下:(1)双击引脚的“pin_namen”部分,pin_namen的文字变成高亮,可以对其编辑。(2)对其他的引脚重复以上的操作,修改成具有意义的名字。(3)对于总线型的引脚,引脚名称之后要标识出总线的位数,如ddr_a[12..0],在引脚名称之后加上方括号,然后写上最高位和最低位,用两个..隔开。(4)将嵌入式锁相环和系统模块等连接起来,并将引脚连接到相应的端口上。创建NiosII系统模块连接引脚和命名引脚101创建NiosII系统模块连接好的顶层模块图创建NiosII系统模块连接好的顶层模块图102设计优化设计优化主要包括节省占用FPGA的面积和提高设计系统运行速度两个方面。这里的“面积”是指一个设计所消耗的FPGA的逻辑资源的数量,一般以设计占用的等价逻辑门数来衡量。“速度”是指设计的系统在目标芯片上稳定运行时能够达到的最高频率,它与设计的时钟周期、时钟建立时间、时钟保持时间、时钟到输出端口的延迟时间等诸多因素有关。设计优化设计优化主要包括节省占用FPGA的面103面积与速度的优化打开我们刚才的工程——clock,然后选择Assignment菜单下的Settings命令,弹出设置窗口。在对话框的左边的Category栏下,列出了很多可设置的对象,包括EDAToolsSettings、CompilationProcessSettings、Analysis&SynthesisSettings、FitterSettings、TimingSettings、SimulationSettings等等,选中要设置的项目,窗口的右边显示供设置的选项和参数。在Analysis&SynthesisSettings页面,用于对设计在分析与综合时的优化设置。在该页面的OptimizationTechniques栏中,提供了Speed、Balanced和Area3种优化选择,其中Balanced是软件缺省的优化选择。如果对Speed或Area有特殊的要求,则选中相应的选项。面积与速度的优化在对话框的左边的Category栏下,列出了104设计优化时序约束与设置选择Settings下面的TimingAnalysisSettings,然后选择ClassicTimingAnalyzerSettings。在此页面中,可以对设计的延迟约束、时钟频率等做设置。延迟约束(DelayRequirements)设置包括tsu(建立时间)、tco(时钟到输出的延迟)、tpd(传输延迟)和th(保持时间)的设置。一般来说,用户要根据目标芯片的特性及PCB板走线的实际情况,给出设计需要满足的时钟频率、建立时间、保持时间和传输延迟时间等参数。对一些简单的应用,对时序要求不严格,可以不做设置。设计优化时序约束与设置在此页面中,可以对设计的延迟约束、时钟105设计优化Fitter设置在Ssettings对话框中,用鼠标左键单击Category栏目中的FitterSettings项,出现FitterSettings设置页面。此页面用于布局布线器的控制。
在这里需要设置的主要是布局布线的策略(FitterEffort),有三种模式可供选择:标准模式(StandardFit)、快速模式(FastFit)和自动模式(AutoFit)。标准模式需要的时间比较长,但可以实现较高的最高频率(fmax);快速模式可以节省50%的编译时间,但会使最高频率有所降低;自动模式在达到设计要求的条件下,自动平衡最高频率和编译时间。设计优化Fitter设置在这里需要设置的主要是布局布线的策略106编译QuartusII编译器由一系列处理模块组成,包括分析与综合、适配、汇编和时序分析等环节。通过QuartusII编译器,可以检查设计错误,综合逻辑,把设计配置到FPGA中去,并且为模拟、时序分析及器件配置生成输出文件。1.分析与综合在编译过程中,首先对设计文件进行分析和检查,如检查原理图的信号线有无漏接、信号有无双重来源、硬件描述语言文件中有无语法错误等,如存在错误,编译器会给出出错信息并标出出错位置,供设计者修改,如果设计文件不存在错误,接着进行综合,综合完成的是设计逻辑到器件资源的映射。2.适配适配完成的是设计逻辑在器件中的布局和布线、选择适当的内部互联路径、引脚分配、逻辑元件分配等操作。可以设置适配的多个选项,来采取不同的优化策略。
编译QuartusII编译器由一系列处理模块组成,包括分析107编译3.汇编适配完成后,进入编程环节。在编程过程中,生成器件的编程映像文件,映像文件可以通过电缆下载到目标芯片中。4.时序分析在适配完成之后,设计逻辑在器件中的布局和布线、内部互联路径已经确定,在时序分析中,会计算给定设计在器件中延时,完成时序分析和逻辑的性能分析。用户可以预先设置Timingrequirement,可以针对整个的工程、特定的设计实体、节点和引脚指定所需的速度性能。编译过程中会针对设置进行适配。编译3.汇编108编译一、编译设置
在编译前,用户可以设置编译器,可以实现对编译过程控制的目的。编译器根据相应的设置进行编译。合理的设置可以提高工程编译的速度,优化器件的资源利用等。单击Assignments菜单中的Settings,出现下图的窗口。编译一、编译设置109编译在Device中,用户可以设置和器件有关的选项,FPGA的芯片通常在建立项目的时候就已经选择好了,所以通常不做修改。注意在编译之前必须要对未使用的引脚做设置,将未使用的引脚设置成Asinputs,tri-stated。如果不做此项配置设计可能无法在开发板上运行。设置未使用的引脚按照下面的步骤:(1)在Settings对话框中的Device页中,单击DeviceandPinOptions,出现DeviceandPinOptions对话框,缺省是General页。编译在Device中,用户可以设置和器件有关的选项,FPGA110编译(2)单击UnusedPins标签,在Reserveallunusedpins下选择,Asinputs,tri-stated。(3)在Deviceandpinsoptions中,其他的设置可以选用默认的设置,不做修改,点击确定。编译(2)单击UnusedPins标签,在Reserve111编译设计优化也是编译设置的一部分,但是为了强调设计优化的重要性,把它们单独提出来介绍了,除了这些设置之外,还有下面的一些设置跟编译的过程有关:在EDATools中,用户可以指定在编译过程中用到的其他第三方的工具软件,通常不用设定。在CompilationProcessSettings中,用户可以设置编译过程的一些选项,如是否使用增量编译等。在TimingAnalyzer中,用户可以设置时序分析报告中显示的内容。在Assembler中,指定汇编的选项。编译设计优化也是编译设置的一部分,但是为了强112编译二、引脚分配用户需要进行引脚分配,使得编译器能把用户设计中的信号分配到目标器件上的特定引脚上。QuartusII提供了两种引脚分配方法:一种是使用AssignmentsEditor来分配,方法为选择Assignments菜单中的pins或者AssignmentsEditor;第二种方法是使用TCL脚本一次性分配所有的引脚。编译二、引脚分配113编译采用第一种方法即使用AssignmentsEditor进行引脚分配步骤如下:(1)选择选择Assignments菜单中的pins或者AssignmentsEditor。(2)在NodeName下输入引脚名称,在Location选择相应的引脚。(3)选择FileSave保存分配。这种分配方法效率较低,且容易出错。推荐使用TCL脚本文件的方法来进行引脚分配。编译采用第一种方法即使用AssignmentsEditor114编译用TCL脚本文件
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年技术转让合同:某公司将某项专利技术转让给某生产企业
- 2024年房产销售代理合作合同
- 2024年度XX生物质能源开发利用合同
- 2024年文化艺术交流活动策划合同
- 2024年新一代移动通信技术研发与合作协议
- 2024奶粉企业社会责任报告编制与公示合同
- 2024年商务车租赁合同(甲方为航空公司)
- 2024年工业自动化节能升级项目总承包合同
- DB 4102T 031-2023地理标志农产品 兰考蜜瓜
- 2024年房屋权益让与合同
- 民法典讲座-继承篇
- 外包施工单位入厂安全培训(通用)
- 糖尿病健康知识宣教课件
- 客户接触点管理课件
- Python语言学习通超星课后章节答案期末考试题库2023年
- 医学-心脏骤停急救培训-心脏骤停急救教学课件
- 高中英语-Book 1 Unit 4 Click for a friend教学课件设计
- 年产30万吨碳酸钙粉建设项目可行性研究报告
- 主题班会如何对待厌学情绪(初二) 省赛获奖 省赛获奖
- 初中数学北师大版七年级上册课件5-4 应用一元一次方程-打折销售
- 0-6岁儿童健康管理服务规范(第三版)
评论
0/150
提交评论