《Xilinx FPGA设计基础》课件第6章_第1页
《Xilinx FPGA设计基础》课件第6章_第2页
《Xilinx FPGA设计基础》课件第6章_第3页
《Xilinx FPGA设计基础》课件第6章_第4页
《Xilinx FPGA设计基础》课件第6章_第5页
已阅读5页,还剩248页未读 继续免费阅读

下载本文档

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

文档简介

第6章VHDL程序设计实验6.1实验一层次化工程的创建6.2实验二仿真测试平台的创建6.3实验三存储器和记录类型实验6.4实验四n比特计数器及RTL验证实验

6.5实验五比较器实验6.6实验六算术逻辑单元实验6.7实验七状态机实验6.8实验八计数器实验6.9实验九IP核应用实验6.10实验十数字时钟管理IP核实验

6.1实验一层次化工程的创建

6.1.1实验介绍

本实验将完成两个实体MY_AND2和MY_OR2的RTL描述,并用结构化的描述方式描述如图6.1所示电路的顶层模块AND_OR。实验中默认的文件夹为\VHDL_LABS\,读者可以在任意位置创建文件夹VHDL_LABS。图6.1AND_OR的层次结构6.1.2实验目标

●熟悉简单逻辑门的RTL描述;

●创建简单电路的结构化描述;

●用VHDL创建层次结构描述;

●熟悉ISE集成环境中的HDL编辑器。

6.1.3实验过程

本实验包含三个主要的部分:使用ISE集成环境创建一个新的工程;完成逻辑门的RTL描述;检查代码中的语法错误并生成原理图。每个部分都有对应的详细步骤,并有图表辅助说明步骤的内容。读者可以按照详细步骤一步一步完成实验,也可以按照大的实验部分自行完成。6.1.4实验步骤

1.创建一个新的工程

在\VHDL_LABS\目录下创建一个新的工程,新工程命名为LAB1。具体操作步骤如下:

(1)选择“开始→所有程序→XilinxISE9.1i”或直接双击桌面上XilinxISE9.1i的图标,打开ISE9.1i集成环境。

(2)在ISE中,选择菜单栏中的File→NewProject,打开创建新工程界面,如图6.2所示。图6.2创建新工程界面

(3)在ProjectName中填入工程名LAB1,在ProjectLocation中填入工程所在文件夹\VHDL_LABS\LAB1。

(4)单击Next按钮。

(5)在图6.3中填入如下参数:

Family:Spartan3;

Device:XC3S200;

Package:PQ208;

Speed:-5。

(6)单击Next按钮,在CreateNewSource窗口和AddExistingSources窗口中都不做任何操作,在ProjectSummary窗口中确认工程信息后,单击Finish按钮完成新工程的创建。图6.3工程属性参数

2.逻辑门的RTL描述

编写MY_AND2实体的VHDL代码。

(1)选择菜单栏中的Project→NewSource。

(2)在SelectSourceType窗口中,选择左侧VHDLModule,在右侧FileName栏中填入文件名MY_AND2,单击Next按钮后弹出DefineModule窗口,如图6.4所示。图6.4输入模块的相关参数

(3)输入模块的ArchitectureName和端口参数,如图6.4所示。

(4)输入完成后单击Next按钮,确认模块参数后,单击Finish按钮。

新文件生成向导会按照用户输入的参数创建新文件,但是完成向导的操作后,对文件的全部后续修改都只能在HDL编辑器中修改。

(5)用VHDL的逻辑运算操作符和直接代入语句描述逻辑门的功能,即C<=AandB。用户可以对照实验后面给出的代码做相应的修改。

编写MY_OR2和AND_OR模块的VHDL代码。

(1)重复上面的步骤完成MY_OR2.VHD和AND_OR.VHD代码的编写。

(2)将AND_OR.VHD的输入定义为一个总线,即STD_LOGIC_VECTOR类型。

(3)在AND_OR模块中,必须声明和例化被调用的下层模块MY_AND2和MY_OR2。

(4)在AND_OR模块中,必须显式地定义用于下层模块互联的连线信号。

(5) MY_OR2和AND_OR模块的代码可以参照本实验后面给出的代码实例。

3.语法检查并生成原理图

检查所写代码中的语法。

(1)在ISE的Sources窗口中选中AND_OR模块,在Processes窗口中,展开Synthesize,双击CheckSyntax,如图6.5所示。图6.5语法检查

(2)如果语法检查有错误,修正相应的错误。

语法检查成功并不能说明设计文件中没有任何问题,设计文件的问题有可能在综合或后续的一些操作中才会被检测出。

将设计文件生成对应的原理图,直观地检查设计是否满足最初的设计要求。在生成原理图的过程中,ISE同时会对工程做综合。在综合的过程中,ISE有可能会对设计文件的一些问题报错,如果出现错误,请对照修正。

(1)在Sources窗口中,选中AND_OR.VHD,在Processes窗口中,展开Synthesis,双击ViewRTLSchematic,如图6.6所示。图6.6查看原理图

AND_OR模块对应的顶层原理图如图6.7所示,双击AND_OR模块的图示,可以看到AND_OR底层的电路。图6.7AND_OR的原理图

AND_OR的底层电路如图6.8所示。

(2)如果电路图与设计的预期结构不同,可以从设计源文件中修改。

(3)读者可以在图6.6的Processes窗口中双击ViewTechnologySchematic查看设计文件在XilinxFPGA器件中的综合后实现方法。图6.8AND_OR的底层电路6.1.5实验总结

在本实验中,我们创建了一个简单的逻辑门模块,这个模块在上层的模块中被调用,模块之间通过信号相连。读者通过这个简单的实验,接触了使用VHDL编程的一些基本技术和方法,这些方法会在后续的工程中经常使用。

6.1.6实验中的代码

本实验中会用到3个文件,文件对应的代码分别如下:

6.2实验二仿真测试平台的创建

6.2.1实验介绍

本实验将对实验一中的AND_OR模块建立一个测试平台文件,并进行仿真验证。仿真平台框架如图6.9所示。作为测试平台的一部分,读者将学会如何用并发描述语句和顺序描述语句创建一个简单的输入激励。图6.9AND_OR的测试平台框架6.2.2实验目标

●创建一个测试平台文件,测试实验一中的AND_OR模块,验证其正确性;

●学习ISE9.1i中的测试平台向导;

●建立基本的输入激励;

●学习仿真验证的方法。

6.2.3实验过程

本实验包含四个主要的部分:创建一个新的工程,并导入VHDL源文件;用ISE中的测试平台向导生成测试平台文件;创建并发和顺序描述的输入激励语句;最后运行仿真,验证逻辑的正确性,并通过仿真波形,验证设计的功能是否正确。6.2.4实验步骤

1.创建一个新的工程

在\VHDL_LABS\目录下创建一个新的工程,新工程命名为LAB2,并导入已有的VDHL程序。具体操作步骤如下:

(1)选择“开始→所有程序→XilinxISE9.1i”或直接在桌面双击XilinxISE9.1i的图标,打开ISE9.1i集成环境。

(2)在ISE中,选择菜单栏中的File→NewProject打开创建新工程界面,ProjectName中填入工程名LAB2,在ProjectLocation中填入工程所在文件夹\VHDL_LABS\LAB2。

(3)在DeviceProperties窗口中,填写与实验一中相同的属性配置。

(4)单击Next按钮,在CreateNewSource窗口和AddExistingSources窗口中不做任何操作,在ProjectSummary窗口中确认工程信息后,单击Finish按钮完成新工程的创建。

(5)选择菜单栏中的Porject→AddCopyofSource。

(6)文件查找路径选择为\VHDL_LABS\LAB1,选择已存在的三个文件AND_OR,MY_AND2,MY_OR2,然后单击Open按钮。

(7) ISE会自动检测加入的文件,如图6.10所示。单击OK按钮,确认添加的文件。图6.10加入源文件

2.创建一个测试平台文件

使用测试平台向导生成一个测试平台文件。

(1)选择菜单栏中的Project→NewSource。

(2)在SelectSourceType窗口中,左侧选择VHDLTestBench,右侧FileName栏中填入文件名AND_OR_TB,如图6.11所示。

(3)单击Next按钮,软件会弹出一个界面,询问测试平台文件与哪个设计文件关联。

(4)选择顶层模块AND_OR,单击Next按钮,确认文件信息后,单击Finish按钮,完成文件的创建。图6.11源文件类型选择向导至此,我们已经设计好了测试平台文件的框架。ISE的测试平台文件向导自动为我们完成了测试平台文件的结构设计。在ISE的Sources窗口中,选择Sourcesfor栏的BehavioralSimulation,用户可以在Sources窗口中看到AND_OR_TB文件,双击这个文件,可以查看文件的内容。

测试平台文件包括以下几部分:

●被测试的顶层元件声明;

●顶层的信号声明;

●元件例化与端口映射;

●测试激励输入的外部描述结构。

3.创建简单的输入激励

用并发描述语句和顺序描述语句创建简单的测试输入激励。测试源需要对总线INP(3downto0)的信号单独输入测试激励,因此首先要将INP的信号分开,这里用两组信号分别与INP的不同信号相连,便于分别驱动。

(1)在AND_OR_TB文件的Architecture中加入两个信号定义:

signalA_STIM,B_STIM:STD_LOGIC_VECTOR(1downto0);

(2)在Architecture声明后,在begin之后插入下面的直接代入语句:

INP<=A_STIM&B_STIM;

(3)参考本实验后面的代码对A_STIM和B_STIM分别输入独立的测试激励。

4.验证AND_OR的逻辑结构

运行仿真,查看仿真波形,验证设计的功能正确性。

(1)在完成了AND_OR_TB.VHD测试平台文件的编写之后,在Sources窗口的Sourcesfor栏中选择BehavioralSimulation,并在文件树中选择AND_OR_TB.vhd,在Processes窗口中双击CheckSyntax,如图6.12所示。

(2)如果发现有语法错误,请修正错误后继续进行下面的步骤。图6.12对仿真平台文件做语法检查

(3)在Processes窗口中,双击SimulateBehavioralModel,ISE将会自动进行仿真,如果没有错误,仿真后的波形应如图6.13所示。图6.13AND_OR_TB仿真波形注意:在图6.13左侧的Processes窗口中,会出现一个SimHierarchy选项卡,这个层次结构即为AND_OR_TB测试平台的层次结构。用户可以展开这个仿真层次,然后选中设计文件中任一层次的任一信号,将其拖入波形窗口中,查看仿真结果。

开始仿真后,在ISE的菜单栏中会出现一个Simulate菜单,与其相应的,在工具栏中会出现仿真工具,如图6.14所示。图6.14工具栏中的仿真工具6.2.5实验总结

在本实验中,我们创建了一个测试平台,并对实验一中的AND_OR模块进行了验证。这个测试平台虽然简单,但包含了一般仿真过程的基本步骤。在后续的实验中,还会在测试平台文件中加入更多的功能和特性。

6.2.6实验中的代码

文件对应的代码如下:

6.3实验三存储器和记录类型实验

6.3.1实验介绍

本实验将完成图6.15所示的结构中MEM部分的模块。实验内容主要涉及记录(record)数据类型的使用方法,以及如何以此为基础,用二维数组描述一个存储器。图6.15简单的计数器6.3.2实验目标

●用记录(record)数据类型创建一个用户自定义的RAM结构;

●创建计数器的第一个元件;

●多种VHDL数据类型的复合使用;

●验证逻辑结构。

6.3.3实验过程

本实验包含三个主要的部分:创建一个新的ISE工程;创建一个VHDL的包集合,包集合中定义了用户自定义的记录(record)数据类型;最后用这个记录(record)数据类型创建一个二维的存储器数组。6.3.4实验步骤

1.创建一个新的工程

在\VHDL_LABS\目录下创建一个新的工程,新工程命名为LAB3。具体操作步骤如下:

(1)选择“开始→所有程序→XilinxISE9.1i”或直接在桌面双击XilinxISE9.1i的图标,打开ISE9.1i集成环境。

(2)在ISE中,选择菜单栏中的File→NewProject,打开创建新工程界面,ProjectName中填入工程名LAB3,在ProjectLocation中填入工程所在文件夹\VHDL_LABS\LAB3。

(3)在DeviceProperties窗口中,填写与实验一中相同的属性配置。

(4)单击Next按钮,在CreateNewSource窗口和AddExistingSources窗口中都不做任何操作,在ProjectSummary窗口中确认工程信息后,单击Finish按钮完成新工程的创建。

2.创建一个包含记录(record)数据类型的包集合

创建一个包集合,并在包集合中包含用户自定义的记录(record)数据类型。

(1)选择菜单栏的Project→NewSource。

(2)在SelectSourceType窗口中,选择左侧的VHDLPackage,在右侧FileName栏中填入文件名CALC1_PACKAGE。

(3)单击Next按钮,文本编辑框中即显示已创建好的包集合模板。这个包集合模板中包含了各种常用的声明语句,在使用时可能感觉比较繁杂,由于本实验只定义一个记录(record)数据类型,读者可以只保留包集合模板中package和endpackage的声明语句,其他语句都删掉。

(4)将包集合命名为CALC1_PAK。

(5)创建一个记录,命名为MY_RECORD,MY_RECORD包含以下元素:

3.创建一个二维存储器数组

用已定义好的MY_RECORD类型声明一个二维存储器数组。

(1)选择菜单栏中的Project→NewSource;

(2)在SelectSourceType窗口中,选择左侧的VHDLModule,在右侧FileName栏中填入文件名MEM,单击Next按钮进入端口定义窗口DefineModule。

(3)在DefineModule窗口中输入下面的端口定义:

ADDR:in

STD_LOGIC_VECTOR(2downto0);

EN:in

STD_LOGIC;

DATA_FRAME:outMY_RECORD;注意:在DefineModule窗口中是无法定义MY_RECORD类型的,窗口中的端口默认为STD_LOGIC和STD_LOGIC_VECTOR类型的数据。DATA_FRAME的数据类型需要在文件生成好后,在文本编辑器中修改。

(4)在MEM的库和包集合使用声明中,加入对CALC1_PAK的使用声明。

(5)在结构体中定义一个二维存储器类型ROM_ARRAY,ROM_ARRAY类型中包含6个MY_RECORD类型的数据。

(6)声明一个ROM_ARRAY类型的常量MY_ROM,并对其进行初始化。

(7)在结构体的进程中,用MY_ROM中的数据对输出端口赋值,读者可以参考本实验后面的实验代码完成此步骤。

语法检查:

(1)在Sources窗口中选择MEM.VHD,在Processes窗口中双击CheckSyntax。

(2)如果语法检查有错误,请修正错误后继续进行下面的步骤。

注意:如果此时查看MEM对应的RTL原理图,读者会看到这个原理图并不完整,这是由于存储器中全部的值都是常量,而且没有做任何的处理,综合器在综合时将电路做了优化。6.3.5实验总结

在本实验中,我们首先创建了一个包集合,包集合中的内容将会在后续的设计中经常用到;之后,创建了一个用户自定义的记录类型,并以此为基础定义了一个二维存储数组类型。存储器内部的值设置为常量,我们会在后续的实验中修改存储器中的值。

6.3.6实验中的代码

文件对应的代码如下:

6.4实验四n比特计数器及RTL验证实验

6.4.1实验介绍

本实验将完成图6.16中MY_CNTR计数器的RTL描述,计数器的位宽用generic语句设置为参数。MY_CNTR是一个n比特二进制的计数器,可以向上向下计数,并可设置计数值,计数器用异步的方式进行低电平复位。实验的后半部分将会建立一个测试平台,测试计数器的RTL代码是否能够完成既定的功能。图6.16n比特计数器6.4.2实验目标

●创建、仿真并验证n比特二进制计数器的RTL代码;

●在ISE中使用语法模板;

●使用VHDL中的generic语句。

6.4.3实验过程

本实验包含三个主要的部分:创建一个新的ISE工程;用generic语句声明参数;创建一个测试平台验证设计文件的正确性。

6.4.4实验步骤

1.创建一个新的工程

在\VHDL_LABS\目录下创建一个新的工程,新工程命名为LAB4。具体操作步骤如下:

(1)选择“开始→所有程序→XilinxISE9.1i”或直接在桌面双击XilinxISE9.1i的图标,打开ISE9.1i集成环境。

(2)在ISE中,选择菜单栏中的File→NewProject打开创建新工程界面,在ProjectName中填入工程名LAB4,在ProjectLocation中填入工程所在文件夹\VHDL_LABS\LAB4。

(3)在DeviceProperties窗口中,填写与实验一中相同的属性配置。

(4)单击Next按钮,在CreateNewSource窗口和AddExistingSources窗口中都不做任何操作,在ProjectSummary窗口中确认工程信息后,单击Finish按钮完成新工程的创建。

2.用generic语句声明参数

创建MY_CNTR实体。

(1)选择菜单栏中的Project→NewSource。

(2)在SelectSourceType窗口的左侧选择VHDLModule,在右侧FileName栏中填入文件名MY_CNTR。

(3)单击Next按钮,进入DefineModule窗口。

(4)在DefineModule窗口中输入图6.16所示的输入/输出端口定义,其中只有D_IN和Q_OUT是位宽为参数的总线,其他端口都为单根信号,单击Next按钮,确认模块信息后单击Finish按钮完成模块的生成。

在DefineModule中不能使用generic语句定义模块的参数,模块的参数需要在文本编辑器中添加和修改。本实验中的功能语句将需要用到数组的算术运算,因此要声明使用IEEE的两个包集合IEEE.STD_LOGIC_UNSIGNED.ALL和IEEE.STD_LOGIC_ARITH.ALL。

模块生成向导不支持模块的参数定义,因此需要手工输入。

(1)使用VHDL中的generic语句将模块的端口位宽定义为参数,参数的类型定义为整数类型,默认值为8。

(2)端口位宽的参数名用户可以自行定义。

模块的实体定义完成之后,需要定义模块的结构体实现。

(1)在结构体内,用if/else语句描述计数器的功能实现。在描述功能实现时,读者首先需要考虑这些控制信号的优先级,然后考虑在设定的优先级情况下如何描述计数器的功能实现。

ISE的VHDL语言模板中已经定义了一个计数器的模板,读者可以直接拷贝模板程序,然后做一些简单的修改。选择菜单栏中的Edit→LanguageTemplates,如图6.17所示,即可打开计数器的模板。图6.17VHDL中的计数器模板

(2)在结构体中声明一个信号,信号的位宽为8,用参数声明信号的位宽,信号名称定义为COUNT。在时序进程中,将控制这个信号的值。

(3)在进程外,用COUNT对模块的端口Q_OUT赋值,即Q_OUT<=COUNT。

(4)复位时,用下面的语句对COUNT信号赋值:

COUNT<=(others=>'0');

使用这种方式赋值时,设计者不需要关注信号的实际位宽。这是增强程序灵活性的一种重要方法,因为在使用generic语句时,端口的位宽可以是任意长度。这一步完成后,MY_CNTR的源代码就编写完成了,如果读者对代码仍有疑问,可以参考本实验后面的实验代码部分完成代码的编写。

语法检查:

(1)在Sources窗口中选中MY_CNTR.VHD,在Processes窗口中展开Synthesis,并双击CheckSyntax。

(2)双击ViewRTLSchematic验证综合器是否将代码综合为一个二进制计数器。

(3)如果代码中有语法错误,请修正错误后继续执行下面的步骤。

3.创建测试平台

建立测试平台并验证计数器的功能是否满足设计需求。

(1)选择菜单栏中的Project→NewSource。

(2)在SelectSourceType窗口中,选择左侧的VHDLTestBench,在右侧FileName栏中填入文件名MY_CNTR_TB。

(3)单击Next按钮,软件弹出一个界面,询问测试平台文件与哪个设计文件关联,选择MY_CNTR。

与之前的实验相同,测试平台生成向导已经为用户搭建好了测试平台的框架,设计者可以只关注于测试输入激励。

测试平台向导生成的文件框架中,元件的参数已经被去掉,而直接用参数的默认值代替。在本实验中,参数的默认值正好是我们需要的值,然而在其他的应用中,为了保持参数的灵活性,用户可能要重新声明元件的参数。

创建测试输入激励,如果在编写激励过程中有疑问可以对照本实验后面的实验代码部分。

(1) CLOCK时钟频率设置为100MHz。

(2)在15ns时对计数器进行复位,复位保持时间为25ns。

(3) CE信号的初始值设置为High,300ns后拉低,并保持100ns。

(4) LOAD信号初始值为Low,500ns后拉高,并保持一个时钟周期。

(5) UPDN信号初始值为High,750ns后拉低。

(6) D_IN信号的值设置为X“0F”或00001111。

检查语法错误,并用ISESimulator进行仿真。

(1)在Sources窗口中选中MY_CNTR_TB.VHD,在Processes窗口中双击CheckSyntax。

(2)如果有语法错误,请修正后继续后面的步骤。

(3)在Processes窗口中,双击SimulateBehavioralModel。仿真的结果如图6.18所示。图6.18计数器仿真结果6.4.5实验总结

在本实验中,我们创建了一个参数可配置的n比特二进制计数器,计数器可以被配置成任意位宽,generic语句是模块重用和增加代码可读性的一种重要方法。

我们同时熟悉了ISE中的VHDL语言模板的使用方法,使用模板可以帮助用户方便快捷地建立所需类型的代码。

实验的最后,我们创建了一个测试平台,并设计了输入激励,对设计文件进行了对应的功能仿真。

6.4.6实验中的代码

文件对应的代码如下:

6.5实验五比较器实验

6.5.1实验介绍

本实验将完成图6.19中比较器COMP的两种描述方式下的独立描述,一种为行为描述方式,应用VHDL中的Assert语句和条件信号赋值语句;另一种为RTL描述方式,用if/else语句。图6.19简单的计数器6.5.2实验目标

●学习使用assert语句;

●学习使用VHDL中的基本条件描述结构if/else;

●用行为描述方式和RTL描述方式分别对给定的模块进行描述;

●验证设计文件的正确性。

6.5.3实验过程

本实验包含四个主要的部分:创建一个新的ISE工程;创建COMP的行为描述代码;创建COMP的RTL描述代码;创建测试平台文件,验证描述模型的正确性。6.5.4实验步骤

1.创建一个新的工程

在\VHDL_LABS\目录下创建一个新的工程,新工程命名为LAB5。具体操作步骤如下:

(1)选择“开始→所有程序→XilinxISE9.1i”或直接在桌面双击XilinxISE9.1i的图标,打开ISE9.1i集成环境。

(2)在ISE中,选择菜单栏中的File→NewProject,打开创建新工程界面,ProjectName中填入工程名LAB5,在ProjectLocation中填入工程所在文件夹\VHDL_LABS\LAB5。

(3)在DeviceProperties窗口中,填写与实验一中相同的属性配置。

(4)单击Next按钮,在CreateNewSource窗口和AddExistingSources窗口中不做任何操作,在ProjectSummary窗口中确认工程信息后,单击Finish按钮完成新工程的创建。

2.创建COMP的行为描述

1)创建COMP的行为描述

(1)选择菜单栏中的Project→NewSource。

(2)在SelectSourceType窗口中,选择左侧的VHDLModule,在右侧FileName栏中填入文件名COMP。

(3)单击Next按钮进入DefineModule窗口。

(4)在DefineModule窗口中输入表6.1所示的输入/输出端口定义,单击Next按钮,确认模块信息后,单击Finish按钮,完成模块的配置。表6.1COMP的端口定义

(5)在生成的模块定义中,结构体的名称默认为Behavioral,无需改变。

2)完成模块的结构体描述

本步骤主要完成行为描述方式的结构体,最主要的目的是仿真。使用VHDL中的assert语句比较两个输入信号,并配以severitylevel和report结构完成比较。用条件信号赋值语句对输出信号RESULT赋值,如果输入的两个信号相等,则赋值为1,否则赋值为0。读者可以参考本实验后面的代码完成源文件的编写。

3)语法检查

(1)在Sources窗口中选中COMP.VHD,在Processes窗口中展开Synthesis,并双击CheckSyntax。

(2)如果代码中有语法错误,请修正错误后继续执行下面的步骤。

3.创建COMP的RTL描述

创建RTL描述方式的COMP。

(1)选择菜单栏中的Project→NewSource。

(2)在SelectSourceType窗口的左侧选择VHDLModule,右侧FileName栏中填入文件名COMP_RTL。

(3)单击Next按钮,进入DefineModule窗口。

(4)在DefineModule窗口中将模块的结构体名称改为RTL,并按照与行为描述方式中相同的方法填写模块的端口定义。

(5)在COMP_RTL的结构体描述中使用if/else语句描述COMP_RTL的功能,实现的功能与行为描述中实现的功能相同。

4.创建测试平台文件

创建一个简单的测试平台,并验证行为描述方式下的COMP模块功能是否正确。

在仿真的时候请注意查看ISE的console窗口,如果输入的两个数据不同,则在console窗口中会打印出用户定制的消息。

使用ISESimulator对创建的测试平台进行仿真,并调试工程源代码。6.5.5实验总结

在本实验中,我们创建了COMP模块的两种描述方式下的代码,第一种为行为级描述方式,主要用于仿真,使用的描述语句为assert语句和report语句;第二种为RTL描述,主要用于综合生成最终的电路,使用的描述语句为if/else语句。

在实验中,用户需要使用VHDL中的generate语句在两种结构体描述中做出选择。

6.5.6实验中的代码

文件对应的代码如下:

6.6实验六算术逻辑单元实验

6.6.1实验介绍

本实验将完成图6.19中算术逻辑单元ALU的RTL描述。

6.6.2实验目标

●学习使用case语句描述ALU的结构;

●验证逻辑结构;

●为计数器项目创建一个子模块;

●为输出数据的比较做准备。

6.6.3实验过程

本实验包含三个主要的部分:创建一个新的ISE工程;创建COMP的行为描述代码;使用case描述语句;估计输出的期望值以用于后面输出的比较。6.6.4实验步骤

1.创建一个新的工程

在\VHDL_LABS\目录下创建一个新的工程,新工程命名为LAB6。具体操作步骤如下:

(1)选择“开始→所有程序→XilinxISE9.1i”或直接在桌面双击XilinxISE9.1i的图标,打开ISE9.1i集成环境。

(2)在ISE中,选择菜单栏中的File→NewProject打开创建新工程界面,在ProjectName中填入工程名LAB6,在ProjectLocation中填入工程所在文件夹\VHDL_LABS\LAB6。

(3)在DeviceProperties窗口中,填写与实验一中相同的属性配置。

(4)单击Next按钮,在CreateNewSource窗口和AddExistingSources窗口中都不做任何操作,在ProjectSummary窗口中确认工程信息后,单击Finish按钮完成新工程的创建。

2.使用case描述语句

创建ALU模块的实体:

(1)选择菜单栏中的Project→NewSource。

(2)在SelectSourceType窗口中,选择左侧的VHDLModule,在右侧FileName栏中填入文件名ALU。

(3)单击Next按钮,进入DefineModule窗口。

(4)在DefineModule窗口中输入表6.2所示的输入/输出端口定义,单击Next按钮,确认模块信息后,单击Finish按钮完成模块的配置。表6.2ALU的端口定义完成模块的结构体描述:

(1)用case语句描述如表6.3所示的ALU的功能语句,读者可以参照本实验后面的代码完成功能语句的描述。表6.3ALU的功能描述

(2)计算可能的输出结果。填写表格6.4,计算在给定的一些输入时,输出应该是什么。表格中的数据将被用于描述语句的功能验证。表6.4估计期望的输出值语法检查:

(1)在Sources窗口选中ALU.VHD,在Processes窗口中展开Synthesis,并双击CheckSyntax。

(2)如果代码中有语法错误,请修正错误后继续执行下面的步骤。

6.6.5实验总结

在本实验中,我们用case语句创建了计数器工程中的ALU模块,并为验证后续实验中的设计模块做好了准备。

在后续的模块中,将从MEM模块中读出用于计算的数据和期望的输出结果,将用于计算的输入数据传入ALU中进行计算,计算的结果传输到CMP的输入接口。在CMP中,将ALU计算的结果和MEM模块中读出的期望结果进行比较,最后给出比较结果。6.6.6实验中的代码

文件对应的代码如下: 6.7实验七状态机实验

6.7.1实验介绍

本实验将完成图6.19中CNTRL_FSM子模块的描述,同时对CNTRL_FSM的RTL描述做进一步的验证。

在本实验中,读者可以采用单进程的方式描述FSM,也可以采用多进程的方式描述,无论采用哪种方式,FSM的输出都要通过寄存器输出。在本实验过程中,我们采用多进程的方式描述,如果时间允许,读者可以尝试使用单进程的方式完成本实验。

本实验将完成如图6.20所示FSM的VHDL代码描述。图6.20CNTRL_FSM的状态机6.7.2实验目标

●学习状态机的VHDL语言描述方法;

●学习状态机的单进程和多进程描述方法。

6.7.3实验过程

本实验包含三个主要的部分:创建一个新的ISE工程;编写FSM的VHDL代码;仿真验证代码的功能正确性。

6.7.4实验步骤

1.创建一个新的工程

在\VHDL_LABS\目录下创建一个新的工程,新工程命名为LAB7。具体操作步骤如下:

(1)选择“开始→所有程序→XilinxISE9.1i”或直接在桌面双击XilinxISE9.1i的图标,打开ISE9.1i集成环境。

(2)在ISE中,选择菜单栏中的File→NewProject,打开创建新工程界面,在ProjectName中填入工程名LAB7,在ProjectLocation中填入工程所在文件夹\VHDL_LABS\LAB7。

(3)在DeviceProperties窗口中,填写与实验一中相同的属性配置。

(4)单击Next按钮,在CreateNewSource窗口和AddExistingSources窗口中不做任何操作,在ProjectSummary窗口中确认工程信息后,单击Finish按钮完成新工程的创建。

2.FSM的多进程描述方式

创建FSM模块的实体。

(1)选择菜单栏中的Project→NewSource。

(2)在SelectSourceType窗口的左侧选择VHDLModule,右侧FileName栏中填入文件名CNTRL_FSM。

(3)单击Next按钮,进入DefineModule窗口。

(4)在DefineModule窗口中输入如图6.21所示的输入/输出端口定义,单击Next按钮,确认模块信息后,单击Finish按钮完成模块的配置。

(5)导入实验三中定义的包集合CALC1_PAK。

由于MEM和FSM有相同的MY_RECORD类型信号的互联,导入CALC1_PAK可以保持两个模块之间数据的一致性。

(6)在FSM中用use语句声明使用CLAC1_PAK。

(7)在关键字architecture和begin之间,定义一个枚举类型STATE_TYPE,枚举的值为图6.20中的状态值。

(8)定义两个STATE_TYPE类型的信号CURR_STATE和NEXT_STATE,如果是单进程描述,可以只定义一个信号STATE。

注意:模块的复位有效信号为RESET的高电平。

(9)描述FSM的状态转换代码,在描述的过程中要注意以下几点:

●输出信号ADDR在FSM内部要完成自加操作,同时要作为判断条件使用,因此需要定义一个内部信号,这个信号在FSM内部可以被更新,同时可以驱动外部的输出端口。在实验中注意观察这个信号的变化。●模块需要定义一个MY_RECORD类型的输入端口,接收前端模块输入的MY_RECORD类型的数据DATA_FRAME。在结构体内部需要用DATA_FRAME中的组成元素分别驱动模块中的信号和输出端口。例如,A_OP<=DATA_FRAME.A_IN。

● COMP_EN和ALU_EN信号需要精确地控制。

●当ADDR_I信号的计数值计到“101”后,FSM需要一直保持在这个状态,直到复位信号有效。

3.验证功能的正确性

创建一个测试平台,测试FSM的功能正确性,对单进程的FSM描述和多进程的FSM描述可以采用同一个输入激励源。

(1)选择菜单栏中的Project→NewSource。

(2)在SelectSourceType窗口中,选择左侧的VHDLTestBench,在右侧FileName栏中填入文件名CNTRL_FSM_TB。

(3)单击Next按钮,软件弹出一个界面,询问测试平台文件与哪个设计文件有关联,选择CNTRL_FSM。

注意:测试平台文件中也需要声明使用CLAC1_PAK。测试平台和测试输入激励需要完成下面的功能:

● RESET为High时,FSM是否能正常复位;

● ADDR是否按照既定的方式自增;

● COMP_EN和ALU_EN信号的时序是否满足要求;

●当ADDR_I信号达到上界时,FSM是否保持在S3_DONE状态。

读者可以使用之前填好的表6.4中的测试数据来测试本实验中的FSM。

(1)输入的时钟信号频率为50MHz。

(2)仿真25ns后将RESET信号拉高进行复位,并保持25ns。

(3)控制输入用于测试的DATA_FRAME数据。在ISE默认的仿真情况下,仿真平台中使用的下层元件信号是无法在波形窗口中看到的。读者需要手动将下层的信号加入到仿真波形中。

(1)在Sources窗口中选中CNTRL_FSM_TB,在Processes窗口中双击SimulateBehavioralVHDLModule,在弹出的仿真波形窗口中,可以看到仿真的波形。

(2)在Processes的SIMHierarchyView窗口中,选择CNTRL_FSM_TB的下层模块CNTRL_FSM,并展开其树结构。

(3)选中树结构中的CURRENT_STATE信号,并将其拖动到仿真波形窗口中。

(4)读者可以使用仿真工具栏中的仿真工具控制仿真过程。6.7.5实验总结

在本实验中,我们用状态机实现了计数器工程中的控制模块。为了保持数据类型的一致性,在程序中导入了之前定义的CALC1_PAK包集合,这个包集合中包含了MY_RECORD类型定义。

为了验证状态机描述的正确性,我们创建了一个测试平台来测试模块功能的正确性。

6.7.6实验中的代码

文件对应的代码如下: 6.8实验八计数器实验

6.8.1实验介绍

本实验将前面实验中分别完成的计数器子模块组合在一起,完成计数器的顶层模块SIMPLE_CALC,如图6.19所示。

6.8.2实验目标

●合并之前已经设计好的子模块;

●使用VHDL中的generate描述语句;

●在仿真过程中对输出数据做比较;

●验证整个电路功能的正确性;

●运行仿真。6.8.3实验过程

本实验包含六个主要的部分:创建一个新的ISE工程;导入之前写好的工程文件;修改MEM模块,更新ROM中的值;编写SIMPLE_CALC的顶层模块,并检查语法错误;创建测试平台,并对工程进行仿真验证;最后,用ISE中的Place&Route工具在FPGA器件中实现这个计数器,并查看相应的报告文件。

6.8.4实验步骤

1.创建一个新的工程

在\VHDL_LABS\目录下创建一个新的工程,新工程命名为LAB8。具体操作步骤如下:

(1)选择“开始→所有程序→XilinxISE9.1i”或直接在桌面双击XilinxISE9.1i的图标,打开ISE9.1i集成环境。

(2)在ISE中,选择菜单栏中的File→NewProject,打开创建新工程界面,在ProjectName中填入工程名LAB8,在ProjectLocation中填入工程所在文件夹\VHDL_LABS\LAB8。

(3)在DeviceProperties窗口中,填写与实验一中相同的属性配置。

(4)单击Next按钮,在CreateNewSource窗口和AddExistingSources窗口中不做任何操作,在ProjectSummary窗口中确认工程信息后,单击Finish按钮完成新工程的创建。

2.导入源文件

导入实验三、五、六、七中分别创建的包集合CLAC_PAK和下层模块MEM、COMP、COMP_RTL、ALU和CNTRL_FSM。

(1)选择菜单栏中的Project→AddCopyofSource。

(2)选择目录为\VHDL_LABS\LAB5,选择COMP.vhd和COMP_RTL.vhd,单击打开按钮,如图6.21所示。图6.21添加已有源文件的拷贝

(3) ISE会自动识别添加文件的类型,如图6.22所示。

(4)重复上面的操作步骤,将实验三完成的CALC1_PAK包集合和MEM、实验六完成的ALU以及实验七完成的CNTRL_FSM加入到工程中来。图6.22自动识别源文件的类型

3.修改MEM模块

修改MEM模块的源文件,更新ROM中的数据,将测试数据输入MEM模块中。

(1)在Sources窗口中双击MEM模块。

(2)将MY_ROM中初始化的数据用表6.4中的数据修改,用于工程的仿真验证。

(3)保存修改后的文件。

4.编写顶层模块的VHDL源代码并做语法检查

编写SIMPLE_CALC模块的VHDL源代码,并检查语法错误。

(1)选择菜单栏中的Project→NewSource。

(2)在SelectSourceType窗口中,选择左侧的VHDLModule,在右侧FileName栏中填入文件名SIMPLE_CALC。

(3)单击Next按钮,进入DefineModule窗口。

(4)在DefineModule窗口中输入如表6.5所示的输入/输出端口定义,单击Next按钮,确认模块信息后,单击Finish按钮完成模块的配置。表6.5SIMPLE_CALC的端口定义

(5)在打开的新建VHDL文件编辑窗口中,声明使用CALC1_PAK包集合,并将结构体名称修改为STRUCTURAL。

(6)在结构体内,声明要使用到的元件MEM、ALU、COMP、COMP_RTL和CNTRL_FSM。读者可以采用快捷的方法声明使用的元件,如直接将这些模块的实体定义拷贝下来,然后修改为元件声明,或者选中某一个源文件,在Processes窗口中双击DesignUtilities→ViewInstantiationTemplate,ISE会给出源文件的声明和例化模板,供设计者直接拷贝。

(7)声明用于连接各个子模块的内部信号。用generate语句配置选择使用COMP或是COMP_RTL模块,COMP是行为描述结构的模块,只用于仿真,而COMP_RTL是RTL描述结构的模块。实际应用中,要根据设计者的目的选择使用哪一种配置。在本实验中,我们先用仿真的方法做验证,因此用generate语句配置为使用COMP模块。

(1)在SIMPLE_CALC的实体定义中,用generic定义一个BOOLEAN类型的参数SYNTH,SYNTH参数的默认值为FALSE。

(2)在结构体的关键字begin之后,根据SYNTH的值创建两个generate描述语句。读者可以参照后面的实验代码完成描述语句的编写。

(3)定义一个MY_RECORD类型的信号,用于连接MEM子模块和CNTRL_FSM子模块。检查语法错误:

(1)在Sources窗口中,选中SIMPLE_CALC.VHD模块,在Processes窗口中,展开Synthesize树,并双击CheckSyntax。

(2)双击ViewRTLSchematic,查看综合后的电路与设计目标电路是否相符。

(3)如果源文件中有语法错误,请修正语法错误后继续进行下面的步骤。

5.仿真,验证功能正确性

创建SIMPLE_CALC模块的测试平台,并运行仿真,验证功能正确性。

(1)选择菜单栏中的Project→NewSource。

(2)在SelectSourceType窗口中,选择左侧的VHDLTestBench,在右侧FileName栏中填入文件名SIMPLE_CALC_TB。

(3)单击Next按钮,软件弹出一个界面,询问测试平台文件与哪个设计文件关联,选择SIMPLE_CALC。

(4)在测试平台文件编辑窗口中,设置CLK的时钟频率为50MHz。

(5)对测试平台文件进行仿真。

(6)在仿真过程中,将需要查看的子模块中的信号拖入仿真波形窗口。

为了验证功能的正确性,读者可以将所有希望查看的信号都拖入仿真波形窗口,仔细验证工程文件的功能正确性。

6.在FPGA中实现工程设计,并查看报告文件

使用ISE中的Place&Route工具实现工程设计,查看MAP和PAR的报告文件。

(1)在Sources窗口中,选中SIMPLE_CALC.VHD文件,在Processes窗口中,双击ImplementDesign,如图6.23所示。图6.23工程实现工具双击ImplementDesign,将执行器件实现之前所需的全部步骤,这些步骤包括:

● Translation:将全部的子模块或网表文件融合到一个网表中。

● Map:将网表中的逻辑用FPGA的底层资源替换,如slices,registers和I/O等。

● Placement:将Map后的资源分布到FPGA的固定器件元素中。

● Routing:对已经布局好的FPGA底层器件进行布线连接。

● Trace:对布局布线后的设计工程进行时序汇总,给出设计文件的最高运行频率等。

(2)工程实现全部结束之后,展开ImplementDesign树,显示所做底层的操作步骤及对应的报告文件,如图6.24所示。图6.24工程实现的全部操作步骤

(3)双击MapReport。这个报告中包括警告、错误和资源占用情况等全部信息。

报告中还包括工程实现所占用的分类FPGA器件资源。查看Map报告并尝试填写下面的表格。

(4)展开GeneratePost-Place&RouteStaticTiming,并双击AnalyzePostPlaceandRouteStaticTiming(TimingAnalyzer)。

(5) ISE界面弹出一个新的工具组件,这个工具打开后,选择工具栏中的AnalyzeAgainstAuto-GeneratedDesignConstraints按钮。如图6.25所示,由于在工程设计中,我们并没有加入任何的时序约束,因此这个报告会用默认的分析工具给出详细的时序报告。图6.25时序分析器的工具栏查看时序分析报告,并填写下表中的内容:6.8.5实验总结

在本实验中,我们完成了计数器工程的全部内容,学会了使用generate描述语句配置两种不同描述方式的模块。这个计数器工程已经是一个完整的工程了,下一步我们只需要将这个工程下载到FPGA器件中实际运行,并测试硬件系统电路即可。

6.8.6实验中的代码

文件对应的代码如下: 6.9实验九IP核应用实验

6.9.1实验介绍

本实验指导读者使用ISE中的XilinxCoreGenerator工具生成一个IP核, 在设计工程中将生成的IP核作为一个元件使用,并对其进行仿真验证。

6.9.2实验目标

●使用XilinxCoreGenerator工具生成一个IP核;

●在已有的工程文件中对IP核进行例化;

●对包含IP核的工程设计文件进行功能仿真。6.9.3实验过程

本实验中,我们将使用CoreGenerator工具创建一个块RAM核,使用这个核替换已有工程中的fifo_2048x8模块。

实验包含四个主要的部分:创建一个工程;生成新的核;在工程中对核进行例化;对修改后的核做功能仿真。

6.9.4实验步骤

1.创建一个新的工程

在\VHDL_LABS\目录下创建一个新的工程,新工程命名为LAB9。具体操作步骤如下:

(1)选择“开始→所有程序→XilinxISE9.1i”或直接在桌面双击XilinxISE9.1i的图标,打开ISE9.1i集成环境。

(2)在ISE中,选择菜单栏中的File→NewProject,打开创建新工程界面,ProjectName中填入工程名LAB9,在ProjectLocation中填入工程所在文件夹\VHDL_LABS\LAB9。

(3)在DeviceProperties窗口中,填写与实验一中相同的属性配置。

(4)单击Next按钮,在CreateNewSource窗口和AddExistingSources窗口中不做任何操作,在ProjectSummary窗口中确认工程信息后,单击Finish按钮完成新工程的创建。

(5)读者可以将光盘中LAB9的工程设计文件全部导入,如果没有光盘,请查看实验代码,创建对应的设计文件,并添加到工程设计中。在进行下面的步骤之前,请详细查看工程设计文件,并回答下面两个问题:

(1)触发数据向块RAM存储的PN码是什么?

(2)每一个数据通道需要用几个块RAM?

2.生成一个新的IP核

生成一个新的IP核,并命名为RAM_CORE,核的类型为双端口块存储器。

(1)选择菜单栏中的Project→NewSource;

(2)在SelectSourceType对话框中,选择左侧的IP(CoreGen&ArchitectureWizard),在右侧的FileName文本框中填入RAM_CORE。

(3)单击Next按钮。

(4)在SelectIP对话框中,展开Memories&StorageElements,展开RAMs&ROMs,选择DualPortBlockMemoryv6.3,如图6.26所示。图6.26选择IP类型

(5)单击Next按钮,确认IP信息后,再单击Finish按钮。

配置IP核的参数,配置的参数如下:

● Name:RAM_CORE。

● PortA:2048×8bits,writeonly,activehighSINITpin,initialvalue“0”。

● PortB:2048×8bits,readonly,noreadonwrite,activehighenablepin,activehighSINITpin,initialvalue“0”。

(1)如图6.27所示,设定IP核的参数。

● ComponentName:ram_core。

● WidthA:8。

● DepthA:2048。

● WidthB:8。

● PortAOptions:WriteOnly。

● PortBOptions:ReadOnly。图6.27设定IP核的参数

(2)单击Next按钮,选择PortA的SINITpin选项,如图6.28所示。图6.28选择PortA的SINIT选项

(3)单击Next按钮,选择PortB的EnablePin和SINITpin,如图6.29所示。

(4)单击Next按钮,最后一页的参数不需要改变,选用默认参数即可。

(5)单击Generate按钮,生成配置好的IP核。

CoreGenerate工具会自动关闭,请注意,新生成的核已经被加入到工程中,名字为ram_core.xco。图6.29设置PortB的相关参数

3.在VHDL源文件中例化块RAM的IP核

在fifo_2048x8.vhd中将第二步生成的IP核进行例化。

(1)在Sources窗口中,双击fifo_2048x8.vhd,在文本编辑窗口中fifo_2048x8.vhd打开。

(2)在Sources窗口中,选中ram_core.xco。

(3)在Processes窗口中,双击ViewVHDLFunctionalModel,在文本编辑器窗口中查看ram_core的实体定义。

(4)拷贝ram_core的实体定义部分,粘贴到fifo_2048x8.vhd文件对应位置,并修改为元件的声明和例化。

元件的声明和例化,也可以采用下面的方式:在ISE中打开CoreGenerator生成的ram_core.vho文件,并拷贝文件中的声明和例化内容到fifo_2048x8.vhd文件稍做修改。

(5) ram_core的例化如下所示:

4.功能仿真

建立测试平台文件fifo_2048x8_tb.vhd,对fifo_2048x8.vhd进行仿真。

将光盘中的fifo_2048x8_tb.vhd添加到工程中,如果没有光盘,请参照实验代码,自行输入。仔细查看测试平台文件,注意以下几点:

●测试平台首先向RAM的前16个地址写入数据,然后从这些地址中读出数据;

●常量misc_data用于RAM数据的初始化;

● read_data进程用于读取RAM中的数据。

运行测试平台fifo_2048x8_tb.vhd的功能仿真,运行时间为2500ns,查看波形文件验证核的连接是否正确。

(1)在Sources窗口中,选择Sourcesfor栏中的BehavioralSimulation,然后在文件结构树中选中fifo_2048x8_tb.vhd。

(2)在Processes窗口中,展开XilinxISESimulator,右键单击SimulateBehavioralModel,选择Properties。

(3)输入仿真时间为2500ns。

(4)单击OK按钮。

(5)双击SimulateBehavioralModel。

(6)查看波形窗口,验证波形输出是否与预期的结果相同。6.9.5实验总结

在本实验中,我们使用CoreGenerator工具生成了一个IP核,在已有工程中对生成的IP核进行声明和例化,并对包含IP核的工程文件进行了仿真验证。

6.9.6问题答案

(1)触发数据向块RAM存储的PN码字是什么?

PN码字是“10001101”,在pn_correlation模块中定义为generic参数K。

(2)每一个数据通道需要用几个块RAM?

每个FIFO的大小为2048×8,即16K比特,只需要一个块RAM就可以。

6.9.7实验中的代码

文件对应的代码如下:

6.10实验十数字时钟管理IP核实验

6.10.1实验介绍

本实验指导读者使用Xilinx的时钟管理IP工具配置具有多个时钟输出频率的数字时钟管理模块,并将这些时钟信号连接到全局时钟缓冲端口。

6.10.2实验目标

●使用数字时钟向导配置数字时钟管理IP核(DCM,DigitalComposerManager);

●将DCM的输出连接到全局时钟缓冲端口。

6.10.3实验过程

实验包含两个主要的部分:生成一个DCM模块;将这个模块在HDL代码中例化。6.10.4实验步骤

1.生成DCM模块

本设计中包含两个输入时钟。

● 66MHz时钟:clk_66。这是系统的主时钟,这个时钟在系统的整个工作过程中一直保持稳定有效,包括在系统上电和测试的过程中。

● 50MHz时钟:clk_50。这个时钟在系统上电和测试的过程中有可能被关闭。

为了在上电过程中测试系统,我们用DCM从系统的主时钟66MHz生成一个50MHz的测试时钟,然后用一个BUFGMUX选择使用外部输入的50MHz时钟或生成的50MHz时钟。两个时钟的连接方式如图6.30所示。图6.30DCM的连接方式创建一个新的工程。在\VHDL_LABS\目录下创建一个新的工程,新工程命名为LAB10。具体操作步骤如下:

(1)选择“开始→所有程序→XilinxISE9.1i”或直接在桌面双击XilinxISE9.1i的图标,打开ISE9.1i集成环境。

(2)在ISE中,选择菜单栏中的File→NewProject,打开创建新工程界面,在ProjectName中填入工程名LAB10,在ProjectLocation中填入工程所在文件夹\VHDL_LABS\LAB10。

(3)在Devi

温馨提示

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

评论

0/150

提交评论