tag 标签: 10

相关博文
  • 热度 2
    2024-11-16 13:54
    309 次阅读|
    0 个评论
    不同ADC采样同一前端模拟信号时转换用时差异分析
    概述 同一组前端模拟信号接入由不同型号ADC组成的模数转换电路时,采样后在FPGA中发现采样用时差异较大。本文主要分析这个时间差异形成的原因,并记录该差异产生对系统造成的影响。 系统数字化简介 项目前端的模拟信号是由PMT或者SiPM加上LYSO探测器产生的整形脉冲波,同时随路产生时间脉冲,这个两个脉冲到达数字化板的时间保持不变,所以可以以时间脉冲为参考检测数字化后的整形模拟脉冲。即数字化脉冲上升沿触发后,固定周期后就可以得到对应的整形脉冲位置。如图1所示,在逻辑上,t1与t2之间的时间间隔在硬件确定后,即已确定,宏观上的差异不会存在纳秒级以上。 图1:模拟信号数字化框图及逻辑时序关系 数字化转换时差展示 这里需要首先明确一个前提,即大转换时差仅存在于AD采样电路中使用了不同型号的ADC。如果使用相同的AD采样电路,虽然存在采样时差,但是差异很小,这时候讨论的不是宏观的时差,而应该是通道之间的skew。 另外,本系统早期使用了AD9288 ADC,中期修改为AD9218,当前升级为AD9633。这里比较的是AD9218与AD9633之间的转换时间差异。如图2所示,即为早期AD9218采集PMT整形脉冲的实际时序关系。 图2:AD9218采集PMT产生的整形脉冲结果 如图2所示,SignalTapII的触发脉冲是时间脉冲信号,时间脉冲触动后,大概10个系统时钟后,整形脉冲被数字化完成并送到了FPGA。SiPM系统的时间关系大致如此,这个时间关系与硬件电路上的布线延时以及线缆连接造成的延时关系不大,因为这里关注的是基于系统时钟(100MHz)周期上的差异。硬件布线、连接等造成的延时基本上达不到时钟周期级别,故可忽略。图3则展示了AD9633采集SiPM后得到的时间脉冲与整形之间的时序关系。 图3:AD9633采集SiPM产生的整形脉冲结果 如上图所示及之前分析,PMT与SiPM硬件电路上产生的时间脉冲与整形脉冲之间时间间隔差异并不大,这个也使用AD9218采样后验证过。而上图使用AD9633采集后得到的这个时间间隔在30个时钟周期,大于图2中的10个时钟周期,差异在20个时钟周期。 数字化转换时差原因分析 通过查看两个ADC的数据手册,发现在流水延迟这个参数上,二者有着很大的不同。AD9218给出的数字输出流水延迟是5个时钟周期,如图3所示中箭头所指。 图3:AD9218正常工作的通道时序 而同样的参数,AD9633给出的是16个时钟周期,所以这里的差异在11个时钟周期。但是,还有9个左右的时钟差异在哪儿呢? 剩下的9个时钟差异应该来自于FPGA内部,因为AD9218是并行输出,FPGA直接获取AD的输出数字码,而AD9633是LVDS串行输出,FPGA收到后首先需要进行解串,解串LVDS逻辑模块运行周期目前还不明确,需要查看资料确认。 参考 LVDS SERDES Intel FPGA IP User Guide: Intel Arria 10 and Intel Cyclone 10 Devvices. AD9218手册 AD9633手册
  • 热度 1
    2024-11-10 13:04
    344 次阅读|
    0 个评论
    ALTERA Cyclone 10器件的使用-7:FPGA片内RAM资源利用率思考
    概述 项目使用的FPGA目标器件为Cyclone 10 GX系列规模最大一颗料,由于功能升级增加了功能模块更多,发现器件片内RAM不够使用了。为了探索片内RAM使用的利用率问题,从代码RTL级与编译软件的优化选项方面进行了思考。表1是器件手册中给出的C10GX器件片内RAM颗粒,即M20K,可配置模式。 表1:Intel Cyclone 10 GX器件单端口片内存储器配置 对于MLAB来说,一个MLAB大小是640bit,是由双功能逻辑阵列模块(LAB)配置而成。MLAB是宽而浅型存储阵列的最佳选择,每个MLAB由10个自适应逻辑模块(ALM)组成,在Intel Cyclone 10 GX器件中,这些ALM可配置成10个32x2模块,这样的每个MLAB可实现32x20的简单双端口SRAM模块,Cyclone 10 GX系列器件中片内存储器性能及分布如表2所示。 表2:Intel Cyclone 10 GX器件中片内存储器性能及分布 项目遭遇片内RAM不够问题 升级的项目,在之前逻辑设计的基础上增加了两个模块,理论上存储器消耗要增加一倍。逻辑修改后,工程全编译时,在Fit阶段报错,提示目标器件无法提供足够的RAM来完成布局,如图1所示。 图1:因RAM不足,导致布局失败 Info ( 170034 ) : Selected device has 587 memory locations of type M20K block. The current design requires 626 memory locations of type M20K block to successfully fit. Info ( 170033 ) : Memory usage required for the design in the current device: 107 % M20K block memory block locations required Info ( 170043 ) : The Fitter setting for Equivalent RAM and MLAB Paused Read Capabilities is currently set to Care. More RAMs may be placed in MLAB locations if a different paused read behavior is allowed. 从编译消息列表中摘出上述3条有关出错的消息,第一条提示器件总共587个M20K颗粒,当前设计需要626个来完成布局。第二条给出当前设计完成布局需要消耗器件片内RAM颗粒数量是目标器件能提供的107%。第三条消息提示Fitter的关于“Equivalent RAM and MLAB Paused Read Capabilities”当前设置是“Care”,如果允许更改该设置,则可以将更多的RAM消耗替换为MLAB消耗。 在Quartus的Settings设置中,找到编译器设置页面,并在该页面中找到属于Fitter的Settings高级设置按钮,如图2所示,并点击此按钮进入高级Fitter设置页面。 图2:编译器设置页面 如图3所示,为Fitter的高级设置页面,找到“Equivalent RAM and MLAB Paused Read Capabilities”设置选项,可以将默认设置“Care”修改为“Don’t Care”,如此再重新编译后则可以解决上述报错问题,如图4。 如图4所示,虽然经过上述修改解决该报错问题,但是整个RAM消耗已经达到了100%。100%的RAM消耗率,如果设计功能已经达到目标要求,则是可以作为最终设计提交,但是这仅仅这是项目的预先编译评估,所以并不能就此停止。比如,在后期调试时需要添加SignalTap功能的时候,就可能面临无RAM可用的情况。同时,还需要了解上述设置修改对逻辑设计是否产生负面影响进行评估,即需要对该设置进行深入了解,否则不要轻易修改默认设置。 如果需要进一步减小RAM消耗,那么就需要针对当前设计进行深度优化,这是下一节的内容。 图3:高级Fitter设置页面 片内RAM耗尽后,优化思考 Cyclone 10 GX最大型号器件,总共有587颗片内M20K颗粒,如图4所示,按照图3所示对Fitter高级设置进行修改后,对工程再编译,全编译无报错通过,编译报告提示所有M20K颗粒已经100%耗尽。 图4:M20K颗粒耗尽统计报告信息 如果查看Fitter给出的各个M20K颗粒使用详尽信息,可以发现,各个颗粒容量的使用率不尽相同,有些颗粒甚至使用了不到1%,如图5所示,这些颗粒有12个。 图5:Cyclone 10 GX系列最大器件中M20K颗粒使用情况信息 上述不到1%利用率的M20K颗粒很大可能是为了与其它颗粒“凑整”过程中被消耗的,一旦被占据,该M20K颗粒空余空间就无法开放给其它逻辑使用了。如此大大降低了RAM颗粒的利用率,在进行逻辑设计的初始阶段就应该核算RAM、FIFO或ROM的大小与实际片内RAM颗粒的尺寸来进行规划,提高资源的利用效率。 举个简单的例子说明RAM被“奢侈”利用,AD9633分解为8个LVDS接收器通道,解串后得到了48-bit的并行数据,这时创建了一个FIFO来缓冲该数字转换数据,所以FIFO的位宽48-bit,深度选择为8。所以一个FIFO实际消耗384-bit的RAM,但是经过编译,该FIFO必须要使用2个M20K颗粒(共40960-bit)来实现,RAM利用率不到1%。是不是很奢侈,很浪费?! 这个FIFO的读写时钟不一样,所以属于异步FIFO,修改图3所示的高级设置选项也无法将FIFO转换为MLAB来实现。在例化FIFO的时候倒是可以强制指定使用MLAB来实现它。 参考 Intel Cyclone 10 Devvices Overview.
  • 热度 1
    2024-8-11 10:37
    676 次阅读|
    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
    903 次阅读|
    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
    478 次阅读|
    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' );
相关资源