Xilinx FPGA入门连载25:PLL实例之模块化设计 特权同学,版权所有 配套例程和更多资料下载链接: 1 模块化设计概述 模块化设计是FPGA设计中一个很重要的技巧,它能够使一个大型设计的分工协作、仿真测试更加容易,代码维护或升级更加便利。 如图所示,一般整个设计的顶层只做例化,不做逻辑。然后一个顶层下面会有模块A、模块B、模块C等等,模块A/B/C下又可以分多个子模块实现。 如此一来,就可以将大规模复杂系统按照一定规则划分成若干模块,然后对每个模块进行设计输入、综合,并将实现结果约束在预先设置好的区域内,最后将所有模块的实现结果有机地组织起来,就能完成整个系统的设计。 对于顶层模块的设计,主管设计师需要完成顶层模块的设计输入与综合,为进行模块化设计实现阶段的第一步即初始预算阶段(Initial Budgeting Phase)做准备。 对于子模块的设计,多个模块的设计者相对独立地并行完成各自子模块的设计输入与综合,为进行模块化设计实现阶段的第二步即子模块的激活模式实现(Active Module Implementation)做准备。 模块化设计的实现步骤是整个模块化设计流程中最重要、最特殊的,它包含: (1) 初始预算,本阶段是实现步骤的第一步,对整个模块化设计起着指导性的作用。在初始预算阶段,项目管理者需要为设计的整体进行位置布局,只有布局合理,才能够在最大程度上体现模块化设计的优势;反之,如果因布局不合理而在较后的阶段需要再次进行初始预算,则需要对整个实现步骤全面返工。 (2) 子模块的激活模式实现(Active ModuleImplementation),在该阶段,每个项目成员并行完成各自子模块的实现。 (3) 模块的最后合并(Final Assembly),在该阶段项目管理者将顶层的实现结果和所有子模块的激活模式实现结果有机地组织起来,完成整个设计的实现步骤。 模块划分的基本原则是,子模块功能相对独立,模块内部联系尽量紧密,而模块间的连接尽量简单。对于那些难以满足模块划分准则的具有强内部关联的复杂设计,并不适合采用模块化设计方法。 2模块化设计实践 本实验,我们就要来体验一把模块化设计。如图所示,在这个设计中,我们的顶层模块是sp6.v,在此之前的实例中,我们都只有孤零零的一个sp6.v是源代码文件,所有的逻辑代码都写在这个文件中,但是这个实例开始,我们将使用模块化的设计,将各个不同的独立的功能逻辑代码分别写在不同的源文件中,然后通过“例化”的方式,将它们之间的接口互联起来。 因此,这个例子中,sp6.v文件里面其实几乎是没有具体的逻辑功能的,它只是做一些基本的例化和互联,将它下面的5个功能模块相关的接口信号都连接起来。从图示来看,它们还具体层级的关系,一目了然,非常易于查看和编辑管理。 2板级调试 参考前面的例程,将本实例生成的sp6.bit文件烧录到FPGA中,接着我们就能看到D2、D3、D4和D5这4个LED完全同步的进行闪烁。当然了,这也至少证明了我们的PLL输出的4个时钟相互之间所呈现的倍频关系。
|