高速系统设计实例设计分析
在上几章的内容中,我们从纯粹高速信号的理论分析,到 Cadence 工具的具体使用都做了详细的讲解和介绍。相信读者通过前面章节的学习,已经对高速系统的设计理念及 Cadence 相应的设计流程和工具有了一个基本的认识。但是,对于高速电路设计的学习就止于此的话,那么实际上还是纸上谈兵。
如果读者真正面对高速电路设计的挑战与乐趣,下面从本章开始,我们通过一个实际的设计实例来贯穿前面几章的所有内容,从调入网表的设计开始,一步一步带领读者,使用 Cadence 的高速设计流程工具链完成整个设计。
只有通过读者亲自动手,从头到尾做一个完整的设计,对高速电路设计有切身的体会,再加深理论的学习,不断总结和积累实际的设计经验,才能在技术飞速发展的时代利于不败之地。
本章所讲述的内容,是对一个设计实例的逐步实现过程。因此,需要读者能够积极参与,在阅读本书内容的同时,应该在自己的电脑上同步进行实际的操作演练,这样才能更好地理解所讲述的内容,也能够通过解决在操作过程中遇到的实际问题,将高速电路的设计精髓和理念变成自己的知识。在本章的讲述过程中,不再详细介绍工具的操作方法,而是注重工具的使用,也就是说,我们不会再介绍在哪个菜单里,选择哪个工具,然后点击哪个按钮,而是直接讲我们要打开哪个工具,做什么事情,得到什么结果。如果对 Cadence 的高速设计流程理念和工具链的使用还存在疑问的话,建议读者再熟悉一下第4章和第5章的内容。
再次请读者注意,本章所使用的设计实例及相关资料,可以通过合作网站提供的推广和论坛网站 shaopeng.pcteach.net 和 shaopeng.pccbsbs.com 找到下载链接进行免费下载。并且,对于本书推出之后的一系列相关技术探讨和交流,也将在这里进行。所以希望读者能够在此论坛进行免费注册,并定期查阅技术资料的更新和问题讨论。
需要声明,本设计实例项目“BookSI_Demo.brd”仅用于本书的讲解和示范目的。作者不保证该实例(包括整体及任何属于该设计实例之中的任何设计元素)被用于其他目的的正确性。对该实例被用于其他场合和目的时所引发的后果和损失,作者不承担任何责任!
好,现在请打开你的电脑,我们开始一步一步地完成这个设计。
6.1 设计实例介绍
在开始设计之前,我们要先了解这个例子的内容,清楚设计目的,也就是我们的任务。实际上,对于任何一件事情,在实际动手之前,一定要了解设计意图和目的,不清楚目标在哪里,是没有办法做好事情的。在这里给读者讲个故事,这是作者在上大学期间发生的真实事件。在一次电路实验课上,老师留了一个实验任务,用示波器测量一个 5MHz 的方波信号,只要能够让学生在示波器的屏幕上看到 5MHz 方波信号的波形就算完成。当时的示波器是那种非常笨重的示波器,测量带宽为 5M。老师说开始后,学生们就开始忙碌起来。看起来任务很简单,接入信号,调整示波器到适当的测量精度,显示出波形就算完成任务了,然而十几分钟后,没有一个人能够在示波器上看到老师要求的方波信号。聪明的读者,你明白其中的原因么?
是的,这是个不可能完成的任务,Mission Impossible!道理很简单,要观察到 5MHz 的方波信号,我们至少需要三次谐波进行重现,这样才能够看到方波波形的大致轮廓。可是示波器的测量带宽只有 5MHz,那么我们只能看到一个 5MHz 的正弦波,事实上,能看到 5MHz 的正弦波就算示波器调谐正确,完成了任务。可是当时我们没有人去想,我们的任务是什么?而面临的条件又是什么?
这堂课,给我留下的印象非常深刻,作为一名工程师,当我们面临一个问题的时候,我们始终要保持清醒的头脑,每时每刻都要问自己,我们面临的问题是 什么?有哪些现实条件和方法可以利用?如果不能完美地达到既定目标,那么能够完成的状态应该是什么程度,在这个过程中要做哪些折中?
言归正传,我们回到本书的内容上来,来看看我们面临的任务是什么。参照图 6-1,这是个非常简单的功能框图,读者可以打开已经调入网表的 PCB 文件 “Booksi_Demo_Allegro160_UnRouted.brd” 进行对照理解。我们要完成的这个设计,是一个信号处理子板,FPGA 作为这个子板的主要器件,负责信号处理及和主机板进行数据交换。外部信号通过光电转换,通过 RocketIO 高速数字接口,进入 FPGA,FPGA 对接收的信号进行运算,以两组 DDR 作为缓存,该子板和主机板通过 64 位 VME-CPCI 接口相连。这是一个通用的数字信号处理平台的架构。
在这个设计中,我们并不是要实现所有的设计。为了能够让读者掌握高速电路设计方法和 Cadence 高速设计流程,我们仅仅对 DDR 部分进行详细的设计分析和实现。从图 6-1 中可以看到,该设计中,DDR 分为两组,功能和结构都相同,所以我们可以只对其中一组进行设计分析,然后将仿真设计分析结果,以及高速设计约束不加修改地应用到第二组 DDR 设计中。
6.2 DDR 设计分析
为了读者能够更好地理解 DDR 设计需求,在图 6-2 中,是对其中一组 DDR 功能模块的细化框图。在这个系统中,对 DDR 的设计需求如下。
- 整个 DDR 功能模块由四个 512MB 的 DDR 芯片组成,选用 Micron 的 DDR 存储芯片 MT46V64M8BN-75。每个 DDR 芯片是 8 位数据宽度,构成 32 位宽的 2GB DDR 存储单元,地址空间为 Add<13..0>,分四个 Bank,寻址信号为 BA<1..0>。
- 每个 DDR 芯片独享 DQS、DM 信号,四片 DDR 芯片共享 RAS#、CAS#、CS#、WE#控制信号。
- DDR 工作频率为 133MHz。
- DDR 控制器选用 Xilinx 公司的 FPGA,型号为 XC2VP30_6FF1152C。
得到这个设计需求之后,我们首先要进行器件选型,然后根据所选的器件,准备相关的设计资料。一般来讲,对于经过选型的器件,为了使用这个器件进行相关设计,需要有如下资料。
- 器件数据手册 Datasheet:这个是必须的。如果没有器件手册,是没有办法进行设计的(一般经过选型的器件,设计工程师一定会有数据手册)。
- 相关器件的应用手册,Application Note:在这个文档中,厂家一般会提出一些设计建议,甚至参考设计,有时该文档也会作为器件手册的一部分出现在器件手册文档中。但是在资料的搜集和准备中,要注意这些信息是否齐备。
- 参考设计,Reference Design:对于比较复杂的器件,厂商一般会提供一些参考设计,以帮助使用者尽快实现解决方案。有些厂商甚至会直接提供原理图,用户可以根据自己的需求进行更改。
- IBIS 文件:这个对高速设计而言是必需的,获得的方法前面已经讲过。
- 工业规范标准,Specification:如果所设计的功能模块要实现某种工业标准接口或者协议,那一定要找到相关的工业规范标准,读懂规范之后,才能开始设计。
因此,为实现本设计实例中的 DDR 模块,需要表 6-1 中的技术资料和文档。
由于我们要设计 DDR 存储模块,那么在所有的资料当中,应该最先了解 DDR 规范。通过对 DDR 规范文件 “JEDEC792.pdf” 的阅读,我们了解到,设计一个 DDR 接口,需要满足规范中规定的 DC、AC 特性及信号时序特征。下面我们从设计规范要求和器件本身特性两个方面来解读,如何在设计中满足设计要求。
需要注意的是,由于技术的更新,在本设计实例中所使用的器件可能已经过时,这里仅做技术讲解之用。如果读者想获得最新的产品信息,包括器件手册和方针模型,请登录器件厂商的网站获得。
6.2.1 DDR 规范的 DC 和 AC 特性
众所周知,对于任何一种接口规范的设计,首先要了解其 DC 和 AC 特性要求,DDR 也不例外。
在 DDR 规范文件 “JEDEC79R2.pdf” 的第 51 页 “TABLE 6: ELECTRICAL CHARACTERISTICS AND DC OPERATING CONDITIONS”中对 DDR 的 DC 有明确要求:VCC=+2.5V±0.2V,Vref=+1.25V±0.05V,VTT=Vref±0.04V。
在我们的实际设计中,除了要精确设计供电电源模块之外,还需要对整个电源系统进行 PI 仿真,而这是高速系统设计中另一个需要考虑的问题,在这里我们先不讨论它,暂时认为系统能够提供稳定的供电电源。
除 DC 特性外,我们还应该注意规范中提到的 AC 特性,所谓 AC 特性,就是信号在高速翻转状态下所表现出的动态变化特性。DDR 规范中第 60 页,对处于动态变化的地址信号、控制信号及数据信号分别给出了交流特性的要求。为方便读者,现把规范中对于信号交流特性的要求复制到这里,如图 6-3 所示。作为高速设计的一部分,要确保在我们的系统中,所有处于高速工作状态下的 DDR 信号要符合这个 AC 特性规范。
6.2.2 DDR 规范的时序要求
在明确了规范中的 DC 和 AC 要求之后,下一步,我们还应该了解规范中对于信号的时序要求。这是我们所设计的 DDR 系统能够正常工作的基本条件。
在规范文件中,有很多时序图,作者大致计算了一下,有 40 个左右。作为高速电路设计的工程师,我们不可能也没有时间去做全部的仿真波形来和规范的要求一一对比验证,那么哪些时序图才是我们关注的重点?事实上,在所有的这些时序图中,作为 SI 工程师,我们需要关注的只有两个,那就是规范文件的第 69 页,关于数据读出和写入两个最基本的时序图(注意,这里的读出和写入是从 DDR 控制器,也即 FPGA 的角度来讲的)。为方便读者阅读,作者把这两个时序图拼在了一起,如图 6-4 所示,而其他时序图的实现都是以这两个图为基础的。在板级系统设计中,只要满足了这两个时序图的质量,其他的时序关系要求都是对这两个时序图逻辑功能的扩展,应该是 DDR 控制器的逻辑设计人员所需要考虑的事情。
请读者注意,这两个图有其特殊含义,也是 DDR 体系结构的具体体现。而遗憾的是,在作者接触过的很多高速电路设计人员中,很多人还不能说清楚这两个图的含义。在数据写入(Write)时序图中,所有信号都是 DDR 控制器输出的,而 DQS 和 DQ 信号相差 90° 相位,因此 DDR 芯片才能够在 DQS 信号的控制下,对 DQ 和 DM 信号进行双沿采样;而在数据读出(Read)时序图中,所有信号是 DDR芯片输出的,并且,并且(这不是笔误,是强调)DQ 和 DQS 信号是同步的,并且都是和时钟沿对齐的!这时候为了要实现对 DQ 信号的双沿采样,DDR 控制器就需要自己去调整 DQS 和 DQ 信号之间的相位延时!这也就是 DDR 系统中比较难以实现的地方。DDR 规范这样做的原因很简单,是要把逻辑设计的复杂性留在控制器一端,从而使得外设(DDR 存储芯片)的设计变得简单而廉价。因此,对于 DDR 系统设计而言,信号完整性仿真和分析的大部分工作,实质上就是要保证这两个时序图的正确性。
那么在下面的仿真分析过程中,我们是不是可以就以这两个图中的时序要求作为衡量标准来进行系统设计呢?答案是否定的,因为虽然这个时序是规范中定义的标准,但是在系统实现中,我们所使用的是 Micron 的产品,而最后系统是否能够正常工作要取决于我们对 Micron 芯片的时序控制程度。所以虽然我们通过阅读 DDR 规范文件了解到基本设计要求,但是具体实现的参数指标要以 Micron 芯片的数据手册为准。换句话说,DDR 的工业规范是芯片制造商 Micron 所依据的标准,而我们设计系统时,既然使用了 Micron 的产品,那么系统的性能指标分析就要以 Micron 的产品为准。所以,接下来的任务就是我们要在 Micron 的 DDR 芯片手册和作为控制器的 FPGA 数据手册中,找到类似的 DDR 规范的设计要求和具体的设计参数。
6.2.3 DDR 芯片的电气特性和时序要求
按照上一小节中最后的结论,我们需要在 DDR 芯片的数据手册中找到和 DDR 规范中电气和时序要求相符的内容,按照这个思路去阅读 DDR 器件的数据手册,读者不难找到,在 DDR 芯片手册的第 70 页的关于 DDR 数据写入的时序图,如图 6-5 所示。
而在手册 67 页,可以找到数据输出时序图,如图 6-6 所示。
除了这两个时序图之外,我们还需要考察 DDR 芯片的 DC 和 AC 特性。前面我们讲过,对于 DC 特性,我们目前只能通过仔细设计电源模块,假设其符合规范要求,具体性能需要通过电源完整性分析进行验证。因此,在这里,我们只需要关心信号 AC 特性的要求,在 DDR 芯片手册的第 48 页有对 AC 特性描述的内容,如图 6-7 所示。
在找到 DDR 芯片的 AC 特性和时序特性要求的内容之后,需要仔细对图中的内容进行解读,并且需要了解该图中各参数的含义和具体指标。因此,读懂上述几个关键波形之后,还需要在数据手册中找到对应参数的具体要求,在 DDR 的手册中,位于第 59 页的表格 “Table 25: Electrical Characteristics and Recommended AC Operating Conditions(-75Z/-75)” 就是对各参数的描述及其指标的具体要求。为了方便下面的仿真分析工作,我们用表格的形式把 DDR 芯片中的关键参数记录下来,这也是一个很好的工作习惯,以免在需要时不停地查找数据手册。DDR 中关于数据读写的关键时序及电气参数,如表 6-2 所示。
6.2.4 DDR 控制器的电气特性和时序要求
上一小节中,我们在 DDR 芯片的器件手册中找到并记录了关键数据。接下来,我们需要对 DDR 控制器做同样的数据分析工作,以确保 DDR 控制器和存储芯片能够在一个系统中配合工作。
在一个 DDR 系统中,如果 DDR 控制器也是一个类似于 DDR 存储芯片那样的商用芯片的话,我们可以按照同样的做法找到需要的资料。在设计实现的过程中,按照资料中提供的数据对设计进行验证。然而对于我们这个设计来讲有些特殊,DDR 控制器使用的是 FPGA。众所周知,FPGA 的 IO 是可以自定义的,逻辑是可以动态配置的,看起来我们有了更多的自由,在设计上有了更大的灵活性,但是不要忘了那句话 “更大的自由意味着更多的责任”,本来是由专用芯片负责的一些功能逻辑设置和性能参数计算,转移到了 FPGA 的设计者身上。因此,我们在使用 FPGA 的时候要格外小心。
首先我们要确定在 FPGA 中所使用的 IO 逻辑,按照 DDR 的规范要求,我们应该选择 2.5V 的 SSTL_2C/SSTL_2 Compatible 标准的 IO 逻辑,这也就确定了我们将来做仿真分析器件的模型。
然后,按照阅读 DDR 芯片手册的方法,我们需要在 FPGA 的数据手册 120 页中找到 “Virtex-II Pro and Virtex-II Pro X Platform FPGAs: DC and Switching Characteristics”,这就是 FPGA 中关于各种 IO 逻辑的电气特性和开关特性(开关特性也即 AC 特性)的描述。在这一节中,还有一个子标题 “Source-Synchronous Switching Characteristics”,这个正是我们要找的针对于 SSTL_2C 的接口特性参数。通过这一小节的内容后,读者应该能发现文章的重点在于 “Source Synchronous Timing Budgets”,这就是我们在 FPGA 和存储芯片之间实现 DDR 协议的时序保证,也是我们前面所讲的,DDR 时序规范在 FPGA 实现上的具体要求。
按照上一小节的方法,我们把找到的关键数据信息,按照 DDR 的时序做个基本的运算后列举如表 6-3 所示,以方便我们后续的信号仿真分析工作。
现在,我们通过对 DDR 规范、DDR 芯片的数据手册,以及作为 DDR 控制器的 FPGA 数据手册的阅读和总结,得到了要实现一个工作时钟频率为 133MHz 的 DDR 模块所需要满足的设计要求。我们的最终设计目标是要实现 DDR 芯片到 FPGA 的板级互连,而且这种互连需要保证满足 DDR 芯片及 FPGA 对于时序的要求。因此,我们做仿真分析的目的就是在进行实际的 PCB 布线之前,确保设计方案的正确性。明确了工作任务之后,我们就开始着手实际的设计工作。在以下章节的讲解过程中,建议读者准备好表 6-1 中所列举的设计资料,以及 Cadence 软件,我们来同步完成这个设计。
请读者注意,在下面的设计实现过程中,我们将完全按照 Cadence 的高速设计流程来进行,如果对这个设计流程及工具的使用还有疑问的话,建议读者重新阅读本书第 5 章的所有内容,有必要的话再练习一下工具软件的使用。因为在下面的讲解过程中,我们将重点放在设计实现过程和问题的分析解决上,而不是带领读者去熟悉软件的使用。
6.3 仿真库的建立
在前面的资料准备中,我们已经得到了 DDR 芯片和 FPGA 的 IBIS 模型文件,“127b.ibs” 和 “v2pro.ibs”,这两个文件都是可以从芯片厂商的网站上下载得到的。作为高速电路设计流程的第一步,我们需要用 Model Integrity 对这两个模型文件的正确性进行验证,并把它们转换成 Cadence 所需的 DML 模型库。
6.3.1 DDR 芯片的 IBIS 文件处理
我们首先对 “127b.ibs” 文件进行处理,因为这个文件比较小,我们猜想遇到的问题不会多,处理起来也不会太复杂,所以先从简单的模型开始。在 Model Integrity 中打开这个文件之后,软件下半部的 “Parse Messages” 区域就会自动显示 Model Integrity 对这个文件的分析结果,如表 6-4 所示。
从最后几行可以看出,分析结果是成功的,没有发现错误,文件内容被接受,也就意味着这个文件可以被转换成 DML 文件,并在 Cadence 的仿真分析软件里使用。但是这个 IBS 文件中存在 12 个 Warning,为了让读者了解更多的 IBIS 知识,也为了确保随后的仿真结果的正确性,我们有必要对这些警告信息进行解读。
通过对这些 Warning 进行解读,我们发现这些 Warning 都是同一类错误,XXXX data is non-monotonic,也就是说这些数据具有非常规性,而且都出现在 Pullup 和 Pulldown 曲线中。为了搞清楚这些 Warning 的严重性,它们到底会不会影响我们高速信号的仿真分析结果,我们按照提示信息的指示到原文件中定位 Warning 的数据来源。我们先找到 635 行的位置,如图 6-8 中 “1” 标记所示。
635 行的数据是 “-53.14055830E-3”,按照变化趋势,在它上面最近的那个有效数据 “NA” 不是有效数据行,即 629 行的值应小于这个值,可是 629 行的数据是 “-52.8628714E-3”,这就出现了数据单调性的错误。同样道理如图中 “2” “3” 标记处,就是 636 行和 637 行的两个警告性错误。那么这个错误会不会影响仿真结果的准确性呢?答案是不会的,因为我们已经讲解过 IBIS 模型的原理,IBIS 模型是一种抽象的理想化的模型,在理论上它要求 V/I 数据的单调性,但是由于实际器件的参数不一致性,或者测量的精度误差,在实际测量中会有些很小的偏差,但是这种偏差不影响曲线整体的单调性,所以像这样很细小的非单调性,我们完全可以忽略掉。另外,为了验证我们的分析结果,可以通过图形直观地看一下在“Model|DQ_FULL”下的 Pulldown 曲线,如图 6-9 所示。图中箭头所指之处就是非单调性发生的位置。从整个波形的趋势来看,这几个非单调性 Warning 确实不会影响整个曲线特性。同理,我们可以对其他几个非单调性 Warning 做出同样的结论。本书中就不一一列举,留给读者去分析数据观察波形。
在得到这个结论之后,我们就可以通过 “Tools→IBIS→To DML” 命令,把当前这个 IBIS 文件转换成 DML 文件,在对 “127b.ibs” 文件进行转换时,Model Integrity 下部的 “Log File” 窗口中,又出现了很多警告信息,我们一起来看看是什么样的警告。由于内容太多,对于出错信息,在这里只截取一部分内容显示,如表 6-5 所示。
对于上面的众多错误信息,可以分为以下几类进行分析讲解,其他信息参考这里的分类进行理解。
- “Overall typical area exceeds overall maximum area”,此类信息是出自 IBIS 文件的定义。IBIS 的规范要求,在 Min、Typical 和 Max 三个测量条件下,所测量的电压范围应该保持一致,也就是说 Typical 测量的是 -3V 到 +6V 之间的电压范围,那么另外两种条件下测量范围也应该是 -3V 到 +6V 之间,并且两个端点,-3V 和 +6V 这两个测量值,不能是 NA。
- “non-monotonic region(s) in the range of ...”,这个警告的起因和处理方法在前面已经讲过了,生成 DML 时无非是对同样的错误再一次检查。
- “TVCurve should asymptotically approach a final value - point added”,曲线的采样点不够,没有达到测量范围,软件会根据 V/T 曲线自动进行估值,把数据补充完整。
其他的信息都是这三类警告的重复,读者可详细阅读 LOG 文件,对所有的出错信息进行对比检查。在对以上这些出现在 DML 转换过程中的警告信息进行分析后,我们发现 DML 转换最终还是会成功的,而且根据我们的理解,这些错误警告并不影响仿真结果。所以我们接受这个 DML 把它存储起来并记下存储路径。在后面的流程中,我们需要把这个 DML 文件添加到仿真库中。
6.3.2 FPGA 的 IBIS 模型文件处理
现在,我们开始处理 FPGA 的 IBIS 文件 “v2pro.ibs”。首先,还是在 Model Integrity 中打开这个文件进行 IBIS 解析,结果如表 6-6 所示。
这里的错误类型比较多,我们一一来分析。
-“WARNING (line31)- Component 'Virtex-II Pro' contains a blankcharacter.",这个错误很简单,就是要求器件名称中不能有空格,而这里在 P 字母之前有个空格。这个错误可以忽略掉。因为在转换成 DML 时,软件可以自动更改这个错误。
- “WARNING - Model PCF33: Vmeas timing test load parameter should be specified” 是说,对于 Model PCF33,缺少了一个测量电压 Vmeas 的定义。Vmeas 是 SigXP 中用来测量 Switch-Settle Delay 的参数,但它在 IBIS 模型中不是必需的。如果器件模型中没有这个参数的定义,那么 SigXP 就不能自动测量 Switch-Settle Delay。所以,如果读者在意这个测量,那么可以在修改 IBIS 文件加入 Vmeas 值,或者在 SigXP 的测量设置中加入 Vmeas 参数。
- “WARNING - Model LVDS25E: POWER Clamp: Maximum value never becomes zero.” 简单讲过,IBIS 是理想模型,所以它要求当对器件施加的电压为 0 时,相应 V/T 曲线的 I 值也应该是 0。也就是我们常说的 V/T 曲线过原点的问题。但是这个文件中,Model LVDS25E 的 POWER Clamp 数据中,I(max) 的值在 voltage=0 时,还有 3.2770uA,所以 Model Integrity 会报这个错。实际使用中可以不理睬这个警告,也可以手动更改 I(max) 的值,小于 0.1uA 后,就不会再报这个警告了。
- “WARNING - Model LVDS25E: The [Rising Waveform]...”,这个警告类型就比较复杂了,包括以下的几个警告都是属于同一类型的。这个错误的产生原因比较复杂,涉及 IBIS 模型的测量数据处理机制。这里作者只做简单解释,如果读者想了解更多的内容,请阅读 IBIS 模型关于 COMS 器件模型创建的相关内容。在 IBIS 模型中,尽管对曲线数据进行了分类,比如四个 V/I 曲线,以及两个 V/T 曲线,但是各个曲线之间不是独立的,为保持数据的完整性和一致性,这几个曲线之间可以相互验证。以这个错误为例,V/T 曲线的含义是:在 V/T 曲线中的第一个点,0 时刻开始,这也应该是相应驱动器(具体是哪个驱动器,要看是上升曲线,还是下降曲线)关闭的状态;而 V/T 曲线中的最后一个测量点,应该是该驱动器完全打开的状态,又已知当测量负载 R_fixture=50 Ω 时,在相应的 V/T 曲线中也应该能找到对应的数据点,并且该点的电压、电流值与 V/T 曲线中保持一致。但事实上,由于 V/I 曲线和 V/T 曲线并不是从同一次测量中的数据转换而来的,因此必然会存在一定的误差或不一致的情况。这里警告信息报告的就是两个曲线总数据点不一致的情况。我们可以看一下这个误差的大小,一般在 5%以下,所以这个警告也可以忽略,不影响 IBIS 文件的正确性。
对这些警告信息有了清楚的认识之后,我们就可以放心地使用这个 IBIS 文件了。那么下一个步骤就是把这个 IBIS 文件转换成 DML 文件。和处理 DDR 芯片IBIS 模型文件的步骤一样,在菜单中选择 “Tools→IBIS→To DML” 命令,对 IBIS 文件进行转换。
可是……我们遇到了更多的问题……首先是工具弹出了一个窗口,报告由于错误太多,具体出错位置不在原 IBIS 文件中一一标注,这时单击 “OK” 按钮关闭这个窗口。我们转到 Log 窗口,仔细查看这些错误信息。对于 Log 窗口中的错误警告信息一一检查之后,我们发现,所有的错误类型都能在上一节中找到,在这里就不再重复了。在最后一行可以看到 “Output saved as C:\Projects\Books\Simmodels\V2pro.dml”,说明 DML 文件转换成功,经过适当的路径设置后,就可以在仿真分析中使用了。至此,我们完成了为 DDR 进行仿真分析所需的 IBIS 模型文件处理过程,也希望通过这一部分的介绍读者能够在处理其他器件的 IBIS 模型文件时解决出现的类似问题。
6.3.3 仿真库的建立
在我们对仿真所需要的两个 IBIS 文件进行转换之后,还需要在软件中把转换成的两个 DML 文件加入到仿真库中,否则在器件的模型设置的时候,找不到器件所需的模型,或者在仿真环境中,找不到 I/O 所需的 Buffer 模型。
把仿真库加入到设计中的方法是,在菜单中选择 “Analyze→SI/EMI Sim→Library” 命令,将打开如图 6-10 所示的关于仿真库的设置界面,选择 “Add existing Library→Local Library” 命令把上面已经做好的两个 DML 文件加入到设计中。这样,在随后的器件模型指定或者 I/O 管脚模型定义中就可以使用已经由 IBIS 文件转换好的 DML 模型了。
6.4 仿真条件设置——Setup Advisor
在上一节中,我们已经对设计中需要使用的两个器件的 IBIS 文件进行了转换,并准备好在后续的工作中使用。从这一节开始,我们按照在第 5 章中对 Cadence 高速设计流程的介绍逐步实现这个设计。有条件的读者,现在可以打开 Cadence 的 SPB 设计系统,并打开网上下载的设计文件 “Booksi_Demo_Allegro160_Unrouted.brd”,这是一个未完成 DDR 布线文件,按照本章节中实现高速系统设计的步骤来同步进行操作。
前面讲过,为了方便用户的使用,Cadence 提供了一个对仿真分析进行条件设置的集成环境 Setup Advisor。先请读者在软件中打开 Setup Advisor 环境,我们来完成仿真前的环境和参数设置。
6.4.1 设置叠层和阻抗特性
第一步就是对将要设计的 PCB 设计叠层和阻抗参数设置,具体的参数设置如图 6-11 所示。当打开设计实例文件后,这些参数都已经设计好了,用户可以根据自己的需求进行更改。在 Cadence 软件中,会根据用户输入的各参数,自动对各层的布线阻抗,包括单端阻抗和差分阻抗进行计算。如果读者对于叠层参数如何影响传输线的阻抗特性还有疑问的话,请参考本书 2.4 节对传输线各参数的详细描述。
在我们设置的叠层结构下,传输线的阻抗总体上在 60 Ω 上下变动,所以在下面的前仿真环境中,需要采用 60 Ω 的传输线。可以看到,对于叠层的参数设置,不是按照用户的喜好随意设置的。在确定叠层参数之后,一定要积极和 PCB 生产商联系,按照厂商的工艺条件,对叠层参数和阻抗要求进行复核。有可能需要根据他们提出的一些要求进行更改,以保证设计和现实之间最大程度的吻合。
设置好叠层参数后,单击下一步进入 DC 电压设置。
6.4.2 设置电压
对于电压的设置,这里唯一要提醒读者的是,所有在我们仿真中遇到的直流电压,一定要设置正确的工作电压,否则在仿真过程中,可能会由于供电电压引起工作点改变,进而影响器件的正常开关状态,从而导致仿真结果完全不可信。在我们的这个设计实例中,除了要设置图 6-12 中的一些工作电压之外,一定不要忘记还需要设置 DDR 的端接电压 \(V_{TT}\),该电压的网络名称为 \(V_{TDQS}\),按照字母排序,位于整个网络表的后部,因此很容易把它遗忘掉。在网络列表的后部找到 \(V_{TDQS}\) 之后,把电压值设置成 1.25V。用户还可以通过在 “Net Filter” 文本框中设置网络名称的过滤条件,以便能够更快地找到 \(V_{TDQS}\) 这个电压网络。
在本书 5.4.2 节中,我们第一次介绍工作电压的设置时,留给读者一个思考,那就是并不是对设计中的所有工作电压都需要设置。其原因就是,对于仿真分析工作而言,我们只需要设置仿真工作所需的电压即可,和当前仿真网络没有关系的电压可以不用设置。由此可以推出,也并不是对设计中的所有器件都要赋予仿真模型,只设置那些和仿真分析对象相关的器件模型,使得我们能够进行正常的仿真分析即可。
6.4.3 器件类型和模型设置
设置好工作电压后,继续进行器件模型设置,如图 6-13 所示的设置界面。这个界面中的参数不建议用户修改,除非你有足够的理由要这么做。另外,即使修改,也绝对不能把默认值改成 0,例如,不能让电容的默认值是 0pF。这样做的话,有可能会使仿真软件算法溢出或者不收敛。对于 0 值的使用,我们通常会用一个很小的值代替,比如 0.01pF。另外,对器件的默认标号字母也不要修改,除非你拿到的网表就是一个特殊的网表,比如非要把电容器件命名为 K123,这纯属个人偏好问题,但不利于交流。
对于读者手中的设计实例,我们还需要加入一个默认的标号类别,即如图 6-13 所示的那样,用 RP*代表阻排 Resistor Pack,默认阻值为 50 Ω。正确地设置器件标号类别,是下一步进行模型设置的基础,马上我们就会讲到。
设置好默认的器件类型后,下一步是仿真模型的设置。本例中,单击 “SI Model Assignment” 按钮,软件会弹出如下的警告信息,如图 6-14 所示。在这个提示信息中,软件检查到在设计中,网络都可能是电源网络,但是却没有被设定电压值,所以软件认为这些都是仿真分析中潜在的错误,并建议设计者对所有的电源网络都设定电压值。事实上,我们讲过,我们做的工作仅仅是为了仿真分析,对于仿真分析中没有用到的电压值,就是可以忽略的。所以,对于这个警告提示,我们再一次检查一下,有没有什么电源网络是仿真中需要的而被我们忽略掉的,如果没有,那么可以放心地进行下一步,否则,就需要回到电源电压设计界面,对仿真所需的电源网络重新设置工作电压值。
进入到模型设置界面 “Signal Model Assignment” 后,首先我们要做的是单击 “Auto Setup” 按钮,这一步是让系统对 RLC 等元件自动生成所需的模型。在执行完成之后,界面显示如图 6-15 所示。找到 “RPACK4C-AR_SM-S1” 这一行,展开显示后,我们可以看到,所有阻排器件都被赋予了一个 “DEFAULT RESISTOR PACK 4.510HM” 的模型。这个模型及其参数,就是系统根据器件的属性而自动生成并赋予的模型。
让系统自动生成器件模型后,我们注意到需要做仿真分析的 FPGA(标号为 U1)和 DDR 芯片(标号为 U5 到 U12)还没有被指定模型。这两个器件的模型需要我们手工指定。首先选中 DDR 芯片的器件类别 “MT46V64M8_BGA-MT46V64M8FN”,然后单击 “Find Model...” 按钮,在弹出的 “DML Model Browser” 界面中,找到 “MT46V64M8FN” 这个模型,选中它即可,如图 6-16 所示。
这样,所有 DDR 芯片都被赋予了 “MT46V64M8FN” 这个器件模型。
接下来,我们需要对 FPGA 器件,也就是 U1 指定器件模型。但是请读者考虑一下,我们确定要这样做么?让我们先来看看这样做会有什么结果。按照同样的步骤,我们对 U1 指定器件模型,当我们在上图 “DML Model Browser” 界面中对 U1 指定 “Virtex_II_Pro” 这个器件模型时,并没有得到预期结果,而是弹出了如图 6-17 所示的信息提示。
这个提示所描述的信息是,器件 U1 中的 1152 个管脚在模型中没有定义,是否继续执行指定模型的任务,如果继续执行,那么系统将按照管脚属性自动进行管脚的模型指定。在决定是否之前,我们要搞清楚为什么出现这个警告提示。我们知道,器件 U1 是一个 FPGA,它的管脚电气特性是由用户通过配置程序指定的,在配置程序生效之前,所有的管脚都是 “一样” 的,也即通用 I/O 管脚。那么在制作 FPGA 的 IBIS 文件的时候,是没有办法知道哪个管脚应该使用什么样的 I/O 逻辑的,所以在 FPGA 的 IBIS 文件中是没有管脚模型定义这一项的,而只有具体的 I/O 模型,至于系统中到底选用哪个 I/O 模型,是由用户来决定的。也就是说 FPGA 的 IBIS 文件中根本就不存在对器件中某一个具体管脚的描述(读者可以打开 DDR芯片的 IBIS 文件和 FPGA 的 IBIS 文件,将两个文件进行结构上的对比分析,不难发现其中的区别),也就没法从整体上对器件赋予一个模型,而只能针对某个管脚单独地指定模型。基于这个原因,我们在图 6-17 所示的对话框中单击 “否” 按钮,放弃对 U1 进行器件模型的指定。
既然放弃了对 U1 进行器件模型的指定,那么接下来的问题,我们需要在仿真环境中使用 FPGA 的 I/O 模型时,该怎么办?答案是:先让系统对当前设计中所有没有被指定模型的 I/O 自动指定一个默认的 I/O 模型,这样就不会影响我们对信号线拓扑结构的抽取。在进入 SigXP 进行仿真分析时,按照具体的信号性能需求,再针对具体的器件管脚单独指定所需的 I/O 模型。所以,为了实现这个过程,我们需要检查一下,系统所指定的默认的 I/O 模型有哪些。
在信息提示界面中单击 “否” 按钮之后,我们回到图 6-15 所示的 “Signal Model Assignment” 界面,在这个界面的最下方,单击 “Preferences...” 按钮,打开如图 6-18 所示的界面。注意,在这个界面中,为了让系统对没有指定模型的器件指定默认的模型,必须选中 “Use Defaults For Missing Components Models” 复选框,这样当前设计中的所有器件管脚按照下面列举的 I/O 类型,进行默认模型设置。
需要提醒读者的是,对于这个界面中的其他参数,本书不一一做详细介绍,但是并不等于这些参数不重要,相反,对于这些在仿真中所需参数的设置和使用方法读者必须加以了解并且是彻底理解。本书中不做介绍的原因是因为这些参数对于一个 SI 工程师来讲,对参数的字面意义理解起来没有什么难度,不用在此赘述,但是对于这些参数如何影响仿真结果和产品的性能,读者必须要理解得非常透彻。在实际工作中,常常会发生由于参数设置不当,而对设计结果造成影响的例子。
至此,我们已经完成了对所需器件的模型指定工作。单击 “Signal Model Assignment” 界面中的 “OK” 按钮,结束对模型的指定工作。这时,系统又会弹出一信息,如图 6-19 所示。通过阅读其中的内容,读者可以发现,这个信息提示我们哪些器件通过刚才的一些设置被赋予了新的模型。读者需要对这些信息进行检查,以确保下面的仿真工作中所需的器件及 I/O 模型被正确地指定了。
6.5 (预)布局
经过上面几步的工作,我们已经准备好了关键信号仿真分析的条件和参数设置。在目前这个状态下,已经可以开始对关键信号进行拓扑结构的抽取和仿真分析了。但是在这之前,作为一个完整的高速系统设计流程还有一个关键因素没有确定,那就是系统设计要求和预布局。
在上一章对高速系统设计流程的介绍中,我们已经讨论过这个问题。一个具体的 PCB 设计的布局要受很多方面因素的影响,这些预先确定的对布局或者系统性能的要求,在子系统的设计的约束中具有最高的优先级别,在不违反这些要求和约束的前提下,才能谈到对当前设计的实现和优化,如果违反了这些预先设定的要求,那么不论子系统做得多么精细和认真,对于整个项目来讲,都是没有意义的。例如,在我们的这个设计实例中,可以列举出如下的要求。
- 作为一个符合工业标准的板卡,其外型和尺寸都是有严格要求的,没有任何改变的余地;作为和主机系统进行连接的板卡,相关接口的接插件的物理位置也是事先定义的,如实例中右面的四个 VME-CPCI 接口;
作为通信子板,其外接光口的位置也是被限定的,如实例中最左面的四个光接口;
为了适应整个系统的操作和使用要求,按钮和指示灯的位置也是有要求的;
在和主机板互连时,还要考虑物理空间的限制,即在某个区域中对器件高度的要求。
在满足这些预设要求的前提下,再通过对各类信号和互连关系进行合理的规划,我们所见到的设计实例,大致如图 6-20 所示的布局。
相关文章:
高速系统设计实例设计分析
在上几章的内容中,我们从纯粹高速信号的理论分析,到 Cadence 工具的具体使用都做了详细的讲解和介绍。相信读者通过前面章节的学习,已经对高速系统的设计理念及 Cadence 相应的设计流程和工具有了一个基本的认识。但是,对于高速电…...
数据结构与算法学习-JavaScript的Array.prototype.reduce()方法
一、语法 array.reduce(callbackfn, initialValue);callbackfn (accumulator, currentValue, currentIndex, array) > {// 回调逻辑 } callbackFn 为数组中每个元素执行的函数。 其返回值将作为下一次调用 callbackFn 时的 accumulator 参数。对于最后一次调用,…...
[Java][Leetcode simple] 189. 轮转数组
借助辅助数组 借助一个辅助数组tmp保存后面k个元素然后逆序循环,使用数组前面n-k个元素覆盖最后到后面最后把前k个元素从tmp中拿回来public void rotate(int[] nums, int k) {int len nums.length;k k % len;int[] Ra new int[len];int cnt 0;for (int i len-k…...
Hadoop 的代理用户(Proxy User) 功能解释
在$HADOOP_HOME/etc/hadoop下的core-site.xml 配置里,可以新增hadoop集群的代理用户。 在集成配置中,会经常用到。它属于 Hadoop 安全机制的一部分。 以下是对该配置效果的详细说明及示例: 配置效果 <!-- 允许用户 hadoop 从主机 hadoop…...
day06_java中的流程控制语句
流程控制语句 Java提供了一些流程控制语句,来控制程序的执行流程 顺序结构 任何编程语言中最常见的程序结构就是顺序结构顺序结构就是程序从上到下逐行地执行,中间没有任何判断和跳转如果main方法的多行代码之间没有任何流程控制,则程序总是…...
机器学习实战:归一化与标准化的选择指南
在机器学习实战中——是否需要归一化(Normalization)或标准化(Standardization),取决于所使用的模型类型。 ✅ LightGBM / XGBoost 是否需要归一化或标准化? 不需要。 🔧 原因: L…...
【内蒙古】《内蒙古自治区本级政务信息化建设项目预算支出标准(试行)》(内财预〔2024〕1449号)-费用标准解读系列
内蒙古自治区政务服务与数据管理局在2024年11月29日发布了《内蒙古自治区本级政务信息化建设项目预算支出标准(试行)》(内财预〔2024〕1449号)。该文件适用于自治区本级各部门、单位非涉密政务信息化建设项目(以下简称建设项目)经费的预算编制、审核。下…...
文本数据可视化
目录 【实验目的】 【实验原理】 【实验环境】 【实验步骤】 原理 操作步骤 图像展示 【实验目的】 了解什么是文本可视化 掌握文本可视化的相关技术 文本信息的提取和可视表达 本次实验是将某一文本进行可视化生成词云图片 尝试构造文本指纹 【实验原理】…...
qt命名空间演示
#ifndef CIR_H #define CIR_Hnamespace cir {double PI3.141592653;//获取圆行周长double getLenthOfCircle(double radius){return 2*PI*radius;}//获取圆形面积double getAreaOfCircle(double radius){return PI*radius*radius;}} #endif // CIR_H#include <iostream> …...
Android学习总结之布局篇
一、大厂面试高频布局真题解析 1. ConstraintLayout vs RelativeLayout 深度对比 真题问法: "为什么说 ConstraintLayout 是 RelativeLayout 的替代方案?两者在布局原理、性能、复杂场景处理上有什么核心区别?" 核心考点解析&am…...
星际篮球争霸赛/MVP争夺战 - 华为OD机试真题(A卷、Java题解)
华为OD机试题库《C》限时优惠 9.9 华为OD机试题库《Python》限时优惠 9.9 华为OD机试题库《JavaScript》限时优惠 9.9 针对刷题难,效率慢,我们提供一对一算法辅导, 针对个人情况定制化的提高计划(全称1V1效率更高)。 看…...
RNN(循环神经网络)原理与结构
1 RNN(循环神经网络)原理与结构 循环神经网络(Recurrent Neural Network, RNN)是一类专门用于处理序列数据(如时间序列、文本、语音等)的深度学习模型。与传统的前馈神经网络不同,RNN在每个时间…...
Claude深度解析:从技术原理到实战应用的全栈指南
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言:AI编程新纪元中的Claude 在生成式AI技术爆发的2024年,Anthropic的Claude系列模型以卓越的长文本处理能力和精确的代码生成质量,正在重塑程序员的开发范式。当开发者…...
9.渐入佳境 -- 套接字的多种可选项
前言 套接字具有多种特性,这些特性可通过可选项更改。本章将介绍更改套接字可选项的方法,并以此为基础进一步观察套接字内部。 一、套接字可选项和I/O缓冲大小 我们进行套接字编程时往往只关注数据通信,而忽略了套接字具有的不同特性。但是…...
AI日报 - 2024年05月13日
🌟 今日概览 (60秒速览) ▎🚀 技术突破 | Flow-GRPO将在线RL引入流匹配模型,提升性能并降低训练成本;「层内循环」(ILR)技术无需增加参数即可提升Transformer性能。▎💬 行业热议 | ICML强制作者参会政策引发广泛争议…...
开发工具分享: Web前端编码常用的在线编译器
1.OneCompiler 工具网址:https://onecompiler.com/ OneCompiler支持60多种编程语言,在全球有超过1280万用户,让开发者可以轻易实现代码的编写、运行和共享。 OneCompiler的线上调试功能完全免费,对编程语言的覆盖也很全&#x…...
Android学习总结之线程池篇
一、线程池参数调优实战真题 真题 1:直播 APP 弹幕加载线程池设计 题目描述:直播 APP 需要实时加载弹幕数据(网络请求,IO 密集型),同时渲染弹幕视图(UI 操作需切主线程)࿰…...
03.Golang 切片(slice)源码分析(二、append实现)
Golang 切片(slice)源码分析(二、append实现) 前言: Golang 切片(slice)源码分析(一、定义与基础操作实现) 在前面的文章我们介绍了,切片的结构体与创建\扩容…...
Python实例题:pygame开发打飞机游戏
目录 Python实例题 题目 pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本 代码解释 初始化部分: 游戏主循环: 退出部分: 运行思路 注意事项 Python实例题 题目 pygame开发打飞机游戏 pygame-aircraft-game使用 Pygame 开发…...
MySQL创建了一个索引表,如何来验证这个索引表是否使用了呢?
MySQL创建了一个索引表,如何来验证这个索引表是否使用了呢? 1. 使用 EXPLAIN 分析查询执行计划 在 SQL 查询前添加 EXPLAIN 关键字,查看 MySQL 优化器是否选择了你的索引。 示例: EXPLAIN SELECT * FROM db关键输出字段: typ…...
Go语言多线程爬虫与代理IP反爬
有个朋友想用Go语言编写一个多线程爬虫,并且使用代理IP来应对反爬措施。多线程在Go中通常是通过goroutine实现的,所以应该使用goroutine来并发处理多个网页的抓取。然后,代理IP的话,可能需要一个代理池,从中随机选择代…...
Linux文件编程:操作流程与内核机制
在 Linux 操作系统中,一切皆文件,这意味着从硬盘上的数据文件、设备驱动、到管道、套接字等都以文件的形式存在。Linux 的文件系统将这些不同类型的文件统一抽象成文件对象,允许程序通过文件描述符来访问它们。 一、核心概念解析 文件描述符…...
用短说社区搭建的沉浸式生活方式分享平台
你是否想打造一个融合小红书式种草基因与论坛深度互动的全新社区?本文依托短说社区论坛系统的社区功能规划,一起来规划,如何搭建一个集内容分享、社交互动、消费决策于一体的沉浸式生活社区。 短说社区的界面样式支持普通资讯列表或瀑布流列…...
【ASR学习笔记】:语音识别领域基本术语
一、基础术语 ASR (Automatic Speech Recognition) 自动语音识别,把语音信号转换成文本的技术。 VAD (Voice Activity Detection) 语音活动检测,判断一段音频里哪里是说话,哪里是静音或噪音。 Acoustic Model(声学模型࿰…...
2025年best好用的3dsmax插件和脚本
copitor 可以从一个3dsmax场景里将物体直接复制到另一个场景中 Move to surface 这个插件可以将一些物体放到一个平面上 instancer 实体器,举例:场景中有若干独立的光源,不是实体对象,我们可以使用instancer将他变成实体。 paste …...
电厂除灰系统优化:时序数据库如何降低粉尘排放
在环保要求日益严苛的当下,电厂作为能源生产的重要主体,其除灰系统的运行效率与粉尘排放控制效果紧密相关。传统除灰系统在数据处理和排放控制方面存在一定局限性,而时序数据库凭借对时间序列数据的高效存储、处理和分析能力,为电…...
upload-labs通关笔记-第2关 文件上传之MIME绕过
目录 一、MIME字段 1. MIME 类型的作用 2. 常见的 MIME 类型 二、实验准备 1.构造脚本 2.打开靶场 3.源码分析 三、修改MIME字段渗透法 1.选择shell脚本 2.bp开启拦截 3.上传脚本bp拦包 4.bp改包 5.获取脚本地址 6.获取木马URL 7.hackbar渗透 8.蚁剑渗透 本文通…...
未来技术展望:光子量子计算集成与连续变量可视化
光子量子计算作为量子计算的重要分支,凭借其独特的光子传输优势和连续变量编码方式,正在量子计算领域掀起新的技术革命。以Xanadu公司的Borealis光量子处理器为代表,连续变量量子计算的可视化技术将面临全新的挑战与机遇。以下从技术适配、可视化方法及工具开发三个维度展开…...
vite项目使用i18n-ally未读取到文件
前言 在使用 Vue CLI 创建的Vue 3项目中,语言文件(src/lang/zh.js和en.js)正常加载。 .vscode/settings.json如下:i18n-ally.enabledParsers中增加了js {"i18n-ally.localesPaths": ["src/i18n","src/…...
yarn workspace使用指南
作用 Yarn workspace 是 Yarn 包管理工具中的一个功能,主要用于管理多包项目(monorepo)。它的主要作用如下: 支持多包结构:允许在一个仓库中管理多个独立的包或项目。项目间依赖管理:方便地在不同包之间添…...
Spring Boot 参数验证
一、依赖配置 首先确保在 pom.xml 中添加了以下依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </dependency> 这个依赖包含了 Hibernate Valida…...
Electron学习大纲
Electron 实际工作学习大纲路线,结合技术原理、实战开发与工程化最佳实践,分为 5 大核心阶段,每个阶段包含关键知识点和实践目标,帮助快速掌握桌面应用开发能力: 阶段一:Electron 基础与环境搭建(1-2周) 核心概念与架构Electron 组成: 主进程(Main Process):控制应…...
Linux 系统中设置开机启动脚本
Linux 系统中设置开机启动脚本有多种方法,适用于不同的场景和需求。以下是几种最常用且详细的方法: 核心理念: 无论哪种方法,核心都是让系统在启动过程中的某个阶段执行你的脚本。 1. 使用 systemd (推荐,现代 Linux 发行版的标准) systemd 是目前大多数主流 Linux 发行…...
如何解决Deepseek服务器繁忙的问题?
在现如今互联网技术飞速发展的时代,AI技术也逐渐开始兴起,Deepseek作为一款强大的AI工具,可以帮助各个行业的用户高效的处理复杂任务,但是,用户在使用这一工具的过程中,可能会遇到服务器繁忙的问题…...
四、STM32 HAL库API完全指南:从功能分类到实战示例
STM32 HAL库API完全指南:从功能分类到实战示例 一、HAL库API的总体架构 STM32 HAL库(Hardware Abstraction Layer)作为STMicroelectronics推出的统一驱动框架,提供了覆盖所有STM32外设的标准化API。HAL库的API设计遵循严格的分层…...
集成学习——Bagging,Boosting
一.什么是集成学习 集成学习的基本思想是通过结合多个基学习器的预测结果,来提高模型的泛化能力和稳定性。这些基学习器可以是相同类型的算法,也可以是不同类型的算法。 当基学习器之间具有一定的差异性时,它们在面对不同的样本子集或特征子…...
如何有效追踪需求的实现情况
有效追踪需求实现情况,需要清晰的需求定义、高效的需求跟踪工具、持续的沟通反馈机制,其中高效的需求跟踪工具尤为关键。 使用需求跟踪工具能确保需求实现进度可视化、提高团队协作效率,并帮助识别和管理潜在风险。例如,使用专业的…...
网页Web端无人机直播RTSP视频流,无需服务器转码,延迟300毫秒
随着无人机技术的飞速发展,全球无人机直播应用市场也快速扩张,从农业植保巡检到应急救援指挥,从大型活动直播到智慧城市安防,实时视频传输已成为刚需。预计到2025年,全球将有超过1000万架商用无人机搭载直播功能&#…...
基于SpringBoot的蜗牛兼职网设计与实现|源码+数据库+开发说明文档
一、项目简介 蜗牛兼职网是一个集职位信息发布、用户申请、企业管理、后台运维于一体的校园类兼职招聘平台,使用 SpringBoot 作为后端核心框架,搭配 Layui Bootstrap 实现前端页面开发,前后端结合,功能齐全。 系统共分为 三种角…...
kafka消费组
Kafka【二】关于消费者组(Consumer Group)、分区(partition)和副本(replica)的理解_consumergroup-CSDN博客 定义: 消费者组是一组可以协同工作的消费者实例的集合。 每个消费者都属于一个特定…...
每日一题洛谷P8662 [蓝桥杯 2018 省 AB] 全球变暖c++
P8662 [蓝桥杯 2018 省 AB] 全球变暖 - 洛谷 (luogu.com.cn) DFS #include<iostream> using namespace std; char a[1001][1001]; bool s[1001][1001]; int res 0; int n; bool flag true; int dx[4] { -1,0,1,0 }; int dy[4] { 0,-1,0,1 }; void dfs(int x, int y)…...
2025年Energy SCI1区TOP,改进雪消融优化算法ISAO+电池健康状态估计,深度解析+性能实测
目录 1.摘要2.雪消融优化算SAO原理3.改进策略4.结果展示5.参考文献6.代码获取7.读者交流 1.摘要 锂离子电池(LIBs)的健康状态(SOH)估计对于电池健康管理系统至关重要,为了准确估计LIBs的健康状态,本文提出…...
docker使用过程中遇到概念问题
容器和虚拟机的区别 容器共享主机内核;虚拟机占用主机内核硬件容器的启动速度是秒级别;虚拟机的启动速度是分钟级别容器资源占用低,性能接近原生;虚拟机资源占用高,性能有一定的损耗容器是进程级别的隔离;…...
leetcode-hot-100(双指针)
1. 移动零 题目链接:移动 0 题目描述:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 解答 类似于签到题&#x…...
力扣HOT100之二叉树:101. 对称二叉树
这道题我本来想着挑战一下自己,尝试着用迭代的方法来做,然后就是用层序遍历,将每一层的元素收集到一个临时的一维向量中,然后再逐层判断每一层是否都是轴对称的,一旦发现某一层不是轴对称的,就直接return f…...
深入解读tcpdump:原理、数据结构与操作手册
一、tcpdump 核心原理 tcpdump 是基于 libpcap 库实现的网络数据包捕获与分析工具,其工作原理可分解为以下层次: 数据包捕获机制 底层依赖:通过操作系统的 数据链路层接口(如 Linux 的 PF_PACKET 套接字或 AF_PACKET 类型&#x…...
HTML5 中实现盒子水平垂直居中的方法
在 HTML5 中,有几种方法可以让一个定位的盒子在父容器中水平垂直居中。以下是几种常用的方法: 使用 Flexbox 布局 <div class"parent"><div class"child">居中内容</div> </div><style>.parent {di…...
个人博客系统测试报告
目录 1 项目背景 2 项目功能 3 项目测试 3.1 测试用例 3.2 登录页面测试 3.3 博客列表页面测试 3.4 博客详情页面测试 3.5 自动化测试 3.5.1 Utils类 3.5.2 登录测试页面类 3.5.3 博客列表页测试类 3.5.4 博客详情页测试类 3.5.5 博客修改页测试类 3.5.6 未登录…...
适配WIN7的最高版本Chrome谷歌浏览器109版本下载
本仓库提供了一个适用于Windows 操作系统的谷歌浏览器109版本的离线安装包。 点击下面链接下载 WIN7的最高版本Chrome谷歌浏览器109版本下载...
从规划到完善,原型标注图全流程设计
一、原型标注图:设计到开发的精准翻译器 1. 设计意图的精准传递 消除模糊性:将设计师的视觉、交互逻辑转化为可量化的数据(尺寸、颜色、动效参数),避免开发“凭感觉还原”。 统一理解标准:通过标注建立团…...