《基于Altera Quartus II的模块化设计应用.docx》由会员分享,可在线阅读,更多相关《基于Altera Quartus II的模块化设计应用.docx(3页珍藏版)》请在第一文库网上搜索。
1、基于AIteraQuartusII的模块化设计应用和ISE不一样,QII代码的模块化视图并不是你把子模块例化到顶层模块以后立马就能在工程代码窗口看到一个清晰的层次图。而是必须在你编译后才能够看到层次化的视图。我在这里列举一个串口通信(实验10)的实例:编写完该HD1的代码,还没有编译,此时在PrOjeCtNaVigator窗口中只有顶层模块my_uart_topoProjectNavigator顶层模块如下(详细的注释代码请参考相关实验):modu1emy_uart_top(c1k,rst_n,rs232_rx,rs232_tx);inpute1k;inputrst_n;inputrs232_
2、rx;outputrs232_tx;wirebps_start1,bps_start2;wirec1k_bps1,c1k_bps2;wire7:0rx_data;wirerx_int;IiI11i11iI1iII1iIII11Ii1I1iI1IIii1IiiIII1iI1speed_se1ectspeed_rx(.c1k(c1k),.rst_n(rst_n),.bps_start(bps_start1),.c1k_bps(c1k_bps1);my_uart_rxmy_uart_rx(.c1k(c1k),.rst_n(rst_n),.rs232_rx(rs232_rx),.rx_data(rx_
3、data),.rx_int(rx_int),.c1k_bps(c1k_bps1),.bps_start(bps_start1);Iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiispeed_se1ectspeed_tx(.c1k(c1k),.rst_n(rst_n),.bps_start(bps_start2),.c1k_bps(c1k_bps2);my_uart_txmy_uart_tx(.c1k(c1k),.rst_n(rst_n).rx_data(rx_data),.rx_int(rx_int),.rs232_tx(rs232_tx),.c1k_bps
4、(c1k_bps2),.bps_start(bps_start2);Endmodu1e我们一般不在顶层模块做任何逻辑设计,哪怕只是一个逻辑与操作。比较好的设计会明确的区分每一个模块单元。在上面这个设计中,是要实现一个串口自收发通信的功能。具体说就是不断的检测串口接收信号rs232,rx是否有数据,如果接收到起始位就把数据保存,然后再转手把接收到的数据通过串口发送信号rs232jX发回给对方。即使是这样一个还不算太复杂的功能,如果都堆到一个模块里,代码不仅又臭又长,编写代码者如果不理好思路很容易自己就写晕了,以后维护起来或者要移植就更难了。所以,模块化的设计势在必行。上面的代码把这个设计分成了四
5、个模块:1、My_uart_tx:串口数据接收模块;2、Speed.tx:串口数据接收时钟校准模块;3、My_uart_rx:串口数据发送模块;4、Speed_rx:串口数据发送时钟校准模块。5、如此划分,层次清晰而且思路明确,写起代码来更是游刃有余。先来说模块6、例化的一些细节吧。就拿SPeed_se1ect模块例化来看。第一行的SPeed_se1ect7、8、speed_rx,其中SPeed_se1ect是要例化的模块名,是固定的;而SPeed_rX9、则是你任意给这个模块取的名字,它是用于区分例化多个相同的模块。就如SPeedjX和SPeedX两个模块,因为它们的逻辑设计都是一样的,所以
6、写一个模块,然后在例化的时候给个不同的名称就可以了。这有点类似软件设计中的子程序调用,但又有不同,由于硬件设计的并行性,这里的逻辑复制实际上在最后的硬件上是实现了两个一模一样的speed-se1ect设计原型,可以说它们是完全独立的。即便是对于硬件资源的消耗没有减少,采用模块化设计以后也能从很大程度上减少设计者的重复劳动。10、11、信号的例化是这样的.C1k(C1k),点号后的C1k代表例化模块内部的信号(是12、固定的,必须和内部的信号名一致),而括号内的C1k则是例化模块的外部连接,可以例化模块内的信号名不同。在编译后,可以从ProjectNavigator窗口中看到例化的子模块:y-.
7、另外,从QUartUS提供的RT1视图里,我们能够更深刻的感受到模块化带来的层次感:模块化设计方法的设计流程将这种模块化设计思路运用于FPGA/CP1D设计,将大规模复杂系统按照一定规则划分成若干模块,然后对每个模块进行设计输入、综合,并将实现结果约束在预先设置好的区域内,最后将所有模块的实现结果有机地组织起来,就能完成整个系统的设计。(1)顶层模块的设计:项目管理者需要完成顶层模块的设计输入与综合,为进行Modu1arDeSign实现阶段的第一步一初始预算阶段(Initia1BUdgetingPhaSe)做准备。(2)子模块的设计:每个项目成员相对独立地并行完成各自子模块的设计输入和综合,为
8、进行Modu1arDesign实现阶段的第二步一子模块的激活模式实现(ActiveModu1eImp1ementation)做准备。模块化设计的实现步骤是整个模块化设计流程中最重要、最特殊的,它包含:(1)初始预算-本阶段是实现步骤的第一步,对整个MOdUIarDeSign起着指导性的作用。在初始预算阶段,项目管理者需要为设计的整体进行位置布局,只有布局合理,才能够在最大程度上体现MOdUEDeSign的优势;反之,如果因布局不合理而在较后的阶段需要再次进行初始预算,则需要对整个实现步骤全面返工。(2)子模块的激活模式实现(ACtiVeMOdU1e1mP1ementation)-在该阶段,每个项目成员并行完成各自子模块的实现。(3)模块的最后合并(Fina1ASSembIy)-在该阶段项目管理者将顶层的实现结果和所有子模块的激活模式实现结果有机地组织起来,完成整个设计的实现步骤。模块化设计中模块划分的基本原则为:子模块功能相对独立,模块内部联系尽量紧密,而模块间的连接尽量简单。所以对于那些难以满足模块划分准则的具有强内部关联的复杂设计,并不适合采用模块化设计方法。