tag 标签: 10

相关博文
  • 2024-8-11 10:37
    527 次阅读|
    0 个评论
    概述 本文主要记录在实际使用FPGA的LVDS模块初始阶段时候遇到的问题,这些问题都是些非典型问题。 C10器件LVDS-RX对接M10器件LVDS-TX遇到的问题 因为板子上有一片C10和一片M10器件,而且电路设计的时候安排了两个器件之间的LVDS接口连接。所以在C10与ADC对接之前,首先在C10与M10之间进行LVDS接口调试,这样可以将C10的LVDS-RX移植到与ADC采样数据的接口。 由于M10与FPGA之间并未安排随路时钟,所以打算使用FPGA的系统时钟来作为LVDS-RX的参考输入时钟。直接例化LVDS-RX后编译的时候遇到问题,在Fit的时候会出现如下所示的报错信息: Error ( 14566 ): The Fitter cannot place 1 periphery component (s) due to conflicts with existing constraints ( 1 LVDS_CLOCK_TREE(s) ). Fix the errors described in the submessages, and then rerun the Fitter. The Intel FPGA Knowledge Database may also contain articles with information on how to resolve this periphery placement failure. Review the errors and then visit the Knowledge Database at https: //www.intel.com/content/www/us/en/support/programmable/kdb-filter.html and search for this specific error message number. Error ( 175020 ): The Fitter cannot place logic LVDS_CLOCK_TREE that is part of LVDS SERDES Intel FPGA IP LVDS_1Ch6B_RX_altera_lvds_2001_3ymtrna in region ( 38 , 32 ) to ( 38 , 32 ), to which it is constrained, because there are no valid locations in the region for logic of this type. Info ( 14596 ): Information about the failing component (s) : Info ( 175028 ): The LVDS_CLOCK_TREE name (s) : u_LVDS_RX_Test|LVDS_1Ch6B_RX_inst|lvds_0|core|arch_inst|default_lvds_clock_tree.lvds_clock_tree_inst Error ( 16234 ) : No legal location could be found out of 2 considered location (s) . Reasons why each location could not be used are summarized below: Info ( 175013 ): The LVDS_CLOCK_TREE is constrained to the region ( 38 , 32 ) to ( 38 , 32 ) due to related logic Info ( 175015 ) : The I/O pad clkin is constrained to the location PIN_AA18 due to: User Location Constraints (PIN_AA18) File: E:/won/CSEP/C10GX_AD9633/src/C10GX_AD9633.vhd Line: 19 Info ( 14709 ): The constrained I/O pad drives a IOPLL, which drives this LVDS_CLOCK_TREE Error ( 175006 ) : There is no routing connectivity between the LVDS_CLOCK_TREE and destination LVDS_CHANNEL Info ( 175027 ) : Destination: LVDS_CHANNEL u_LVDS_RX_Test|LVDS_1Ch6B_RX_inst|lvds_0|core|arch_inst|channels .rx_non_dpa.serdes_dpa_inst~CHANNEL Info ( 175015 ) : The I/O pad M10_TO_C10_LVDS_RX is constrained to the location PIN_P3 due to: User Location Constraints (PIN_P3) File: E:/won/CSEP/C10GX_AD9633/src/C10GX_AD9633.vhd Line: 29 Info ( 14709 ): The constrained I/O pad is contained within a pin, which is contained within this LVDS_CHANNEL Error ( 175022 ) : The LVDS_CLOCK_TREE could not be placed in any location to satisfy its connectivity requirements Info ( 175021 ) : The destination LVDS_CHANNEL was placed in location LVDS_CHANNEL containing P3 Info ( 175029 ) : 2 locations affected Info ( 175029 ) : LVDSCLOCKTREE_X38_Y32_N4 Info ( 175029 ) : LVDSCLOCKTREE_X38_Y32_N5 Error ( 15307 ) : Cannot apply project assignments to the design due to illegal or conflicting assignments. Refer to the other messages for corrective action. Error ( 16297 ): An error has occurred while trying to initialize the plan stage. Error: Quartus Prime Fitter was unsuccessful. 7 errors, 2 warnings Error: Peak virtual memory: 1397 megabytes Error: Processing ended: Mon Jul 29 17 : 45 : 25 2024 Error: Elapsed time: 00 : 00 :09 Error: System process ID: 12428 后来检查发现该时钟输入引脚与LVDS-RX的引脚位于FPGA的不同bank,如图1所示,所以LVDS-RX例化时需要打开external PLL选项,如图2所示。 图1:LVDS-RX引脚与其参数输入时钟引脚位于FPGA的不同BANK 图2:LVDS-RX例化时PLL设置 如图2所示,LVDS模块例化的时候可以选择使用外部PLL。但是在设计C10与M10之间的LVDS通信的时候,即便因为上述原因使用外部PLL,依然未成功,因为FPGA主时钟输入I/O标准是单端的LVCMOS,LVDS模块似乎仅支持LVDS差分标准。 由于这对C10与M10之间的LVDS差分对正好与ADC差分对接入同一个FPGA的bank,所以在例化的时候,将LVDS-RX的参考输入时钟直接接入ADC的FCO,这样就成功了,可以实现M10串行发送,而C10进行串行接收。 根据正常理解,LVDS数据线可以与参考时钟位于不同的BANK,只是此时必须使用外部PLL形式。上述示例并未验证是否可行,因为如图1所示的不同bank的时钟是单端输入,应该是无法直接用作LVDS的参考时钟。另外,也尝试进行PLL级联,即在例化LVDS模块的时候,并未选择图2中“Use external PLL”,LVDS模块直接内置PLL,外部再例化一个PLL使用该单端时钟,再使用PLL的输出时钟来作为LVDS的参考时钟,但是这样使用并未获得通过,在编译的时候会出现下述报错信息。 Error ( 18694 ): The reference clock on PLL "u_LVDS_RX_Test|LVDS_1Ch10B_RX_inst|lvds_0|core|arch_inst|internal_pll.pll_inst|altera_lvds_core20_iopll" , which feeds an Altera LVDS SERDES IP instance, is not driven by a dedicated reference clock pin from the same bank. Use a dedicated reference clock pin to guarantee meeting the LVDS SERDES IP max data rate specification. Error: Failed to synthesize partition Error: Quartus Prime Synthesis was unsuccessful. 2 errors, 22 warnings Error: Peak virtual memory: 726 megabytes Error: Processing ended: Mon Jul 29 15 : 20 : 58 2024 Error: Elapsed time: 00 : 00 : 39 Error: System process ID: 4044 参考 LVDS SERDES Intel FPGA IP User Guide: Intel Arria 10 and Intel Cyclone 10 Devvices.
  • 热度 4
    2024-7-14 12:25
    739 次阅读|
    0 个评论
    概述 SiPM测试系统的信号处理板使用了ADI的单片4通道的高速差分ADC信号,所以FPGA需要通过LVDS接口来收取差分高速ADC送出的差分串行数据。 本文讨论FPGA如何例化LVDS模块,以及几种用来收取外部ADC采样后送来的高速差分串行数据。 10代器件LVDS实例化界面 在Intel的10代器件中有Arria、Cyclone、MAX以及Stratix几种,我们使用的是Cyclone系列10代GX产品。 图1:LVDS模块例化界面 如图1所示为LVDS例化界面,具体使用方法可以参考1“LVDS SERDES Intel FPGA IP User Guide”。这里给出LVDS SERDES通道结构框图,如图2所示。图2下半部分展示的RX通道是本文着重要关注的部分。 图2:Cyclone 10 GX系列器件LVDS Serdes通道结构框图 高速差分ADC数据引入FPGA的方法 高速差分ADC采样后串行数据、时钟以及帧同步总线接入FPGA的方法大致分为以下几种,不同的方法使用的场合有些微差别。 方法一:每个ADC单独将DCO和FRAME接入FPGA,此时不需要RX PLL,DCO必须使用专用时钟引脚。 方法二:每个ADC的FRAME接入FPGA,FRAME必须接专用时钟引脚,使用PLL通过FRAME在内部产生串行高速时钟。 方法三:如果预期到每个ADC之间布线延时差异足够小,此时所有ADC芯片可以使用同一组DCO和FRAME。 方法四:如果无法预估各ADC之间延时差异,又不想使用方法一和方法二,此时可以使用软CDR在初始阶段生成训练码。需要将ADC的SPI接口连接到FPGA。 根据不同的使用场景,又存在下述几种划分: 场景1:类似上述方法一 举个最简单的例子,当FPGA仅处理一个ADC时,FPGA单个bank就可以处理,ADC的所有必要和非必要的信号都可以连接到FPGA。如此,就可以确保安全可靠地接收ADC的采样数据。 此场景的其它例子,比如FPGA需要处理多个ADC的时候,此时可能分为不同情况,属于本场景的情况是FPGA有足够的bank来处理所有ADC,即每个BANK仅处理一个ADC。此时可以按照单个ADC的方法处理。单个bank如果LVDS端口足够,也可以处理多个ADC,但是单个bank仅接一路DCO到时钟引脚。 场景2:多个ADC需要处理,LVDS端口不足 此时为了省略出足够的LVDS端口给串行数据,可以多个ADC共享同一个DCO时钟,此时也省时钟引脚与PLL,有时候可能是时钟引脚或内部PLL不够。 场景3:多个ADC需要处理,时钟引脚不足 此时FPGA没有足够的时钟引脚接收来自ADC的DCO或FRAME,此时可以将DCO接入到普通的LVDS差分对端口,用本地时钟作为LVDS参考时钟,DCO当普通数据,然后根据DCO跳变去取ADC数据。 场景4:多个ADC需要处理,时钟引脚不足的同时,LVDS端口也不足 此时,DCO完全可以连接到FPGA,当异步处理,通过过采样,本地恢复DCO。 以上四种使用场景,风险从场景1到场景4依次递增。 参考 LVDS SERDES Intel FPGA IP User Guide: Intel Arria 10 and Intel Cyclone 10 Devvices.
  • 热度 4
    2024-5-19 10:42
    442 次阅读|
    0 个评论
    ALTERA Cyclone 10器件的使用-5:模块复用在导入时遇到的问题 概述 复用模块导入时,该复用模块的输入端口在设计者侧被接入到物理I/O,而在使用者侧导入QDB文件后,FIT时报错。 导入QDB后布局布线报错 使用者一侧导入设计者一侧传导来的QDB文件,然后进行工程全编译,在开始Fit不久后出现了如图1所示的错误提示。出错的是子模块中的一个16-bit的数据总线,从错误信息可以看出,编译器认为该总线在之前编译的时候是连接到器件I/O引脚上的,导入后该总线用于内部逻辑互联通讯,所以给出了冲突报错提示。 图1:使用者侧导入QDB后编译时遇到的错误 上述错误提取一条打印如下: Error ( 18568 ): Output port "SEP_2BLK_CORE_|HostDataOut(0)~pad" in partition "SEP_2BLK_CORE_" was implemented as a device I/O in an earlier compile, but is now being used to drive other logic. Output ports that have previously be implemented as device I/O may only be used as device I/O in future compiles. 设计者侧对分区端口的处理 上述报错信息在设计者一侧也出现类似情况,Quartus在布局布线的时候,对于这个输出的数据总线要求将其接入到器件的I/O引脚,否则编译不通过,错误信息如图2所示。所以设计者一侧就将该数据总线连接到器件I/O引脚上,然后使用者这一侧其它逻辑模块会使用到该数据总线,所以在使用者一侧来说,该数据总线仅为内部逻辑模块内部连接的总线,由此在使用者一侧Quartus给出如图1所示的错误信息。 图2:同样的数据总线在设计者一侧遇到的错误 问题分析与解决 根据很久之前ALTERA对于增量编译的培训,三态端口或总线不能划分为分区输入输出端口,必须(must be)接入顶层I/O引脚,图2所示错误,就是这样的原因。上述出问题的数据总线确实是与其它模块中的三态总线相关,不过在复用模块设计者一侧,该总线分离为独立的输入和输出总线,已经不属于“三态”总线了,但是为何还是会出现上述让双方矛盾的问题呢? 通过检查代码,发现模块复用修改的时候是基于之前使用三态总线的源文件,所以该总线输出方向保留了三态描述,即: HostDataOut <= ( others 'Z' ); 只需将上述代码描述修改为如下所示即可。 HostDataOut <= ( others '0' );
  • 热度 4
    2024-5-12 09:19
    519 次阅读|
    0 个评论
    ALTERA Cyclone 10器件的使用-4:模块复用及当前使用所遇到的问题 概述 之前学习了基于Arria10的模块复用教程,并依据该教程在基于Cyclone10GX的测试板上将之前的项目更改为单核模块,并进行了导出和导入操作。通过上述过程,模块复用得到验证,可以应用于我们的项目。本文记录在此过程中遇到的一些问题,作为最近一段时间设计于测试的总结。 设计输入 一直以来笔者习惯于ALTERA的原理图输入方式,至少在顶层均采用模块输入,这样有利于本人对应整个工程的掌控。自从转入Quartus Prime Pro以后,发现QPP无法进行原理图的操作,但是还是可以对以前的原理图文件进行识别,而且能够对其进行编译。 再次之前我们的QPP版本升级到22.4,不过团队中合作伙伴在开发Cyclone10GX使用其PLL于Tranceiver模块的时候遇到问题,在升级到23.4的时候,问题解决,所以团队中不同的人使用了不同的版本。这次在使用模块复用功能后,通过之前发布的教程我们知道,双方需要统一器件、统一Quartus软件版本,否则无法完成QDB文件的导入。 而在升级到QPP23.4后发现Intel进一步对原理图使用进行了限制,这个版本是彻底限死的原理图,因为QPP23.4根本不支持识别原理图,Quartus在编译的时候,如果发现原理图,都会出现如图1所示的错误。 图1:Quartus编译遇到原理图输入时给出的错误提示 QDB文件导出问题 笔者作为单核开发者,之前使用QPP22.4的时候,导出QDB文件时可以选择导出综合后网表文件,也可以选择导出最终网表文件。更新到QPP23.4后,发现选择导出综合后网表时会导致Quartus软件莫名其妙停止操作,并弹出图2所示的错误提示窗口。 图2:QPP23.4导出综合后网表文件时遇到的问题 JTAG识别Cyclone 10GX器件问题 首先一个问题(之前有博文介绍此问题)是JTAG下载电缆(USB Blaster与USB Blaster II)都有此问题,即电缆无法识别JTAG链路,原因是C10GX的JTAG电压(VCCPGM)为1.8V,而手上老旧下载电缆最低支持的I/O电压是3.3V。从市场上购买支持低压的下载电缆后,解决此问题。(需要注意的是,所谓支持的低压,最好是低至1.5V。因为买的两种号称支持到1.8V也无法解决问题,我们分析是由于板子的1.8V实际量出来的是1.78V左右。) 图3:支持低压JTAG口下载电缆 2.解决问题1后,JTAG自动探测的时候偶发识别C10GX器件为UNKNOWN(如图4所示),此时似乎能下载程序,但是无法进行SignalTap调试。 图4:遇到探测到UNKNOWN器件问题 经过排查,上述UNKNOWN事件,一种情况是使用了电脑上低版本Quartus的下载软件,另一种情况是电脑里的JTAGSever指定的可执行路径为低版本,图5为正确的JTAGSever可执行路径指定,即指定为QPP23.4版本。 图5:电脑中有多版本Quartus安装时,确认JTAG Sever可执行路径 延时线锁定问题 延时线与寄存器锁定在同一个ALM的时候,Fit中的Place出现下述错误,如图6所示。 图6:Quartus在place过程当中给出的错误信息 上述第一条错误信息,详列如下: Error( 170208 ): Cannot place 4 nodes into a single ALM Info( 170017 ): Cannot place nodes in a single ALM -- the ALM would be illegal because ALM pins can not be routed Info( 170072 ): List of 4 nodes in the ALM Info( 170000 ): Node "u_SEP_2BLK_CORE|u_TDC_3Chs_Core|u1_tdc1ch_cc_dualregdualtdl|u_TDL_CC_DualReg_Topa|u_CarryChainDualRegInC10GX|mycarry_in|cout" Info( 170031 ): LE location constraint : Region lower - left corner: X25_Y102; Region upper - right corner: X25_Y102 came from < none Info( 170000 ): Node "u_SEP_2BLK_CORE|u_TDC_3Chs_Core|u1_tdc1ch_cc_dualregdualtdl|u_TDL_CC_DualReg_Topa|u_CarryChainDualRegInC10GX|gen .mycarry|s" Info( 170031 ): LE location constraint : Region lower - left corner: X25_Y102; Region upper - right corner: X25_Y102 came from < none Info( 170000 ): Node "u_SEP_2BLK_CORE|u_TDC_3Chs_Core|u1_tdc1ch_cc_dualregdualtdl|u_TDL_CC_DualReg_Topa|u_CarryChainDualRegInC10GX|gen .myffa|myff" Info( 170031 ): LE location constraint : Region lower - left corner: X25_Y102; Region upper - right corner: X25_Y102; Sublocation: 4 came from User Location Constraints Info( 170000 ): Node "u_SEP_2BLK_CORE|u_TDC_3Chs_Core|u1_tdc1ch_cc_dualregdualtdl|u_TDL_CC_DualReg_Topa|u_CarryChainDualRegInC10GX|gen .myffb|myff" Info( 170031 ): LE location constraint : Region lower - left corner: X25_Y102; Region upper - right corner: X25_Y102; Sublocation: 5 came from User Location Constraints 上述第二条错误信息,详列如下: Error( 170208 ): Cannot place 6 nodes into a single ALM Info( 170017 ): Cannot place nodes in a single ALM -- the ALM would be illegal because ALM pins can not be routed Info( 170072 ): List of 6 nodes in the ALM Info( 170000 ): Node "u_SEP_2BLK_CORE|u_TDC_3Chs_Core|u1_tdc1ch_cc_dualregdualtdl|u_TDL_CC_DualReg_Topa|u_CarryChainDualRegInC10GX|gen .mycarry|s" Info( 170031 ): LE location constraint : Region lower - left corner: X25_Y102; Region upper - right corner: X25_Y102 came from < none Info( 170000 ): Node "u_SEP_2BLK_CORE|u_TDC_3Chs_Core|u1_tdc1ch_cc_dualregdualtdl|u_TDL_CC_DualReg_Topa|u_CarryChainDualRegInC10GX|gen .myffa|myff" Info( 170031 ): LE location constraint : Region lower - left corner: X25_Y102; Region upper - right corner: X25_Y102; Sublocation: 7 came from User Location Constraints Info( 170000 ): Node "u_SEP_2BLK_CORE|u_TDC_3Chs_Core|u1_tdc1ch_cc_dualregdualtdl|u_TDL_CC_DualReg_Topa|u_CarryChainDualRegInC10GX|gen .myffb|myff" Info( 170031 ): LE location constraint : Region lower - left corner: X25_Y102; Region upper - right corner: X25_Y102; Sublocation: 8 came from User Location Constraints Info( 170000 ): Node "u_SEP_2BLK_CORE|u_TDC_3Chs_Core|u1_tdc1ch_cc_dualregdualtdl|u_TDL_CC_DualReg_Topa|u_CarryChainDualRegInC10GX|gen .mycarry|s" Info( 170031 ): LE location constraint : Region lower - left corner: X25_Y102; Region upper - right corner: X25_Y102 came from < none Info( 170000 ): Node "u_SEP_2BLK_CORE|u_TDC_3Chs_Core|u1_tdc1ch_cc_dualregdualtdl|u_TDL_CC_DualReg_Topa|u_CarryChainDualRegInC10GX|gen .myffa|myff" Info( 170031 ): LE location constraint : Region lower - left corner: X25_Y102; Region upper - right corner: X25_Y102; Sublocation: 10 came from User Location Constraints Info( 170000 ): Node "u_SEP_2BLK_CORE|u_TDC_3Chs_Core|u1_tdc1ch_cc_dualregdualtdl|u_TDL_CC_DualReg_Topa|u_CarryChainDualRegInC10GX|gen .myffb|myff" Info( 170031 ): LE location constraint : Region lower - left corner: X25_Y102; Region upper - right corner: X25_Y102; Sublocation: 11 came from User Location Constraints 经过验证,出现上述锁定报错,是因为单延迟线使用了双寄存器阵列锁存,如果单寄存器阵列锁存就没问题。但是在建立这个工程之前,一个简单测试工程已经验证过了可以使用双寄存器阵列锁存延时线的TAP输出。为何现在出现上述错误信息呢? 经过回头查看原来工程,首先原来测试工程是QPP22.4版本建立,当前工程是QPP23.4,是否版本原因?经过分析,应该不是。随后在QPP22.4原始测试工程上做了一个简单测试,如下图所示,之前测试工程中将2选1选择器的选择型号固定为“低”,当前工程SEL端口是可控的,如图7右侧所示,修改测试工程如图7右侧所示,那么编译原测试工程后,会出现一样的报错问题。 图7:TDC输入HIT经过2选1的MUX模块 备注1:QDB导出问题解决方法 图2所示问题,笔者在Intel可编程论坛进行了提交,迅速得到了回应,如图8所示。根据他提供的方法,确实将此问题解决了。 图8:Intel论坛对QPP23.4导出综合网表QDB出现问题的解决方法 备注2:模块复用下逻辑约束转移 所谓逻辑约束,在这里特指TDL延迟线的物理位置约束。在项目设计时使用逻辑模块复用功能,那么设计者一侧施加的物理位置约束,是否能够同样导出并传递给使用者一侧呢?事实验证,这是可以的,如图9、图10所示。 图9:设计者一侧6通道TDL位置进行了约束 图10:在使用者一侧导入后,6通道TDL物理位置经过锁定后未发生变化
  • 热度 2
    2024-5-2 09:51
    789 次阅读|
    0 个评论
    可重用模块设计教程 概述 SiPM读出测试系统后端硬件重新规划了一块测试板,读出系统送出的信号在该测试板上进行处理,该测试板将替换之前的信号处理系统。测试板使用了Intel的Cyclone 10 GX器件,具体型号为10CGX220。 之前信号处理系统用于上一代整机处理,信号处理分为数字和数据处理两大块,新设计的测试板将之前的数字与数据处理合并为一块,所以之前的两个不同的模块逻辑设计需要合并一起,而当初两个模块分别由不同的逻辑工程师编写,为了合并一起,需要用到Intel的增量编译,这里仅借用可重用模块设计来对子模块进行导出和导入。 可重用模块设计方法及概览 Intel的an839以Arria 10开发板为基础进行了简单介绍,并形成了一个可重用模块设计教程。该教程介绍了两种可重用方法,一种是子核分区重用,另外一种是根分区重用技术。我们更关注与子核分区重用技术,所以这里主要讨论子核分区重用技术在CYCLONE10 GX器件上的应用。 An839教程以开发人者和使用者两种角色来介绍子核心和根分区重用流程。从更高顶层来看,子核心分区和根分区的重用流程是相似的。这两个流程都将设计分区转换为.qdb文件导出导入,进行保留和重用。开发人员在开发人员项目中定义、编译和保留可重用模块,使用者在一个或多个使用者项目中复用可重用块及其自己的逻辑。 子核分区重用技术-开发者教程 本教程基于可重用模块是之前已经开发完成并得到验证并使用过的模块,开发者教程通过介绍子核分区设计的几个流程,这些流程类似IP开发一样,可复用模块完成前期代码规划、并完成逻辑布局布线、划分成单个分区,最后将该可复用模块导出到.qdb文件,这样使用者就可以拿来重复使用。 如图1所示,展示了子核分区重用设计流程框图。 图1:子核分区重用流程框图 子核分区重用还需要向使用者提供一个黑匣子文件。黑匣子件只是定义了使用者项目中用于综合的模块信号端口以及这些端口使用的接口类型。编译器会忽略黑匣子文件中包含的任何其他RTL。将黑匣子文件作为源文件添加到使用者项目中。同时将导出的.qdb文件分配给使用者设计中对应的分区。.qdb文件包含开发者编译快照中的所有信息。然后,使用者可以在其项目中重新使用这些编译结果。综合快照仅包括综合结果。最终快照包括综合、布局和布线结果。具体,可以根据实际情况进行选择和设置。 该教程具体可以包含下述步骤: 步骤1:给重用模块定义一个子核分区 步骤2:编译和导出子核分区 步骤3:为重用模块创建黑匣子文件 步骤4:将上述2个步骤创建的文件复制并传导到使用者工程 步骤5:硬件验证(可选) 实际我们关注的仅为前3个步骤,后续步骤还需要与使用者进行协同,另外需要注意的是重用模块对外端口定义需要双方进行协调一致。下面着重介绍前3个步骤。 步骤1:给重用模块定义子核分区 首先打开开发者工程,该工程可以只包含重用子模块,也可以包含其它众多逻辑子模块,但是需要注意将重用子模块单独定义,有利于给其进行分区。 其次,将打开的工程进行综合,如图2所示,在编译面板重,可以双击“Analysis&Synthesis”对工程进行综合,其实也可以单击综合按钮,这里不再赘述。 图2:编译面板(Compilation Dashboard) 如图2所示,综合完成后,编译面板重,综合对应的项目前出现绿色的勾选图标,表示综合成功完成,如果综合出错,则会出现红叉标识。 综合成功完成后,找到工程导航器(Project Navigator)页面,在“层次”选项卡中找到重用模块,并在该模块上单击鼠标右键(如图3所示),指向“设计分区”,然后选择“默认分区类型”。之后会在用户指定的重用模块实例旁边会显示一个设计分区图标,如图3所示,目标模块是u_blinding_led。 图3:给重用模块创建分区(左侧为an839实例,右侧为C10GX实例) 如果要查看和编辑工程项目中的所有设计分区,可以从Assign菜单项中找到并打开 设计分区窗口,如图4所示。您也可以在此窗口中定义新分区,或者指定编译后自动导出分区。 图4:打开的设计分区窗口 而在QPP22.4版本中打开的设计分区窗口,如图4-1所示,窗口默认条目与图4产生了些微差别(这个其实是可以通过Quartus软件对其进行个性化配置的),根据an839介绍,工程全编译后保留的是Final网表,而在图4-1中,可以指定保留的网表类型,比如是保留综合网表,还是Final网表等。 图4-1:QPP22.4打开的设计分区窗口 步骤2:编译和导出子核分区 这一步不复杂,完成分区划分后,可以对工程进行全编译,这样每个分区可以依据分配约束定义得到其相应的编译快照。需要注意的是只有分区才会在编译后获得快照,未分配的模块其“快照”按钮都是灰色的。然后,就是分区编译后的导出,用户在熟悉以后可以通过约束在每次编译自动导出,这里关注的是教程学习,所以仅介绍手动导出分区。 在图2所示的编译面板中找到全编译项(Compile Design),双击即可完成全编译。全编译后的编译面板如图5所示,编译完成后,设计者必须要关注各个编译步骤的标识,确认工程编译是否存在任何问题。 图5:全编译完成后的编译面板 完成全编译后,确认编译没有问题,找到Project菜单,选择导出设计分区命令(Export Design Partition),弹出图6所示的窗口。在分区名称中选择目标分区,编译快照选择最终快照(Final)。在文件名称区域指定导出的.qdb文件名称。 图6:导出设计分区窗口 步骤3:为分区产生黑匣子文件 当使用者要使用可重用模块的时候,需要在自己的工程中加入一个黑匣子文件,该黑匣子文件定义了重用模块的输入输出端口。这有点象我们在进行HDL逻辑设计的时候,首先需要定义个实体(Entity),并未实体定义输入输出端口,一个黑匣子文件就是一个空的实体定义。Intel在an839中有关模块重用技术使用了System Verilog语言,这样子核模块逻辑源文件文件就是*.sv,而不是通常使用VHDL的*.vhd或使用Verilog的时候的*.v文件。在实际使用中,我们更多的使用这两种语言,所以在产生的黑匣子文件要做出对应调整。 创建黑匣子文件的具体步骤是,首先从File菜单或工程工具按钮中找到“新建”命令(new),从弹出的窗口的设计文件中选择新建SystemVerilog HDL File,单机OK生成一个只包含对应子核分区端口定义的空文件,代码如下所示。 module blinking_led ( output value, input clock ); endmodule 将上述黑匣子文件保存到*_bb.sv文件当中,需要注意的是,在保存该文件的时候禁用“将该文件加入当前工程”选项,大家知道Quartus每次有新文件产生的时候都会进行这类提示,由于黑匣子文件不会在开发者工程中使用,所以不需要选择这个选项,如图7所示。 图7:禁止加入文件到当前工程 子核分区重用技术-使用者教程 将上述产生的.qdb文件和黑匣子文件拷贝到使用者工程目录下,使用者就是在自己的工程中使用该子核分区模块了。作为一个子核分区使用者,当其收到由开发者提供的子核分区可重用模块对应的上述文件后,首先需要将黑匣子文件加入工程,并为子核模块对应的分区指定由开发者提供的对应.qdb文件。由于.qdb文件包含了网表信息,所以双方需要使用相同器件型号和同样的QPP开发软件版本。这个要求对应用户来说还是比较难受的,至少对应我们来说是这样的,比如我们现在双方就在使用不同的QPP版本,一边使用的是22.4,一边使用的是23.2版本。还有我从Cyclone器件导出的.qdb文件难道就无法用于Stratix或Arria器件?后期找时间可以对此进行验证一下。图8显示了双方文件交互情况。 图8:重用模块设计开发者和使用者之间的文件交互 该教程具体可以包含下述步骤: 步骤1:使用者给工程加入重用模块文件并对工程进行综合 步骤2:给对应重用模块创建分区 步骤3:设计全编译 步骤4:硬件验证(可选) 可以使用脚本和命令方式自动执行上述第一和第二个步骤,具体脚本命令如下所示: #Create the partition set_instance_assignment -name PARTITION blinking_led - to u_blinking_led -entity top #Assign the .qdb file to the partition set_instance_assignment -name QDB_FILE_PARTITION blinking_led .qdb \ - to u_blinking_led -entity top #Add the BB file to the file list set_global_assignment -name SYSTEMVERILOG_FILE blinking_led_bb .sv 这里不再对上述步骤进行赘述,只是对分区的QDB文件指定进行简单介绍。加入文件综合后,可以参考上述开发者流程,给目标模块创建分区,然后打开类似图4那样的设计分区窗口,给刚刚创建的重用模块指定.qdb文件,如9所示。未指定QDB文件之前图中粉色虚线框中应该是空白的,可以双击该区域,然后单击浏览图标“(…)”找到从开发者传导过来的QDB文件。 图9:在设计分区窗口中分配QDB文件 参考 an839 Design Block Resue Tutorial for Intel Arria 10 FPGA Dev Board
相关资源