现代DSP技术课件dspbuilder设计五至九章_第1页
现代DSP技术课件dspbuilder设计五至九章_第2页
现代DSP技术课件dspbuilder设计五至九章_第3页
现代DSP技术课件dspbuilder设计五至九章_第4页
现代DSP技术课件dspbuilder设计五至九章_第5页
已阅读5页,还剩482页未读 继续免费阅读

下载本文档

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

文档简介

第5章LogicLock优化技术5.1LogicLock技术的基本内容5.2未用LogicLock的数字滤波器设计5.3应用逻辑锁定技术5.4顶层设计优化5.1LogicLock技术的基本内容5.1.1LogicLock技术解决系统设计优化有FPGA开发经验的人都会有这样的体会:原来在硬件测试上十分成功的FPGA设计,在源代码并没有任何改变的情况下,仅仅是增加了一点与原程序毫不相干的电路描述,或甚至只改变了某个端口信号的引脚锁定位置,结果在综合适配后,原来设计的硬件性能将大为下降,如速度降低了,有时甚至无法正常工作。这时,如果比较改变设计前后的Floorplan图,会发现芯片内部资源的使用情况发生了巨大的变化。这表明,即使对原设计作极小的改变(更不用说对适配约束条件的改变),都会使适配器对原设计的布线(Routing)和布局(Placing)策略作大幅改变和调整。同时,当设计规模比较大时,人为很难直接介入布线/布局的优化。对于由许多基本电路模块构建成的顶层系统的FPGA开发,类似的问题将更加突出。例如,原来某一基本模块的FPGA硬件测试十分成功,包括工作性能、速度以及资源利用率等,但当将这些基本模块连接到一个顶层设计后,即使在同一FPGA中进行测试,也常发现各模块以及总系统的性能有所下降甚至出现无法工作的情况。事实上,如果能在设计基本模块时,就固定其布线/布局的原方案,即使在顶层文件的总体适配时,也不改变原来基本模块的布线/布局及其原来的优化方案,就能很好地解决上述棘手的问题。对此,QuartusII提供了一个优秀的设计技术,即逻辑锁定技术。使用这一技术,可以将设计好的电路系统或某一底层模块约束到FPGA中某个指定的区域上,并固定原来的布线/布局方案。这样一来,对于一项较大设计中的某一底层模块,不但在顶层的软件描述上是一个子模块(如例2-1),而且在FPGA芯片的总体适配中,此模块在硬件上便类似于ASIC设计中的一个标准模块,始终能保持自己原来的布线/布局方案,从而在任何大系统中都能保持原有的电路性能,就像一个被调用的独立的元件一样,不会由于顶层系统布线/布局的改变而改变基本模块的布线/布局结构了。有了逻辑锁定技术,面对大系统的设计,工程师们就可以将构成大系统的各模块进行分别设计,分别优化他们的布线/布局;适配约束,逐个地使它们分别获得最佳的工作性能,逐个优化并锁定它们的布线/布局方案;最后把它们连在一起形成性能优良的顶层系统。显然,逻辑设计锁定技术是SOPC单片系统优化设计及IP核成功拼装应用的有力保证。大规模系统的设计本身就已十分困难,而对大规模系统的优化将更加困难。优化工作在增加或更改内部设计元件时要进行大量的修改工作。一般地,对付复杂的大系统的设计的方法有:(1)使用模型设计、层次设计或递增设计方法;(2)使用好的EDA工具,使得整个设计和优化更容易;(3)使用已经优化好的IP核;(4)使用先前已优化好的被锁定了布局/布线的设计模块。比较图5-1所示的FPGA的传统设计流程与使用了逻辑锁定(LogiclLockMethodology)优化技术的流程可以发现,两种设计流程都是把整个设计系统分成若干个模块(这些模块可以是一个单独的电路功能块,或是电路中的部分元件,或是部分设计层次),在对每一模块单独设计好后,再把它们拼起来形成一个完整的系统。所不同的是,前者将系统中的各模块分别设计,并集成为系统,然后对整个系统进行优化和测试;而后者则将系统中的各模块分别设计和优化,并保持优化结果,最后进行模块集成和系统测试。图5-1FPGA的传统设计流程与使用了逻辑锁定优化技术的流程的比较如上所述,在传统设计流程中常常发生的情况是,对于每个模块来说,它们都能满足设计要求(良好的功能和速度指标等),但当将它们合成系统后,却不能达到原来的要求了。即使有时有的模块的功能满足要求,但当修改其它模块后,整体编译后会导致其它模块性能的改变,甚至下降。这是由于在传统设计流程中,EDA工具并不会对系统中的各模块单独优化及单独布局/布线。QuartusII的LogicLock技术则能很好地解决这一问题。它能很容易地完成对每一模块的设计、测试和优化,再将这些模块集成为一个系统,进行系统优化设计,同时又能很好地保持原来已设计好的每一单个模块的优化特性。当把这些模块集成为一个系统后,只需对模块之间的逻辑行为进行优化就可以了。显然,LogicLock技术通过允许设计者自主地控制特定模块在FPGA中指定的区域中的布线与布局,以及单独的优化,并能在更高层次的设计中保留模块原有的性能特点,从而大大加强了DSP的SOC设计的优秀性能和灵活性。5.1.2LogicLock的基本内容使用LogicLock设计流程,首先要求建立逻辑锁定区域,这就是设计模块放置的区域,即所谓的LogicLock区。其中应包含能完成此模块电路构成的逻辑资源,如逻辑宏单元LCs、ESBs、EABs等。一旦确定了这个区域,QuartusII就会把指定模块适配在这个区域中。设定LogicLock区域的方法有3种:●使用Tcl脚本命令;●使用QuartusII的Floorplan编辑器;●使用LogicLock窗。LogicLock区域的特性主要有两个标志:“大小”和“位置”。“大小”是指此区域的高和宽,其单位不是距离而是逻辑单元;而“位置”是指在目标器件中锁定区域在Floorplan图上所处的位置。区域的位置状态有两种:“锁定”状态和“浮动”状态。如果区域是浮动的,则由QuartusII在优化过程中确定具体位置所在。如果区域的大小设定为“自动”,QuartusII将自动调整大小,以便将设计模块正好能放进此区域中。区域是一个长方区域,区域的起点定义为左顶角处,位置状态定义为“锁定”和“浮动”,大小定义为“自动”和“固定”两种,表5-1给出了详细说明。表5-1锁定区域分区类型位置大小说明浮动自动这是逻辑锁定约束条件中最灵活的一种,在适配中QuartusII自动根据优化情况确定最终的锁定区域的大小与位置浮动固定这种方式中是假设定义的锁定区域的大小是合理的,否则不利于逻辑资源的有效利用锁定固定这种约束条件具有最小的灵活性,由设计者确定锁定区域的一切具体情况5.1.3锁定区域的基本方式如果将一个基本模块锁定于一个区域中并进行了成功的适配后,还要将其使用于更高层次的设计中,设计者对于此模块的锁定方式有两种选择:1.仅锁定区域的大小和位置(包括选取表5-1中的任何一种方式)在这种情况下,QuartusII在顶层设计的适配中,只负责将原模块放置在所定义的锁定区域中,而在此区域中,此模块的电路放置不固定,即只能保证在更高层的设计锁定区域的大小和位置不变,但不保证原模块在此锁定区域中的电路的布线/布局方式不变,从而无法保证在此后的更高层设计适配后模块的电路性能不变。2.对原锁定区域的模块电路布线/布局信息进行“反注”(Back-annotate)通过“背注”操作,QuartusII根据背注信息完全锁定在指定的LogicLock区域中该模块电路中各元件的电路结构的确定位置。即能很好地保持在锁定区域中各电路元素的适配位置,从而在当将此模块集成到高层乃至顶层设计适配后,能最大程度地保持此锁定模块原来的工作性能。较好的设计方法可以这样:为了确保锁定区域中的电路模块优化后其特性不致在以后的高层设计适配中发生改变,同时高层设计适配中又有较好的灵活性,以利于系统级适配的优化,可以首先将模块在锁定区域中的电路设置的基本元件的布线/布局固定下来,从而不仅锁定了逻辑区域,同时也锁定了模块的电路性能,然后在高层的设计中令含有此模块的锁定区域为浮动状态。这样以来,在QuartusII对高层的设计将各模块统一进行适配和优化中,为各模块找到了最合适的位置,从而有利于顶层系统的优化。在系统适配中,虽然原设计模块的锁定区域是浮动的,但在该区域中构成该模块的电路元件与该区域的相对位置是不变的。因此,只要高层电路系统的适配与原低层模块的锁定适配是在同一系列的FPGA中,就能保证原模块的性能不变。此外,这种保持了原特性的浮动模块的作用类似一个已优化好的独立的电路元件,它不仅能作为原高层设计中的一个电路模块,还能进行多模块例化(同模块复制,或能移植到其它电路系统中)。这种方式产生的“电路元件”与仅仅以VHDL设计实体代码构成的“元件”是不一样的。前者是一个成熟的、已优化好的电路模块,只要在同种系列的目标器件中实现,不论是单独使用,还是用作更大系统的一个例化元件,都能保证原模块的技术性能不变;而后者不具有这样的特性,因为后者即使在同一系列的目标器件中,由于不同的外部条件和不同的高层次设计,或由于顶层设计的微小改变,它们都会表现出不同的电路特性。假如一个子区域是浮动状态的,QuartusII就会在优化过程中为此子区域在母区域中确定一个合适的位置;假如一个子区域是锁定状态的,QuartusII也将保持子区域在母区域中的相对位置不变。设计者必须注意,逻辑锁定区域的层次与工程设计的层次概念是不同的。前者是一组定义了“母—子”关系的锁定区域,这个区域只能由QuartusII的区域锁定工具划定逻辑布局位置间的关系,而后者则不同。后者反映的是设计源代码中的结构层次,以及模块间的例化关系。一般地,LogicLock区域不一定反映设计中的逻辑层次。图5-2和图5-3是两个不同的设计层次示例,其中图5-2的顶层设计是B,它包含两个模块:IP核与A模块。设计者是在定义了设计层次后再确定逻辑锁定层次的。逻辑锁定设计中,可以先建立一个LogicLock母模块区域,将顶层设计B定义于此区域中,然后建立两个子区域,把IP模块和A模块分别设定放置在两个子区域中。这样以来,锁定区域的划分正好反映了设计的层次。但是,设计者也可以将IP核模块放在主区域中,而把顶层设计B放在子区域中,并将模块A中的部分内容放在这个子区域中,这当然也不失为一种锁定区域的定义方法。但最佳的区域定义应根据模块组织情况及电路的特性来具体确定。图5-2模块设计层次图5-3层次化设计流程5.1.5LogicLock技术的不同应用流程如上所述,在传统的设计流程中,同样一个模块在单独适配与在顶层设计中适配,其性能有可能不一样。为了解决这个问题,LogicLock提供了一种增量适配方法,步骤如下:1)由逻辑综合器产生“原子级”网表文件。原子级网表文件就是该文件中以最基本的元件(如与门、非门、触发器等)和基本连线方式表达的工程设计。所谓“原子级”就是指底层基本逻辑文件在原子级网表文件中,所有的“原子”的结构与名称(如某逻辑门)是不会随着对系统的编译适配而改变的。2)使用LogicLock设置确定设计模块在锁定区域中的具体放置位置模块在该区域中的特性以信号节点的设置和层次安排。原子级网表的名称规定了信号节点的设置。于是,在含有这些模块的顶层设计编译适配中,QuartusII将完全遵循原模块中的所有约束条件。在以下叙述的模块化、层次化、增量法和分组法的所有设计流程中,都将使用上述保持模块特性的方式进行适配。1.模块化设计流程以图5-2为例,这里显示的是一个模块化的设计流程。顶层设计B仅仅是对IP和A作了例化,即B只是确定了这两个子模块的连接关系,没有其它的逻辑设计内容。设计者可以首先分别对这两个底层模块进行优化(主要对A模块,因为IP核是一个已被优化了的设计),以便在顶层设计中保持原有的优化特性。具体方法是,在层次化设计中,设计者首先将IP核与A模块设定为工程,然后再分别对各工程进行设计和优化。优化中利用逻辑锁定技术将各模块放置在LogicLock区域中,或放在设计者决定的锁定区域中的某个锁定层次中,分别使各模块在自己的锁定区域中优化,以便满足原设计的要求。然后,设计者将这些优化并锁定了区域的设计模块所对应的原子级网表文件输入到顶层系统B中,接着由QuartusII在B中确定此2模块的锁定位置(区域)。最后,设计者就可以对整个系统进行编译和测试了。2.层次化设计流程LogicLock技术允许层次化的设计流程。图5-3是一个层次设计流程的示例,其中包含模块D、E和F。模块E还包含来自图5-2的模块B。如果模块D对于整个系统的性能并不很重要,那么可以首先使用硬件描述语言描述这个模块的功能,而在设计中不必专门对此项设计规定什么布线/布局的约束信息。如果已经确定模块E和F的性能对于总系统来说比较重要,设计者就可以分别对它们进行优化设计。考虑到模块E是由多个模块层次构成的,而模块F比较简单,设计者可以首先对模块F进行逻辑锁定、优化设计和适配,并得到对应于F的原子级网表文件。为了获得模块E的原子级网表文件,需要分两步来走:第一步,先按上节方法获得B的原子级网表文件,然后将此网表连同C输入模块E中;第二步,对E进行优化设计,最后将E的网表文件连同G和F输入进顶层设计G中进行全系统设计。3.增量法设计流程逻辑锁定技术使得增量法设计流程方便、有效。如图5-4所示,顶层设计G含有4个模块,设计一开始就可以从顶层设计入手,但可以逐个加入模块进行区域锁定、优化和布局/布线。完成以后,再加入下一个模块。如前所述,由于对每一模块都使用了锁定技术,所以,当在顶层中加入新模块后,原来已存在的模块的性能不会由于整个系统的编译、综合和适配优化而有所改变。图5-4增量法设计流程4.分组法设计流程分组法设计流程就是允许设计者为系统模块布置建立一个Floorplan(如图5-5),由不同的工程师分别设计各子模块,最后由系统工程师完成集成设计。具体步骤如下:(1)将设计系统分成模块A、B和C。(2)通过例化模块A、B和C建立一个顶层设计工程,此顶层设计中规定各模块间的连接关系,并设定工程的时序要求和布局约束。如果设计者知道每一模块的逻辑资源占用的大致情况,则可将每一模块放置在各自定义的逻辑锁定区域中。(3)为每一模块单独设定一个工程,并且对每一工程使用系统级的设计中给定的设置(包括优化要求的设置)。(4)分别综合、编译适配和优化这些模块,并仿真测试这些模块的性能,了解是否达到最初的要求。

(5)如果必要,可以增加一些逻辑锁定的约束条件,以便能在总的系统设计中保持这些模块的优化结果。(6)一旦完成对单个模块的设计,就将这些模块连同设定的约束条件输入顶层设计中。(7)最后由系统工程师完成对顶层设计进行总体的编译和仿真。图5-5分组设计流程5.1.6系统性能强化策略事实上,逻辑锁定技术也能直接改善系统的性能,即这些系统并不必按如前所述的由多个模块组成。对于这种系统,QuartusII的逻辑锁定功能通过合理组织放置和固定系统电路中的基本元件,同样能优化系统的性能。利用逻辑锁定技术实现这一目的的方法,就是所谓的系统性能强化策略。这一策略的有效性取决于系统特定的电路结构特点。具体策略如下(定义锁定区域的原则):(1)如果电路结构与设计层次十分相似,锁定区域就可以根据设计层次来设定。通常,这些设计系统是由关系十分紧密的模块构成的,而且其中每一模块的构成逻辑是独立的,模块间的信号联系是由良好的通信界面实现的。(2)根据关键通道路径来定义锁定区域。一般地,这些通道路径比较长,且跨越多个其它模块。这要确保被锁定的节点在关键路径上,或者模块包含关键路径。这种设计策略能达到改善系统性能的目的。(3)为了降低电路连接处的延时以及连线的密度,可以将具有高扇出和高扇入的电路结构设定为锁定区域。这往往是一种有效的方法。由上可见,利用逻辑锁定技术是可以选择多种方式的。可单独对各个模块进行优化锁定再集成,也可以将所有的模块一开始就集成在顶层系统,再根据结构情况进行锁定优化。在实际设计中,可以根据具体情况使用不同类型的锁定技术和锁定流程或是混合方法进行系统适配和布局/布线的控制,达到优化的目的。但一般最好将锁定区域定义为自动大小和浮动位置,这样,QuartusII就能在适配中为系统设计,为锁定区域找到最合适的高宽尺寸和定位。如果各模块是在单独锁定、优化后输入顶层设计的,就可以按照上述的4个设计流程来进行系统设计。需要注意的是,对于每一优化的模块而设定的逻辑锁定的各项设置包含两个重要内容:一是逻辑锁定区域的信息;二是“背注”后的所谓原子级网表的信息。另一种利用逻辑锁定技术进行优化设计的方法,就是以上提到的不经过对底层单个模块进行单独锁定优化,而是直接从顶层系统出发,根据具体结构情况确定锁定部分后进行优化。这种方法可使QuartusII将某些特定的节点放在锁定区域中,并可在器件中定义为浮动而允许QuartusII在适配中可移动。利用这种方法,设计者可以将来自不同模块的电路元素(节点、元件、连线)放在锁定区域中,最后由QuartusII对整个系统进行优化设计。熟悉Max+plusII的读者会发现LogicLock区域十分类似于Max+plusII中的“打包”(Cliques)。因为打包允许LCs(逻辑宏单元)组合在一起应用。设定锁定区域为“自动”时,就类似于Max+plusII中称为“最佳打包”(BestClique)的功能设置。而标志着对“行”与“列”的锁定区域的固定大小则类似于行或列的打包。此外,LogicLock区域也类似于“定制区域”的概念。因为一个可定义的区域可以被设定为实体和节点。因此,如果LogicLock区域的位置是锁定的,则这个区域便类似于一个定制区域(Customregin)。5.1.7锁定区域的移植与再利用逻辑锁定技术使得设计模块的移植和有效再利用变得十分方便。这是因为已被优化和布线/布局锁定的模块能很容易地被其它的设计工程调用,并能保持原有的性能。对于那些比较常用的模块,由于已经作了锁定和优化,可以组织一个模块库,用于其它更大系统的设计,提高系统设计的效率和性能。这是由于这些库中包含针对这些模块的原子级网表文件、LogicLock的设置信息,以及详细的使用报告(包括模块的性能指标和逻辑资源的占用情况等)。需要注意的是,虽然这些优化模块在与其诞生的目标器件同种系列的器件中都能获得好的工作特性,但只有将其用在最初设计的同型号器件中才能获得最好的性能。这是因为,同系列而不同型号的目标器件的结构特点毕竟与原来的器件的结构是有一定差别的。因此,要实现完全相同的布线/布局是不可能的。不过如果在设计中选用的目标器件属于同系列器件,若设定这些加入的模块为浮动状态,则能获得相似的性能指标。这种方式比较适用于一个较大的系统设计在同系列目标器件中的情况。即当用这种目标器件无法获得该模块与在原器件中的完全相同的布线/布局且还有许多模块有待例化连接的情况下,设定这些模块为浮动状态较好。5.2未用LogicLock的数字滤波器设计5.2.1数字滤波器结构及其VHDL描述图5-6是一个16阶滤波器的电路框图,它由4个4阶滤波器组成,即由4个4阶滤波器例化而成,其RTL电路图如图5-8所示。其中每一个4阶滤波器的结构如图5-7所示,其RTL电路图如图5-9所示。它们的源代码是例5-1、例5-2、例5-3和例5-4,其中例5-4是滤波器顶层设计,例5-3是4阶滤波器模块的顶层设计。图5-616阶滤波器顶层结构图5-74阶滤波器图5-816阶滤波器RTL电路图图5-94阶滤波器RTL电路图【例5-1】16位加法器源代码。libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityadderisport(clock :in std_logic; r1x :in std_logic_vector(15downto0); r2x :in std_logic_vector(15downto0); r3x :in std_logic_vector(15downto0); r4x :in std_logic_vector(15downto0); y :out std_logic_vector(15downto0));end;architecturertlofadderissignaltmp:std_logic_vector(15downto0);begin process(clock) begin ifrising_edge(clock)then tmp<=(r1x+r2x)+(r3x+r4x); endif; endprocess; y<=tmp;end;【例5-2】8位乘法器源代码。libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitymultisport( clock :in std_logic; a_in :in std_logic_vector(7downto0); b_in :in std_logic_vector(7downto0); a_out :out std_logic_vector(7downto0);b_out :out std_logic_vector(7downto0); r :out std_logic_vector(15downto0));end;architecturertlofmultissignaltmp_a,tmp_b:std_logic_vector(7downto0);begin process(clock) begin ifrising_edge(clock)then tmp_a<=a_in; tmp_b<=b_in; r<=tmp_a*tmp_b; endif; endprocess; a_out<=tmp_a; b_out<=tmp_b;end;【例5-3】4阶滤波器顶层设计代码。libraryieee;useieee.std_logic_1164.all;entityfilterisport(clock :in std_logic; din0x :in std_logic_vector(7downto0); coef0x :in std_logic_vector(7downto0); din4x :out std_logic_vector(7downto0);coef4x :out std_logic_vector(7downto0); result :out std_logic_vector(15downto0));end;architecturertloffilteriscomponentmultport( clock :in std_logic; a_in :in std_logic_vector(7downto0); b_in :in std_logic_vector(7downto0); a_out :out std_logic_vector(7downto0); b_out :out std_logic_vector(7downto0); r :out std_logic_vector(15downto0));endcomponent;componentadderport ( clock :in std_logic; r1x :in std_logic_vector(15downto0); r2x :in std_logic_vector(15downto0); r3x :in std_logic_vector(15downto0); r4x :in std_logic_vector(15downto0); y :out std_logic_vector(15downto0));endcomponent;signalcoef1x,coef2x,coef3x,din1x,din2x,din3x:std_logic_vector(7downto0);signalr0x,r1x,r2x,r3x:std_logic_vector(15downto0);begin

mult_i0:multportmap(clock,din0x,coef0x,din1x,coef1x,r0x); mult_i1:multportmap(clock,din1x,coef1x,din2x,coef2x,r1x); mult_i2:multportmap(clock,din2x,coef2x,din3x,coef3x,r2x); mult_i3:multportmap(clock,din3x,coef3x,din4x,coef4x,r3x); adder_i:adderportmap(clock,r0x,r1x,r2x,r3x,result);end;【例5-4】16阶滤波器顶层设计代码。libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitylargefilterisport(clock :in std_logic; din0x :in std_logic_vector(7downto0); coef0x :in std_logic_vector(7downto0); result :out std_logic_vector(15downto0));end;architecturestroflargefilteriscomponentfilterport( clock :in std_logic; din0x :in std_logic_vector(7downto0); coef0x :in std_logic_vector(7downto0); din4x :out std_logic_vector(7downto0); coef4x :out std_logic_vector(7downto0); result :out std_logic_vector(15downto0));endcomponent;signalcoef4x,din4x,coef8x,din8x,coef12x,din12x,coef16x,din16x:std_logic_vector(7downto0);signalr0x,r4x,r8x,r12x:std_logic_vector(15downto0);begin filter_i0:filterportmap(clock,din0x,coef0x,din4x,coef4x,r0x); filter_i1:filterportmap(clock,din4x,coef4x,din8x,coef8x,r4x); filter_i2:filterportmap(clock,din8x,coef8x,din12x,coef12x,r8x);filter_i3:filterportmap(clock,din12x,coef12x,din16x,coef16x,r12x); process(clock) begin ifrising_edge(clock)then result<=r0x+r4x+r8x+r12x; endif; endprocess;end;5.2.2滤波器设计和结果观察滤波器设计流程如下:1.在QuartusII中输入源文件并建立工程根据第2章介绍的方法,首先对例5-1、5-2、5-3和5-4进行编辑输入,然后分别存在D:\largefilter文件夹中,并设largefilter.vhd为工程。目标器件选为EP20K200EQC240-3。2.设定时钟约束并编译在Assignments菜单中选“Settings”,然后在Settings窗中的TimingSettings项中选中“Clocks”,并在“Defaultrequiredfor”栏键入“50”,选择“MHz”,如图5-10所示。最后进行编译,即启动Processing?StartCompilation。图5-10设定设计要求最高时钟频率3.了解编译结果编译结束后,可在编译处理信息栏处看到内部寄存器间最高时钟频率fmax=48.5MHz,不能达到原设定的50MHz的要求(图5-11)。为进一步了解本项设计的结果,打开菜单Processing中的“CompilatinReport”窗,首先点击左栏TimingAnalyses左侧的“+”号,并点击“fmax”项,于是将显示如图5-12所示的信息,这些信息表明未能达到50MHz的要求。图5-11编译处理信息窗图5-12最高时钟频率时序分析窗4.观察Floorplan最后点击编译报告“CompilatinReport”栏的“FloorplanView”,以便了解适配器在FPGA中的版图的资源利用情况(图5-13)。由FloorplanView中可见,本项设计所用的逻辑宏单元在整个Floorplan中都无序地散布着,这显然是没有进行逻辑锁定的结果,这种布局(Placement)方案常常不利于资源和时钟速度的优化。图5-13Floorplan中的逻辑资源应用情况5.3应用逻辑锁定技术在此,以上面给出的数字滤波器的结构方案为例,详细说明QuartusII的逻辑锁定技术的使用方法。如上所述,逻辑锁定形成适配布局约束,从而可以分别优化并固定顶层设计中各层次中的模块,以便在后续的设计编译中,或在更高层次的编译调用中,使得设计项目在适配中保持原模块的布局结构以及相应的硬件特性。在利用逻辑锁定技术的过程中,一旦将设计模块以某种方式进行逻辑锁定后,即可以VerilogQuartusMapping文件形式(*.vqm)将其优化综合的结果存盘,以便在必要时输出给更大(更顶层)的设计调用。5.3.1底层模块设计及其VQM文件保存以下将给出顶层设计Largefilter的底层模块filter的逻辑锁定设计流程,以及以VQM文件方式存盘的方法。最后可以将此VQM文件输入到更顶层的设计Largefilter工程中进行总体优化设计。VQM文件属于原子级网表文件。1.建立待优化模块filter为工程由上节可以知道,filter是大滤波器largefilter的底层基本模块,对这个模块的锁定、优化有利于对整个设计系统的优化。为此,应该首先解决其逻辑锁定方面的适配。为了设定filter模块为工程,首先将源程序例5-1、例5-2、例5-3存入一单独文件夹中,如D:\filter,然后打开QuartusII,按照第2章介绍的方法设定D:\filter中的filter.vhd为工程,并选EP20K200EQC240-3为目标器件,最后的工程设置信息如图5-14所示。

2.设置默认需求的最高时钟频率在编译前,需对filter工程作一些设置。这里首先根据上一节介绍的方法设置默认需求的最高时钟频率,即在如图5-15所示的窗口选择TimingSettings项下的“Clocks”,然后在Defaultrequiredfrequency栏键入“50”,并选择“MHz”。图5-14filter工程设置信息图5-15设定设计要求最高的时钟频率3.设置Settings对话框在Assignments菜单中选择“Settings",在Settings对话框的Category栏中选择CompilerSettings项目下的“Fitting”,显示出的“Fitting”框如图5-16所示。在Settings的“Timing-drivencompilation”栏,确认已选定“Opitimizetiming”。为了在优化子模块时将寄存器放置于I/O单元中,需关闭“OptimizeI/Ocellregisterplacementfortiming”项。图5-16适配设置窗4.设置VQM输出文件在图5-16中同一CompilerSettings项下,选“Synthesis”,然后在Synthesis框中打开“Saveanode-levelnetlistintoapersistenesourcefile”(如图5-17所示),在“Filename”栏中填入filter优化设计后输出的VQM文件名,并指定此文件在产生后存入顶层文件largefilter.vhd所在的文件夹中,即输入:d:\largefilter\fiter.vqm,以便输出给顶层文件的优化设计(假设d:\largefilter为顶层设计所在目录,且其中含有顶层设计文件largefilter.vhd),最后点击“OK”,关闭Settings框。图5-17设置VQM文件存储路径5.对设计进行分析与综合现在开始对设计文件进行分析、排错和综合。在Processing菜单中选择Start?StartAnalysis&Synthesis,进入逻辑综合。注意此综合是在未进行逻辑锁定的情况下进行的。5.3.2确定逻辑锁定区域及其特性被逻辑锁定的区域是一种布局/布线的约束,设计者可以在大规模的FPGA中的物理资源区域中任意定义一矩形区域,方法是在TimingClosurefloorplan或currentAssignmentsfloorplan中,或甚至在已指定的逻辑锁定区域中设定一个逻辑锁定区。设计者可以通过上述方式将设计模块的端口节点或设计实体(设计模块)指定在它设定的逻辑锁定区,使编译器在综合与适配过程中将指定的节点或设计实体放入逻辑锁定区域中。设定后,可以在floorplan中看到逻辑锁定的确切位置。如5.1节所述,所有的逻辑锁定区域都由两个参数定义,即大小和状态。表5-2给出了三种不同类型的逻辑锁定区域。表5-2不同类型的逻辑锁定区域逻辑锁定区域类型说明区域大小固定,区域所在位置也固定,即锁定状态锁定区域有确定的高、宽,区域位置定义于芯片物理资源中的确定位置处区域大小固定,区域所在位置不固定,即浮动状态锁定区域有确定的高、宽,该区域的位置由Quartus II在编译中作优化选择区域大小不固定,即大小自动,区域所在位置不固定,即浮动状态锁定区域的大小以及区域所在的位置都由Quartus II在编译中自动作优化选择1.定义逻辑锁定主区域定义逻辑锁定主区域(母区域)的步骤如下:1)打开逻辑锁定区域定义窗在Assignments菜单中打开“TimingClosureFloorplan”窗,以便及时观察被锁定区域的大小和位置。然后在同一菜单下打开逻辑锁定区域定义窗“LogiclockRegionsWindow”(如图5-18)。图5-18逻辑锁定区域定义窗2)建立一个逻辑锁定主区域为了建立一个逻辑锁定主区域,双击图5-18中的《new》,便产生一个可编辑框。在此区域键入待锁定的实体名“filter”,作为对此区域的命名,然后按回车键“Enter”,于是一个含有默认大小和状态的逻辑锁定区域就出现在TimingClosureFloorplan中(见图5-19和图5-20)。图5-19已定义了锁定主区域的实体名图5-20TimingClosureFloorplan中被锁定的filter区域3)确定逻辑锁定主区域的大小和状态双击图5-19所示的逻辑锁定窗中逻辑锁定区域名“filter”左旁的文件夹符号,将弹出逻辑锁定区域特性定义对话框,即设定filter特性的“LogiclockRegionProperties”窗口(如图5-21)。点击此窗的“Size”块,选择“Fixed”,即选此锁定区域为固定大小的区域,然后在“Settings”栏中选宽Width为“1”(1个MegaLABs宽),高Height为“5”(行)(如图5-21),再点击“Setsize”以确认之。然后点击“Location”块,在“state”下选择“Floating”,即定义逻辑锁定主模块为Floating状态。最后点击“OK”,关闭此窗。图5-22是设定后的filter域的参数窗口,图5-23是TimingClosureFloorplan中被锁定的主区域filter的定义情况。图5-21逻辑锁定区域特性定义窗口图5-22定义了filter域的参数窗口图5-23在TimingClosureFloorplan上所能见到的锁定区域2.定义逻辑锁定子区域定义逻辑锁定子区域的步骤如下:1)设定第一个逻辑子区域名在图5-22的LogicLock窗中,选择锁定区域名“filter”,并点击鼠标右键,这时将在鼠标箭头端弹出一菜单(图5-24),点击此菜单中的“New”项,即在LogicLock窗口产生一个名为Region_0的默认子区域名(图5-25)。双击如图5-25所示的“Region_0”名,将此名改为“mult3”,作为filter中第4个乘法子模块区域名,按回车键“Enter”。图5-24定义逻辑锁定子区域菜单图5-25逻辑锁定子区域默认名2)设定第一个逻辑子区域的大小和状态双击“mult3”名旁的文件夹符号,在弹出的如图5-21的对话框中点击“Size”块,选“Fixed”,并分别在Settings项下选“Width”和“Height”为1,点击“Setsize”钮以确认宽高选择。然后再点击“Location”,选择状态State为“Floating”(如图5-26)。最后点击“OK”,关闭图5-26所示的窗口,于是获得图5-27所示的逻辑锁定区域参量栏。图5-26逻辑锁定区域特性定义窗图5-27逻辑锁定区域参量栏3)设定其它同类逻辑子区域名及其大小和状态依此类推,用与以上相同的步骤和参数选择法,产生名为mult2、mult1和mult0锁定的子区域。它们的区域大小都选“Fixed”,宽为1MegaLAB,高为1Row,状态为Floating。完成后的LogicLock表如图5-28所示。图5-28完成所有逻辑锁定区域后的参量栏事实上,到此为止,利用LogicLock窗指定了一个名为filter的空的锁定区域,并在其中又定义了4个空的子锁定区域,这些区域有待将相应的设计实体放在其中。注意:若将鼠标移近锁定区域表的“filter”名处,会产生一个对此名的说明框(如图5-29),在此说明框的最下行标有“Member:None”,说明锁定区域尚未有被定义进的实体。图5-29鼠标移近锁定模块名后产生的参数说明栏5.3.3将设计实体移至锁定区域将节点和实体定义于逻辑锁定区域有多种方法,如用“AssignmentOrganizer”对话框来实现,也可直接用拖动的方法来实现。以下首先叙述前者的方法,将设计实体主模块filter及其4个子乘法模块分别定义进图5-28栏对应的锁定区域中,具体步骤如下:1.为导入主模块逻辑打开“AssignmentOrganizer”窗口首先点击工程管理窗,即点击左上角的CompilationHierarchies栏中的工程名“filter”左旁的“+”号,使其显示出所在工程的低层次中的4个子模块:mult_i3.mult_i2,...。然后点击“filter”名,再点击鼠标右键,即弹出如图5-30所示的菜单,然后点击此菜单中的“AssignmentOrganizer”项,从而出现一个如图5-31的对话框。

图5-30右键点击工程名filter后出现此菜单图5-31在此框中将设计模块定义进对应的逻辑锁定区域中2.指定主模块进入的逻辑锁定区域名点击此对话框的“LogicLockRegions”左侧的“+”号,从而出现语句“Clickheretoaddanewassignment”,点击之,将出现一Region栏,在Region栏中选择“filter”(图5-32),表示指令编译器在适配时将原设计实体filter放置在刚才定义好的名为“filter”的同名逻辑锁定区域中。图5-32选择设计实体filter的布局区域3.将主模块filter指定在同名逻辑锁定主区域中再点击右侧的“Add”,即确定将设计实体定义进了逻辑锁定区域“filter”中,最后点击“确定”即完成此工作。这时如果将鼠标移近LogicLock表中的filter名处,出现的说明框(如图5-29所示)的最下行就不再是“Members:None”,而是标出“Members:filter”,说明已将工程实体filter定义进了逻辑锁定主区域filter中。4.将某一子模块指定在对应逻辑锁定子区域中以同样的方法可以分别将图5-30所示的filter工程的子模块mult_i3,mult_i2,mult_i1和mult_i0定义进逻辑锁定子区域中。例如用鼠标右键单击编译层次窗口(图5-28)中的mult:mult_i3,并在出现的菜单中同样选择“AssignmentOrganizer”项(见图5-33),然后进入图5-31所示的对话框,并如图5-32所示选择mult3,从而将子模块mult_i3定义进mult3锁定子区域中。最后将鼠标移近LogicLock窗的mult3名处(如5-29所示),从出现的说明框的最下行的信息:Members:mult:mult_i3,可以了解到已将模块定义进了此区域中。图5-33右键点击filter的子模块5.将其余子模块指定在对应逻辑锁定子区域中可以用相同的方法分别将余下的3个子模块定义进对应的子区域中,用拖动的方法有时显得更为直接。如图5-34所示,左上方是工程管理栏(或工程层次结构信息栏),它显示指定的工程名,以及此顶层工程包含的各底层模块;下方是编译处理方式及进度信息栏;再下方是编译处理情况报告;最下方是逻辑锁定栏,含有关于各层次的锁定区域及其锁定参数;右方为编译报告菜单,其左侧显示的是TimingClosureFloorplan。图5-34可以用直接拖动的方法将模块拖到锁定区域中6.用拖动法将逻辑功能块指定在锁定区域中如果欲使工程中的某设计层次定义于指定的逻辑锁定区域中,可以用鼠标点住工程管理栏中的工程名(如filter)或子模块(如mult:mult_i3),将其拖到最下方的LogicLock栏中指定的区域上(如filter,或mult_i3),然后再放开。检查是否已将设计模块定义进相应的逻辑锁定区域中(即是否已拖入逻辑锁定区)。检查方法是将鼠标移至该锁定区域的名称上,然后了解自动跳出的信息说明表上最下方的注名(如图5-29所示)“members:”。5.3.4编译优化锁定后的filter模块在对以上已锁定逻辑区的filter工程进行编译的过程中,编译器将filter工程的布局/布线全部在已指定好的逻辑锁定区域中进行,并且根据此前设定好的所有时序要求(如50MHz的最高时钟要求)进行优化,最后产生一个适用于更大(更高层)电路系统设计的VQM文件,即filter.vgm,此文件中包含了filter工程的所有特性和特征。编译结束后,可以了解设计项目对时序要求的优化情况。以下进行编译并了解编译情况。在Processing菜单中选择StartCompilation开始全程编译。为了解时序优化结果,在Processing菜单中选“CompilationReport”项,然后点击“TimingAnalyses”,以及子目录中的“fmax”,即可得到如图5-35所示的时钟速度表,从中可以看出优化后能够满足原设定的fmax时钟频率。图5-35编译后的时钟频率信息资源分布情况可以从不同类的floorplan图中看到。在Assignments菜单中选TimingClosureFloorplan,在该图的右下角即为filter的锁定区域(图5-36)。由于定义filter为floating状态,所以右下角的位置是编译器自动选定的。在filter区中从上自下有5个子区域,最上的区域是子模块mult1,第3个区域是mult2,第4个区域是mult0,最底层的区域是mult3。由于它们的状态都设定为浮动的,所以其相对位置也是由编译器自动确定的。图5-37所示的是“LastCompilationFloorplan”面,从中可以更清晰地看到锁定区域中逻辑宏单元的占用情况。图5-36floorplan中filter的4个子模块的逻辑锁定情况如果要更详细地了解Floorplan中的资源使用情况,可以在View菜单中的Routing项中分别选择ShowNodeFan-In,ShowNodeFan-out等观察项目,以便了解各逻辑宏单元与某单元连接关系(见图5-38)。图5-37LastCompilationFloorplan中filter的4个子模块的逻辑锁定情况图5-38在LastCompilationFloorplan中利用View菜单可更详细地了解逻辑锁定情况5.4顶层设计优化注意,如果是新打开QuartusII,则需使用File菜单中的“Openproject”项打开前面设计好的filter工程。下面是将filter工程的设计约束,包括逻辑锁定等信息以一个网表文件的方式输出到顶层工程文件夹中。这个文件即为ESF文件(该文件记录了LogicLock信息),它包含了filter设计中的所有约束信息,如锁定区域的大小、位置、子模块的所有节点等。在底层设计的filter工程中,将优化设计特性以ESF文件的方式表达和存盘称为“ImportLogicLockRegions”,即输入逻辑锁定区域文件,而将此ESF文件输出给顶层设计Largefilter称为“ExportLogicLockRegions”,从而顶层设计Largefilter即可获得filter设计中所有逻辑锁定的约束条件,以此来优化顶层设计布局/布线适配方案。5.4.1记录锁定信息如果对以上filter工程的设计结果满意,则可以用ESF文件记录下filter工程所有逻辑锁定相关的信息,如大小、位置、锁定的内容。为产生ESF文件,可以按以下步骤进行:(1)打开“LogicLockRegionsWindow”窗。(2)在“LogicLockRegionsWindow”中,双击filter名左旁的文件夹符号,弹出“LogicLockRegionProperties”对话框。(3)在“Contents”页,点击“Back-AnnotateContents”按钮,以完成适配信息“背注”。当出现“Denmoteallcellassignments”提示后,点击“Yes”,这时就可以在“Back-annotatednodes”栏中见到filter工程在锁定区域中各节点在floorplan中各逻辑宏单元的位置信息了(见图5-39)。最后点击“OK”,关闭此框。图5-39点击“Back-AnnotateContents”按钮记录锁定信息5.4.2逻辑锁定信息的输出将ESF文件向顶层设计输出,是为了将含有filter中各种约束信息的ESF文件输出给顶层设计Largefilter,这可按以下步骤来完成。(1)在“LogicLockRegionsWindow”窗中,选择逻辑锁定区域名“filter”。(2)在Assignments菜单中选择“ExportLogicLockRegions”项,这时将出现一个窗口(如图5-40)。(3)在此窗口中确认“Exportfocusfullhierarchypath”栏中是“filter”,否则说明此前没有将LogicLock窗中的“filter”作点击。(4)在Filemam栏中键入D:\largefilter\filter.esf,或通过Browse(...)去找到相应的目录,最后应如图5-40所示。图5-40输出filter的锁定信息注意:这里假设已存在文件夹D:\largefilter\,并在其中已含有滤波器的顶层设计文件largefilter.vhd!(5)按“OK”键后即将filter工程的ESF文件输出到了顶层设计工程的目录中。(6)点击“OK”后关闭此窗口。5.4.3逻辑锁定信息的输入将逻辑锁定信息输入顶层工程中后即可进行顶层优化设计了。具体步骤如下:1.设定或打开顶层工程largefilter在file菜单中用OpenProject打开D:\largefilter目录中的工程largefilter。2.将VQM文件加到顶层工程中选择Project菜单中的Add/RemoveFilesinProject,这时,Setting对话框将出现。在此窗中应该将filter.edf文件删去(如果有的话),而用filter.vqm文件取代之。这里可先点击要删去的文件名,再点击Remove键即可删去。再在“file”栏中键入取代文件名,如filter.vqm,然后点击“Add”键即可。最后的对话框如图5-41所示。这样就将VQM文件加到(输出到)了顶层工程中。按“OK”后关闭此窗。图5-41输入逻辑锁定文件3.输入逻辑锁定约束当把含有逻辑锁定约束信息的底层设计的ESF文件输入到高层次工程中时,QuartusII就将这些约束加入到高层次工程的ESF文件中。此外,QuartusII还将自动地在FPGA的floorplan中的适当位置处,根据顶层文件的要求例化底层模块。例如,当把含有单一底层模块:4阶滤波器filter的设计实体输入进顶层设计中后,QuartusII就自动将这一filter中的约束应用到所有4个filter模块中,以构成largefilter设计。

4.对主设计系统进行分析和构建为了能够成功地将LogicLock约束向顶层设计输入,必须首先对设计进行分析和构建。在此进程中,编译器将顶层设计交付DatabaseBuilder进行处理,Builder将对设计文件进行检查排错,并按层次结构安排每一子模块。为此,在Processing菜单中选择Start?StartAnalysis&Elaboration,编译器即开始对顶层设计进行处理。在出现提示信息“Analysisandelaboration...”后点击“OK”(如图5-42所示)。图5-42完成对顶层系统的分析后构建5.输入LogicLock约束为了将LogicLock输入顶层工程,可遵循以下步骤:(1)在Assignments菜单中选择“ImportLogicLockRegions”,在弹出的对话框中的“AssignmentsCategories”框下,确认已选了“ImportLogicLockRegionsandothernodeorentityassignments”,并关闭“Importpinassignments”项。(2)在LogicLockImportsettings框中,选择“CreatenewLogicLockregionsandupdatethecurrentlyselectedLogicLockregion”,点击OK,关闭“ImportLogicLockRegions”主窗口(如图5-43所示)。(3)打开LogicLockRegionsWindow窗,可以看到顶层设计中含的4个filter模块。逻辑锁定区域名,这表明输入的约束已经被应用到顶层设计中4个相同的filter设计实体中了(如图5-44所示)。图5-43输入锁存逻辑窗图5-44主系统的逻辑锁定情况5.4.4编译和结果观察编译和观察顶层设计的具体步骤如下:

1.开始编译选择“StartCompilation”进行总体编译,如果出现“Compilationwassuccessful”提示,表示一切成功,点击“OK”。2.了解最高时钟频率在“CompilationReportWindow”窗口中点击“TimingAnalyses”条目下的“fmax”,即得到时钟实际最高频率与要求频率的比较表(见图5-45)。表中的数据表明,通过优化设计,时钟速度已满足了最初设定的要求(50MHz),这是通过利用逻辑锁定区域中布局的优化实现的。

图5-45时钟实际最高频率与要求频率的比较表3.了解逻辑锁定情况在TimingClosurefloorplan中还能进一步了解LogicLock的适配结果。点击“TimingClosureFloorplan”即可(如图5-46所示)。由本章5.1节介绍的情况可知,逻辑锁定的方式和流程有多种,主要应根据实际的工程需要、电路结构特点,以及需要优化的特定目标(如连线、节点或某个模块)来决定使用何种方式进行逻辑锁定优化设计。读者不妨都试一试,以作比较。图5-46TimingClosurefloorplan的largefilter中各模块的锁定情况第6章FIR数字滤波器设计6.1FIR数字滤波器原理6.2使用DSPBuilder设计FIR数字滤波器6.3使用FIRIPCore设计FIR滤波器

6.1FIR数字滤波器原理对于一个FIR滤波器系统而言,它的冲激响应总是有限长的,其系统函数可以记为其中M是FIR滤波器的零点数,即延时节数,为叙述简便,在本章中M被称为FIR滤器的阶数。最基本的FIR滤波器可用下式表示:其中x(n)是输入采样序列,h(i)是滤波器系数,L是滤波器的系数长度,y(n)表示滤波器的输出序列。也可以用卷积来表示输出序列y(n)与x(n)、h(n)的关系。图6-1中显示了一个典型的直接I型4阶FIR滤波器,其输出序列y(n)满足下列等式:图6-14阶FIR滤波器结构在这个FIR滤波器中,总共存在3个延时节,4个乘法单元,一个4输入的加法器。如果采用普通的数字信号处理器(DSPProcessor)来实现,只能用串行的方式顺序地执行延时、乘加操作,这不可能在一个DSP(指数字信号处理器)指令周期内完成,必须用多个指令周期来完成。但是,如果采用FPGA来实现,就可以采用并行结构,在一个时钟周期内得到一个FIR滤波器的输出。6.2使用DSPBuilder设计FIR数字滤波器使用DSPBuilder可以方便地在图形化环境中设计FIR数字滤波器,而且滤波器系数的计算可以借助Matlab强大的计算能力和现成的滤波器设计工具来完成。6.2.13阶常系数FIR滤波器的设计在此用以下示例来说明整个设计过程。假定一个3阶的FIR滤波器,其可以表示为其中:h(0)=63,h(1)=127,h(2)=127,h(3)=63,是量化时附加的因子。这里采用直接I型来实现该FIR滤波器。设计好的3阶直接I型FIR滤波器模型图可以参见图6-2。具体的新模型建立、模块调用过程可以参见第3章。图6-23阶FIR滤波器图中模块的参数作如下设置:xin模块:(Altbus)库:AlteraDSPBuilder中BusManipulation库参数“BusType”设为“signedInteger”参数“NodeType”设为“Inputport”参数“numberofbits”设为“8”yout模块:(Altbus)库:AlteraDSPBuilder中BusManipulation库参数“BusType”设为“signedInteger”参数“NodeType”设为“Outputport”参数“numberofbits”设为“8”

ParallelAdderSubtractor模块:(ParallelAdderSubtractor)库:AlteraDSPBuilder中Arithmetic库“Add(+)Sub(-)”设为“++++”Delay1、Delay2、Delay3模块:(Delay)库:AlteraDSPBuilder中Storage库参数“Depth”设为“1”参数“ClockPhaseSelection”设为“1”

h0模块:(Gain)库:AlteraDSPBuilder中Arithemtic库参数“GainValue”设为“63”参数“MapGainValuetoBusType”设为“SignedInteger”参数“GateValuenumberofbits”设为“8”参数“NumberofPipelineLevels”设为“0”h1模块:(Gain)参数“GainValue”设为“127”其余同h0模块

h2模块:(Gain)参数“GainValue”设为“127”其余同h0模块

h3模块:(Gain)参数“GainValue”设为“63”其余同h0模块由于FIR滤波器的系数已经给定,是一个常数

温馨提示

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

评论

0/150

提交评论