ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Cadence OrCAD层次化设计实战:告别平铺原理图混乱

Cadence OrCAD层次化设计实战:告别平铺原理图混乱 画原理图这件事我入行头两年都是用单页平铺硬怼。等到项目规模到了三四十页才发现光是把电源、MCU、接口、驱动堆在一张图里自己都找不到信号从哪进来的。后来在 Cadence OrCAD 里切到层次化设计Hierarchical Design才算是真正把原理图捋顺了。今天这篇东西就把我在实际项目里用 OrCAD 做层次化设计的思路、流程和踩过的坑一次性说清楚希望对正在被大图纸折磨的硬件工程师有点帮助。Cadence OrCAD Capture 的层次化设计说白了就是把一张巨大无比、连到让人崩溃的原理图拆成“根图 子图”的树状结构。根图只放模块框模块框里再套子图。这种设计方法不是 OrCAD 独有的但 OrCAD 的实现方式有它自己的脾气菜单选项、端口类型、位号处理都和别的工具不太一样。看完这篇文章你能知道什么情况下值得用层次化、怎么在 OrCAD 里把层次块建起来、端口怎么连、位号怎么弄以及最关键的——哪些地方容易出幺蛾子。1. 为什么需要层次化设计从单页图纸的痛苦说起1.1 平铺式设计的三个典型痛点新接触 OrCAD Capture 的人最容易走上的一条路就是打开一张 ORCAD 默认图纸把所有元件符号往上摆。信号连接靠全局网络标号跨页连接靠 off-page connector电源和地用特殊符号一拉一张图纸画得满满的。这种画法在小板卡上确实没什么问题但项目一复杂麻烦就一个接一个地冒出来。痛点一是图纸尺寸根本不够用。标准原理图图纸能容纳的连线数量是有限的当你为了放下更多内容把图纸尺寸调到超大打印看起来费劲PDF 导出后也经常被缩放得看不清楚。更麻烦的是其他人拿到你的图纸根本不知道应该从哪个角落开始看。一个功能模块可能横跨了图纸的左下角和右上角中间还穿过一堆无关电路。痛点二是信号追溯极其困难。平铺式设计里同一个信号经常会在好几页里出现。你想知道 UART_TX 到底去了哪里只能全局搜索。如果有一批设计不太规范的同名信号比如NET1、NET2这种那基本等于大海捞针。调试的时候你用示波器量到一个信号异常回到图纸上顺着网线查查了半天发现它是从另外一页过来的又得翻页继续找效率非常低。痛点三是模块复用和多人协作难做。同一个电源电路如果要出三路平铺式设计只能老老实实复制三遍。复制完以后三份电路就是三个独立个体将来修改了其中一路的滤波电容另外两路很容易忘掉导致 BOM 对不上、样机工作状态不一致。人多的时候更麻烦几个人同时改一份原理图文件合并、版本比对、信号命名冲突光是沟通成本就能压垮一个项目。1.2 层次化设计到底解决什么问题层次化设计的思路用一句大白话说把大图拆成目录。根图相当于项目的总目录下面挂着一堆子页面每个子页面负责一个明确的模块。在根图里你看到的不是密密麻麻的元件而是几个带端口的方框比如“电源模块”、“MCU 模块”、“电机驱动模块”、“通信接口模块”。每个方框都是一个层次块Hierarchical Block。要查看某个模块的具体电路双击对应的框图就进去了要退出模块回到根图按一下工具条上的层次导航按钮就行。信号在模块之间怎么走呢通过层次端口。你在子图里放一个叫PWR_5V的层次端口根图对应的框上就会自动出现一个引脚这个引脚就可以和另一个模块的端口连在一起。你不需要再靠一堆无规律的全局网络标号把信号传得到处都是端口本身就在模块框上谁进谁出一目了然。层次化设计还有一个很大的优势天然适合复用。一个电源模块画好之后在根图里复制出三个层次块底层只需要维护一份子图。三个块引用的都是同一张子原理图将来改一处电容三路电源全部同步更新。这在多通道设计里特别爽尤其是做 ADC 采集板、电机驱动板、音频功放这种“一路通了八路相同”的板子。1.3 适用场景和不适用场景但我必须说一句公道话层次化设计不是所有项目都该上。如果你做的是一块两页以内的简单转接板或者是一个手头只有一两天时间的验证板那平铺式设计反而更快。层层次块的创建、端口命名、位号重排都是有学习成本的小项目里折腾这一套纯属给自己加戏。我个人的经验判断标准是三条。第一原理图总页数超过 8 页或者一张图纸已经明显塞不下果断考虑层次化。第二电路里有多个完全相同的功能通道比如 4 路 ADC 前端、8 路继电器输出、2 路电机驱动这种不用层次化就是浪费白给对方画图的时间。第三项目有两个人以上参与原理图设计层次化可以把底板和功能板、数字部分和模拟部分彻底分开让每个人在自己的子图里干活。不适合层次化的场景也有。如果电路模块之间信号交叉极其严重比如 FPGA 的多组配置信号、复杂的板级互联总线强行按照功能拆成层次块你会发现框图上交叉线比平铺还乱端口定义能让你改到怀疑人生。这种情况下与其硬拆层次不如先把原理图按电源域和功能域重新规划或者直接用多页平坦式设计配合清晰的 off-page connector 命名规则。2. 层次化设计的基本概念与核心术语2.1 层次块、底层图纸和根层在 OrCAD Capture 里层次化设计涉及几个基本对象概念上不复杂但术语和习惯叫法经常混在一起。根层Root Schematic是整个设计的入口。工程建好之后通常会自动生成一个根原理图页面你在原理图文件夹里可以加新页面也可以把这个页面当成根层。根层上面放的主要是层次块而不是一堆具体元件。子图纸Schematic Page是某个层次块对应的实际电路页面。比如你建了一个名为POWER的层次块在工程里你就会多出一个叫POWER的原理图页面里面画着电源芯片、电感、电容这些具体元件。层次块Hierarchical Block是连接根层和子图的关键对象。你可以把层次块看成“子图纸的化身”在根图上它是一个框图框上的引脚就是子图的层次端口。双击框你就进入了子图。这三个对象的关系有点像我电脑里的文件夹结构。层次块是“快捷方式”子图纸是“目标文件夹”根层就是“桌面”。你在根层复制三个层次块就相当于在桌面放了三个指向同一个文件夹的快捷方式里面的内容始终是同一份。OrCAD 里放置层次块的时候会弹出一个对话框让你选择 Implementation Type 和 Implementation Name。Implementation Type 通常选Schematic View然后指定底层原理图页面Implementation Name 就是你在工程里对应的那张子图名称。很多新手在这里迷糊以为是“放入元件”实际上这句话的意思是这个框图指向哪张子图。2.2 端口Hierarchical Port 与 Hierarchical Pin层次化设计里最关键的连接元素是端口。端口分两种子图里放的叫 Hierarchical Port层次端口根图层次块上自动生成的叫 Hierarchical Pin层次引脚。从命名上就能看出端口是“跨层”的连接接口。你在子图里放一个叫CLK的 Hierarchical Port并设置它的方向为INPUT回到根图对应层次块上就会出现一个名字叫CLK的引脚方向是 Input。这样根图里的另一个模块就可以通过连线连到这个引脚上把时钟信号传进子图。端口方向一定要认真设置。输入、输出、双向、无源不同方向在 DRC 检查时会有不同的规则。比如两个输出端口直接接在一起DRC 会报冲突输入端口和输出端口连接则看具体电路是否合理。层次端口的方向如果随便选后面 DRC 报错能让人排查很久。有一点需要特别注意同一个子图里两个层次端口不能同名更不能出现一个叫CLK是 INPUT另一个也叫CLK但类型是 OUTPUT。OrCAD 判重的时候会根据元件和页面来区分同名端口方向不一致会直接报错。根图里连接层次块时建议把层次块的引脚显示出来这样哪个模块用了哪些信号一眼就能扫完。2.3 重复实例与模块复用层次化设计的复用有两种常见形式。一种是一个工程里同一个子图被多个层次块引用两个块指向同一个子图纸另一种是把一个已画好的层次块在根图里复制生成一个新的层次块但底层子图各不相同或者是同一个子图的多个实例。第一种复用的好处是修改同步。你维护一个LED_DRIVER子图根图里放了四个层次块指向它四路驱动电路共享同一份电路定义。缺点也明显四路电路的位号完全一样比如子图里的电阻是R1四个实例都会叫R1。这时候就必须靠“发生”Occurrence机制处理位号让每个实例里的R1变成R1_A、R1_B这种后缀。第二种常见做法是多通道设计里大家比较熟悉的。你先把第一个通道子图画好然后在根图中把层次块复制成多份再为每一个复制出来的块指定不同的底层页面。这样每个通道可以单独修改灵活但同步修改时就麻烦一点每处都要改动。无论哪种方式OrCAD 里都会有“对多个实例进行自动位号标注”的选项。后面我在实操经验部分会详细说怎么避免重复位号踩坑。3. 在 OrCAD Capture 中创建层次化设计的完整流程3.1 第一步先规划模块划分和端口列表不要打开软件就开始建块。我每次做层次化设计都会先拿出一张纸把整个系统的供电树、通信总线、核心控制、模拟前端、外部接口画成一个简单的功能框图。这个框图就是根图的雏形。接下来给每个功能模块列出需要进出的信号。比如“电源模块”要有输入VIN、输出5V、3V3还有使能EN_PWR“MCU 模块”要有SWD_CLK、SWD_DIO、UART_TX、UART_RX、若干 GPIO。这个端口清单非常重要因为它直接决定了后面子图上的 Hierarchical Port 有哪些。我建议端口命名用统一的规范。信号名字不要用无意义缩写不要混大小写乱写。OrCAD 对网络名区分大小写是有自己规则的但团队规范最好统一成大写加下划线比如UART1_TX、ADC_IN_0这样搜索、排查、生成网表都会少很多麻烦。3.2 第二步新建子图并放置层次块打开 OrCAD Capture先在工程管理器的原理图文件夹里新建若干原理图页面名称和模块名对应比如POWER、MCU、DRIVER。这些页面就是将来的子图。然后回到根层页面从菜单选择Place Hierarchical Block。弹出来的对话框里有一项Implementation Type选择Schematic ViewImplementation Name选择刚才建好的POWER页面。再填写层次块的Reference比如U2或者是自定义的PWR。放置层次块后它会以矩形框的形式出现在根图上。这时候框上还没有引脚。引脚从哪里来从子图的层次端口来。换句话说你得先打开POWER子图在里面放置 Hierarchical Port 并命名再回到根图框上才会出现对应的引脚。这里有一个不少人第一次会犯的错先在根图放了一堆层次块又急着在根图上给层次块Place Hierarchical Pin以为引脚是手动加的。其实在 OrCAD 的常用模式里层次块上的引脚大多数是从子图端口反射回来的。手动添加引脚也可以但两边同步起来非常容易乱。我强烈建议把端口全部定义在子图里根图只负责摆放层次块和连线。3.3 第三步在子图里连接端口和电路双击根图上的层次块OrCAD 就会自动进入对应的子图页面。你在子图里放置元件、画电路然后从菜单Place Hierarchical Port放置层次端口给端口命名并选择方向。举个例子POWER子图里有一条 12V 输入走线那么就在输入端放置一个叫VIN的 Hierarchical Port方向选INPUT。输出端有一路 5V就放置VCC5V方向选OUTPUT。放完端口后用连线把它们接到具体的元件引脚上。回到根图选中POWER层次块右键选择Descend Hierarchy或直接双击再返回看看你会发现在子图里定义的端口已经出现在层次块边缘了。这时候你就可以在根图上用 Wire 把这些层次块的引脚连接起来。多个层次块之间如果有共同信号比如同一个GND只需要在根图上连到一个公共节点或者在子图内部直接接地符号即可。这里有一个非常常见的认知偏差层次化设计里子图之间的信号连接是靠“同名端口”自动匹配还是靠根图的“连线”连接严格说OrCAD 的层次连接规则是子图端口决定了层次块引脚根图的连线把这些引脚连起来。没有根图连线两个子图即使有同名端口也不会自动接通。这一点和平坦式设计里靠全局网络名连接完全不同。很多人吃了这个亏以为两个模块都叫I2C_SCL电路就通了结果网表导出去一看两个网络根本就是独立的。3.4 第四步位号标注和 DRC 检查层次化设计画完之后不要急着生成网表。第一件事是重新标注位号。菜单Tools Annotate选择你要处理的原理图范围一般选整个设计。如果使用了重复实例要特别注意 Instance 和 Occurrence 的区别。简单说Instance 是你实际放置的元件实体Occurrence 是原理图逻辑上出现的实例。多通道设计里位号经常会显示成U1_A、U1_B这种带后缀的形式这是正常的。位号处理好之后运行 DRC。菜单Design Rules Check会检查电气规则包括单端网络、输出短路、未连接引脚、层次端口方向不匹配等。DRC 报告里如果有Port type mismatch或者Duplicate net name十有八九是层次端口方向不对、或者同名端口在不同子图里方向不一致。先把这些错误清干净再往后走否则网表和 PCB 导入阶段会连环爆炸。4. 实操中的经验与坑4.1 位号重编号和重复模块别再被 U1、R1 搞晕层次化设计最让新手崩溃的不是画图而是位号。尤其是多通道相同电路复制出来的几个实例共用同一个子图电路里同样是R1到了 PCB 却必须区分成R1_A、R1_B、R1_C。如果你不处理位号导出网表时 OrCAD 会直接告诉你位号重复或者导出的网表里只有一套位号PCB 上根本分不清是哪个通道的电阻。我常用的办法是在根图里放置多个层次块引用同一个子图后马上跑一次Tools Annotate在对话框里勾选 “Reset part references to ?” 和 “Incremental reference update”。然后在多通道实例页面里选择对应的属性让每个实例的位号能带后缀区分。具体菜单在不同版本里有点出入但思路就是先清空原编号再按 Instance 重新编号确保每个 Occurrence 有唯一位号。这里还要提醒一句不要在子图里手动把位号改成R_A1、R_A2。手动改位号在单通道设计里没问题但在多实例复用时很容易把整体编号逻辑搞乱。最好是先让 OrCAD 自动标好第一遍再对个别的位号做微调。4.2 层次块与平坦式混合使用的边界层次化设计和平坦式设计不是非此即彼。一个工程完全可以根层用层次块局部页面内部用 off-page connector 做小范围拼接。甚至可以在同一张子图里既放层次块又放一些不属于任何模块的散件。这种混合用得好的话很灵活但用不好的话图面会显得很不伦不类。我的建议是一个子图里尽量不要同时存在“层级嵌套”和“一大堆散落的元件”。比如DRIVER子图本来是一个电机驱动模块结果你还往里面塞了一堆电阻电容和接口这个子图很快就变成一个“小摊子”。更好的做法是子图内部保持高内聚如果需要再往下拆分可以在这个子图里继续创建更底层的层次块形成两级、三级层次。OrCAD 是支持多级层次嵌套的但层级太深也不是好事。我见过有人把原理图拆了五层最后连他自己都忘了第几层放的是什么。一般来说两到三级就够了根层放功能模块第二层放具体功能电路第三层只在类似 FPGA 这种复杂器件时使用。层次太深每次改信号都要一层一层点进去维护成本非常高。4.3 导出 PDF、交叉引用和报告的几个细节层次化设计完成后最常见的一件事就是导出 PDF 给同事或者客户评审。很多人会碰到一个问题导出的 PDF 里搜索位号比如搜R12结果搜不到。这个不一定是 OrCAD 的锅很可能是导出设置里选了光栅化字体或者使用了非 TrueType 字体。导出 PDF 时在打印设置里选择 PDF 驱动并把文本输出模式设置为嵌入式文本搜索功能基本就能正常。另外一个频繁被问到的是Intersheet References报错。层次化设计里如果你想要在层次块引脚旁边显示“该信号还连到哪个页面”可以用 Intersheet References 功能。但做了多级层次嵌套之后这个功能有时候会报错错误信息大致是找不到对应页面或者端口类型不匹配。我遇到这种问题基本都是因为子图里的端口方向复制后没刷新导致根层次块上的引脚信息和子图实际端口不一致。解决方法是选中层次块右键执行Synchronize Down或者重新生成端口然后再跑交叉引用。生成 BOM 的时候也要注意。层次化设计下如果多个实例公用一个子图BOM 里会出现同一个元件被统计多次的情况。这其实是正确的因为事实上确实用了多个电阻。但要确保 BOM 里的位号列把后缀都显示出来否则采购按 BOM 下单数量对了位号却对不上板子贴片时就会乱套。4.4 团队协作时的文件组织建议层次化设计非常适合多人协作但前提是文件组织要清晰。OrCAD 的工程文件可以用本地集中方式也可以用版本管理工具共享。无论哪种方式我建议子图文件按照模块命名并且和原理图页面名称保持一致。比如模块叫POWER工程里对应的.dsn原理图也就尽量只体现这个模块。在实际项目里我更推荐“底板根图 独立功能模块图”的方式。每个人负责一个功能模块子图通过版本管理工具并行修改根图和各自的子图。合并时由于不同人操作的是不同页面和不同层次块冲突概率会小很多。当然根图还是尽量固定一个人维护否则多人同时改根图的连线合并时很容易出问题。如果你用 Git 或者 SVN 管理 OrCAD 工程记得把.dsn、.opj这类文件的锁定机制搞清楚。OrCAD 在打开文件时会生成一些临时文件如果多个人同时打开同一个工程很容易出现只读锁定。5. 常见问题速查与排查实录5.1 层次端口连不上检查这三处问题现象层次块上引脚没有按预期出现或者已经出现了但根图连线总是连不上。第一个要查的是子图里端口的方向。如果你在子图里放了一个INPUT的CLK但根图里希望从该模块输出时钟出去方向就反了。OrCAD 会根据方向决定引脚的方向方向不一致时连线上会出现奇怪的连接提示。第二个要查的是端口名称是否完全一致。这里的完全一致包括大小写、空格、下划线。比如子图里叫UART_TX根图里另一个子图也叫UART_TX如果拼接时少打一个下划线就成了两个网络DRC 一般会报单端网络。第三个要查的是根图上是不是真的用 Wire 去连接了层次块的引脚。很多人习惯用网络标号Net Alias放在层次块引脚旁边以为这样就能连起来。在层次块引脚上尤其是需要跨模块传递信号时最好还是用实际的连线把两个引脚连起来或者通过一个明确的中间网络节点不要依赖同名网络自动连接。5.2 层次化设计 DRC 报错的常见配置DRC 报错集中在几个方面。一个是Duplicate net name原因多半是同一个子图里放了两张相同的原理图页面或者同一个Hierarchical Port名称出现在多个本该独立的网络里。另一个是Unconnected hierarchical pin说明根图层次块引脚上没接任何东西如果这个信号本身要求悬空可以在子图里放置无连接标记No Connect这样 DRC 能识别到。还有一个报错很典型就是Multiple drivers on net。在层次化设计里这个多半是端口方向误设为OUTPUT导致。比如某个信号实际上只是内部测试点输出你不小心把它设成了双向端口DRC 就会认为有两个驱动源。所以端口方向设置一定不能嫌麻烦宁可多花两分钟检查也不要等 DRC 报一堆错再回头改。5.3 一份实用的层次化设计问题速查表典型症状可能原因处理方法层次块引脚不出现子图里没有放置层次端口或端口没有保存到子图放置 Hierarchical Port保存后回到根图刷新层次块引脚方向不对子图端口方向设错双击子图端口修改方向并保存重新同步层次块导出网表提示位号重复多实例共用一个子图未重新标注位号运行 Annotate选择 Instance 模式重新编号DRC 报单端网络根图里层次块引脚没有连到任何网络补 Wire或确认该信号是否必须悬空Intersheet References 报错层次块端口信息和子图实际端口不同步层次块右键同步端口再重新添加交叉引用PDF 中搜索不到位号字体被光栅化或导出设置把文本转成了曲线导出设置里使用 TrueType 字体并嵌入文本信息模块复制后修改不同步复制出来的层次块指向了不同子图检查层次块属性里的 Implementation Name 是否指向同一子图5.4 一个亲历的排查故事有一回我做一个 16 路模拟采集板根图上有 4 个层次块分别对应 4 个采集通道子图。画完之后DRC 一直报其中一个通道有单端网络。我检查了半天发现是复制层次块的时候不小心把目标子图指错了导致两个层次块实际上指向了同一个子图另外一个子图根本没被引用。根图上有 4 个块但工程里只有 3 个子图被真正加载剩下的那个块连的引脚全都是空的。这个问题在纯平铺设计里几乎不会出现因为每页原理图都是独立的。但层次化设计里层次块的Implementation Name一旦填错或者复制后忘了修改就会出现这种“看着有模块实际是空壳”的怪异现象。从那以后我每次复制层次块后都会挨个检查属性里的 Implementation Name确保每个块指向正确的子图。这件事也让我养成了一个习惯在任何层次化工程导出网表之前一定要生成一份生态层级报告看看原理图页面的引用关系。OrCAD 的工程管理窗口里把设计节点展开能看到所有原理图页面。这个树状结构其实就代表了你的层次关系如果树的结构和你预想的不一样趁早改别等网表和 PCB 都生成完了再返工。层次化设计这种功能用熟了以后确实回不去平铺式了但也只有细心维护它才能真正帮你省时间而不是变成排查问题的负担。
返回列表