ARTICLE DETAIL

资讯详情

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

AD层次化原理图设计:从拆分到复用,复杂项目不再乱

AD层次化原理图设计:从拆分到复用,复杂项目不再乱 1. 为什么要用层次化设计——单页图纸在复杂项目里的天花板先聊一个我经常在项目评审里看到的场景一块主控板单片机、电源、通信接口、传感器调理、电机驱动全塞在一张原理图里图纸密密麻麻网络标号几百个工程师自己画了三个月评审时别人根本没法看过两周自己也要翻半天才能找到某个信号从哪来。这不是能力问题是单页原理图在复杂系统面前的天然瓶颈。当原理图中的器件超过一两百个、网络数超过三五百条平铺一页的阅读效率会急剧下降。你要找一条信号的来龙去脉得在满屏的走线和标号里反复扫视你要检查某一部分电路是否完整得把视线从图纸左上角拖到右下角你要复用一组设计只能整块复制然后手动改网络名改漏一个就是隐形的连接错误。AD的层次化原理图设计就是针对这个问题给出的标准解法。它的核心思想很简单把一个大的电路系统按功能拆成若干个子模块每个子模块画在独立的子图纸上然后通过一张顶层图纸把这些子模块像积木一样拼装起来模块之间的连接关系由端口和网络标签来定义。拆开之后的好处是立竿见影的。第一阅读顺序变成从宏观到微观先看顶层图就知道整个系统的功能划分和模块间互联关系想深入哪块就进哪张子图定位效率高得多第二每个子图纸的规模被控制在合理范围画图、检查、评审都轻松第三模块化天然带来了复用能力和团队并行协作的可能性——这在后面的章节里我会专门展开讲。所以如果你正在或将要处理的功能模块超过三个、器件总量超过一百个的项目层次化设计不是可选优化项而是应该尽早养成的设计习惯。这篇内容我就结合自己在AD里的实际使用经验把层次化原理图设计的原理、流程、常见坑和进阶玩法一次讲透给准备上手的人一条能顺畅走通的路径。2. 图纸符号、端口与网络标签层次化设计的三块基石在往工程里添加任何东西之前我建议先花十分钟搞清楚层次化设计里三个核心概念之间的逻辑关系。搞懂这个后面所有的操作都是顺理成章搞不懂就会经常出现端口加了但连不上网络标号明明一样却不导通这类莫名其妙的问题。2.1 图纸符号子模块在顶层图上的名片图纸符号Sheet Symbol是层次化设计里最直观的元素。在顶层原理图上它表现为一个矩形框框内有子图纸的文件名和一个唯一的标识符Designator。它代表的是某一张子原理图在这里的抽象存在。放置图纸符号的操作很简单在顶层图纸上执行菜单命令Design - Add Sheet Symbol然后在图纸上点击放置。放置后双击它在属性面板里设置两个关键参数Filename对应的子原理图文件名和Designator当前模块的实例名称比如PSU、MCU、AFE。这里有个容易忽略的点Filename必须和实际子图纸文件名完全一致不区分大小写但建议保持统一AD靠这个字段把图纸符号和子图纸关联起来。如果你改了子图纸的文件名忘了更新图纸符号里的 Filename编译时会直接报错。2.2 端口子图纸与外部世界的连接点端口Port是子图纸上与外部电路进行信号交换的接口。它在子图纸内部用Place - Port放置放置后在属性面板里设置方向Input、Output、Bidirectional 等和名称Name。在层次化设计中一定要记牢一条规则子图纸上的端口必须在顶层图纸对应图纸符号上有一个同名的图纸入口Sheet Entry与之匹配信号才能通过。图纸入口是在图纸符号上添加的小引脚标记放置方式是先在顶层选中图纸符号然后执行Design - Add Sheet Entry在符号边缘点击放置再设置与子图纸端口相同的名称和方向。也就是说端口和图纸入口就像电路板上的插座和插头名称一致才能配对方向匹配才能保证信号的流向合理。AD 的编译系统会自动检查这两者的对应关系名称不一致或者方向冲突都会报错。2.3 网络标签子图内部的隐形走线网络标签Net Label的作用是在同一张原理图内建立连接不需要真正画一条线。在层次化设计里它的作用要格外清晰网络标签的连通范围是所在的那一张子图纸两个网络标签即使名称完全相同只要它们在不同的子图纸上彼此之间就是绝缘的。这一点是很多初入层次化设计的人最容易踩的坑。你会习惯性地觉得既然都叫 SDA那不就该连在一起吗——不是的。子图纸之间要通信必须通过端口上行到顶层图纸符号再从顶层图纸入口走线到另一个图纸符号的入口然后下行到另一张子图里的端口。信号路径是子图A的端口 → 顶层图A符号的入口 → 顶层连线 → 顶层图B符号的入口 → 子图B的端口。我打一个比方每一张子图纸就是一间独立的房间网络标签是房间内部各设备之间的有线电话线只能在房间内通话端口是房间的门两个房间的人要交流必须各自开门走到走廊里顶层图纸才能碰面。走廊里顶层图纸的普通连线就是两个门之间的通道。这三个概念之间的关系梳理清楚了层次化设计的骨架就立起来了。3. 两种创建路线自顶向下与自底向上怎么选AD 支持两种层次化设计流程自顶向下Top-Down和自底向上Bottom-Up。这两种方式不是互斥的实际项目里经常混着用但新手最好先把两种方式的完整路径都走一遍才能根据场景灵活选择。3.1 自顶向下先定骨架再填血肉自顶向下的思路是从系统框图出发先搭好整个架构的骨架再逐层完善细节。具体操作步骤是新建一个原理图文件作为顶层图纸比如命名为Top.SchDoc。在顶层图纸上用Design - Add Sheet Symbol放置若干个图纸符号数量和你预期的功能模块一致。为每个图纸符号设置好Designator比如 PSU、MCU、AFE和Filename比如Power.SchDoc、MCU.SchDoc、AFE.SchDoc。在图纸符号上放置图纸入口命名好模块间的连接信号。在图纸符号之间连线把整个系统的信号流向在顶层确定下来。逐个选中图纸符号执行Design - Create Sheet From Sheet SymbolAD 会自动生成一张对应 Filename 的子原理图并且自动在子图纸上放置好与图纸入口同名的端口。这一步非常顺手——子图纸里端口已经放好你只需要在子图纸内放置元器件、连内部网络端口就自动对上了。这种方式很符合先系统后细节的设计思路适合你在项目规划阶段已经把模块划分和模块间接口想清楚的情况。3.2 自底向上先把子模块画好再组装成系统自底向上的思路正好反过来先分别画好每一张子原理图再用一个命令把它们统一生成到顶层。操作路径是在工程中分别创建并绘制好各子原理图比如Power.SchDoc、MCU.SchDoc、AFE.SchDoc在每张图纸内部把电路画完整并在需要对外连接的信号上放好端口。新建一个顶层原理图Top.SchDoc把它设为工程的顶层图纸建议在工程面板中检查文件结构。在顶层图纸上执行Design - Create Sheet Symbol From Sheet或通过菜单Design - Create Sheet Symbol From Sheet or HDL在弹出的对话框里勾选要生成图纸符号的子图纸文件。点 OKAD 会自动在顶层图纸上生成对应的图纸符号并自动添加好与子图纸端口同名的图纸入口。这种方式适合你已经把各功能模块电路定义得很清楚、甚至已经可以参考已有模块图纸的情况减少顶层设计阶段对系统细节的干预。实际项目里我经常先自顶向下画一个粗略的顶层框架然后在细化子图过程中发现接口设计不合理再回顶层调整图纸入口和连线——两种方式配合使用比死守某一条路线顺畅得多。3.3 两种方式的选择建议从我的经验看两种流程的选择其实取决于你对系统的掌握程度如果项目前期还在方案论证阶段模块划分经常调整建议用自顶向下因为顶层结构调整的成本很低删一个图纸符号就是删一个框而自底向上则会出现顶层符号要重新生成的连带操作。如果模块边界已经非常明确甚至某些子模块在历史项目里已有成熟图纸建议用自底向上直接从已有图纸生成符号组装效率最高。绝大多数中等复杂度的项目我建议从自顶向下起步搭出顶层框架后再用子图细化这样从一开始就能看到完整的系统结构心里有底。4. 重复层次设计Repeat多路相同电路的省力解如果只是单纯把大图纸拆成小图纸层次化设计已经解决了一大半问题。但是真正的杀手锏是它的**重复层次Repeat**功能。这项功能在 ADC 多路采集、多路电机驱动、多路电源输出、LED 阵列驱动等高度重复的电路结构里能把设计效率提升一个量级。4.1 为什么不能靠复制粘贴很多人在处理 8 路相同采集电路时第一反应是把单路图纸复制八份然后每份改元件位号。这样做有两个痛点第一如果电路有修改你要改八张图纸漏掉任何一张就产生不一致第二八张图纸在工程里铺开文件数量爆炸维护成本非常高。重复层次设计的思路完全不同同一张子图纸可以被顶层图纸符号引用多次原理图只需要维护一份电路结构AD 在编译时自动为每次引用生成独立的网络和元件实例。拓扑上每一路都是同一张图纸但电气上每一路都是完全隔离的独立电路。4.2 Repeat 的具体操作方法要实现重复层次子图纸侧不需要做任何特殊处理——它就是一份普通的带端口子图纸。关键在顶层图纸符号的配置上。假设我设计的是 8 路 ADC 采集板子图纸命名为ADC_Channel.SchDoc图纸里有三组端口CH_IN模拟输入、CH_OUT数字输出、CH_AGND模拟地。在顶层图纸上放置一个图纸符号Filename 指向ADC_Channel.SchDocDesignator 设置为ADC_Ch0然后在两个图纸入口的属性里做如下设置将其中一个入口比如CH_OUT的 Name 改为CH_OUT[0..7]方向设为 Output。将另一个入口CH_IN的 Name 改为CH_IN[0..7]方向设为 Input。在图纸符号属性里将 Designator 改为ADC_Ch[0..7]或者对某个特定入口使用Repeat(ADC_Ch, 0, 7)这样的 Repeat 语法。更通用的写法是在图纸符号属性中或者图纸入口名称中使用Repeat(信号名, 起始索引, 结束索引)语法。比如Repeat(CH_OUT, 0, 7)就表示生成 CH_OUT0 到 CH_OUT7 八条信号。图纸符号的 Designator 也可以写成Repeat(ADC_Ch, 0, 7)AD 会为每一路自动编号ADC_Ch0、ADC_Ch1……ADC_Ch7。编译后AD 会在顶层自动把 8 条总线信号分别接入对应的实例中。你在 PCB 布局时可以给这 8 路分别生成一个独立的 Room在 PCB 中执行Design - Rooms - Place Room From Sheet Symbol然后就能对其中一路调好布局布线再通过Design - Rooms - Copy Room Formats快速复制到其他 7 路。4.3 重复层次的实际价值这里有一个很实在的收益你只需要维护ADC_Channel.SchDoc这一份电路。哪天要把采样电阻阻值调整一下打开这一张子图改掉全部 8 路同步生效。对照复制粘贴方案这是一个质的飞跃。另外推荐一个实用编排把重复的信号用总线来连接比如CH_IN[0..7]在顶层图纸上走一条总线再分别接入每个图纸符号的入口。这样看起来非常清爽同样是一张顶层图信号数量再多也不会乱。5. 编译、编号与 PCB 同步最容易出问题的三个环节层次化设计里原理图不只是一个图画问题它还牵扯到编译、元件编号、与 PCB 的同步。这三个环节如果不提前设计好后面返工的量可能会超出你的想象。5.1 工程编译与 ERC 检查写完了图纸第一步永远是编译。AD 的编译命令在Project - Compile PCB Project快捷键是C C或者按照你的自定义快捷键设置。编译后AD 会在Messages面板里报出错误和警告。在层次化设计里最常遇到的报错有几类Duplicate Net Name网络重名。这种情况通常发生在不同子图里使用了相同名称的网络标签但两者并没有通过端口和顶层串联起来。AD 会认为这是两个独立网络如果它们实际上该是同一个网络就要查漏端口如果本来就该独立重复命名会造成编译困扰。Unconnected Port端口在顶层图纸符号上没有对应的图纸入口或者反过来有入口无端口。这是层次化设计中最常见的低级错误通常是因为在子图纸上增加了新端口却忘了在顶层补上入口。Net with no driving source / no load信号源端或负载端缺失。在层次化图纸中尤其容易发生在模块接口上某个网络在顶层接了 A 模块的入口但 B 模块那边漏拉了线。有个技巧在编译选项Project - Project Options - Options里把Net Identifier Scope设置为Hierarchical。这个选项决定了网络标签和端口的解析方式在层次化设计下选择 Hierarchical 能最大程度避免同名网络在子图之间意外连通的隐患。5.2 元件编号的策略按房间编号层次化设计下元件编号的策略也值得提前规划。AD 支持两种编号方式全局连续编号和按图纸符号编号在原理图编辑器中执行Tools - Annotation - Annotate Schematics Quietly然后在Process下拉框里选择40 Reset ... Order by Position in Sheet或者1 All ...再勾选Reorder相关选项。这里我更推荐的是按图纸符号编号方案核心操作是在Annotate对话框的注解范围选项里选择All或者Room并在编号规则中让位号带上模块前缀。比如 AD 支持在元件的Designator中使用通配符像把 MCU 模块里的电阻位号自动编成R_MCU1、R_MCU2电源模块里的电容编成C_PSU1、C_PSU2。不要小看这个细节。在 PCB 布局时你打开 PCB 面板看到位号R_AFE1就知道这是模拟前端模块的电阻C_DIG1知道是数字部分的电容。尤其是多人协作或者后期调试定位时这个前缀能帮你省下大量时间。这个习惯我用了很多年强烈建议从第一个层次化项目开始就养成。5.3 原理图与 PCB 的同步原理图编译无误后在 PCB 工程里执行Design - Update PCB Document快捷键D U就能将原理图变更推送到 PCB。层次化设计在 PCB 同步时有个独有优势可以按图纸符号自动生成 Room 布局区域。在 PCB 中执行Design - Rooms - Place Room From Sheet Symbol选择顶层图纸的某个图纸符号AD 会自动在 PCB 上生成一个对应 Room并把这个模块下的所有元件都归入其中。配合Tools - Component Placement - Arrange Within Room等功能你可以快速把不同功能模块的元件圈定到各自布局区域。使用 Room 之后PCB 上移动某一个 Room里面的所有元件会跟着整体移动这对模块化布局来说非常顺手。而且 Room 的尺寸、位置都可以调整板框确定之后沿着板内功能区划分把各 Room 摆好再做细部布局效率会高很多。同步过程中常见的坑是重复层次模块的 Room 是共享一个还是各自独立。AD 对 Repeat 模块会为每次实例生成独立的 Room比如ADC_Ch0、ADC_Ch1……这样每一路的元件在 PCB 上是物理分区的布局复制时非常方便。如果你发现多个实例的元件混在一起多半是 Room 属性里的Room Definition锁定方式没有按实例划分这时需要回到 PCB 的 Room 属性里检查。6. 层次化设计里的隐形坑以及我的排查思路最后这部分我想分享几个我实际项目里反复踩过、也帮别人排查过的层次化设计问题。这些问题不会让你编译报错但会在PCB阶段甚至调试阶段以更隐蔽的方式冒出来。6.1 设计变更时容易遗漏的连带修改层次化设计最大的风险在于牵一发而动全身。比如你在子图纸上把一个端口名称从SDA改成了I2C_SDA如果你只改了子图纸里的端口名称而忘了同步修改顶层图纸符号里的对应入口编译时 AD 会告诉你端口未连接。这种错误在编译阶段还能拦下来。更隐蔽的情况是你只修改了信号的命名没有改端口方向但顶层某些连线因为入口名称变化而意外断开。AD 在编译时可能只报Port X has no matching sheet entry或者干脆只出 warning如果你的编译输出没仔细看很容易放过。我建议在每次修改接口后养成一个习惯先重新编译仔细看 Messages 里的每一项不要放过任何 warning尤其是与端口、入口相关的。原理图的 ERC 规则里把Unconnected items的报错级别从 Warning 改成 Error能在早期堵住很多隐患。6.2 多人协作时的文件冲突层次化设计让多人并行协作成为可能——每人负责各自的子图纸文件互不干扰。但这只在文件系统层面成立如果你们用的是 SVN 或 Git 做版本管理顶层图纸文件是所有人共同的修改点频繁更新顶层图纸必然产生冲突。我的实践是在团队里约定顶层图纸由一个人统一维护其他人通过评审等方式提出修改需求不要多人同时在线编辑 Top.SchDoc。子图纸文件可以放心并行修改但任何涉及接口变化的改动都要在更新顶层之前先在团队里沟通确认。这个顶层单点更新的约定看起来简单实际执行起来能省掉大量合并冲突的修复时间。6.3 元件位号和容差重复导致的 PCB 同步异常另一个我踩过的坑是重复层次模块在原理图上虽然被编译成多个实例但如果你的子图纸里元件的位号没有使用限定符或者说没有按实例编号PCB 同步时有可能出现元件重叠、位号冲突这类异常。解决办法是在子图纸里不使用固定位号而是使用Tools - Annotation - Annotate Schematics时选择按层次路径编号的方式保证每个重复实例里的元件都能获得唯一的位号。AD 的具体处理机制是当你在子图里放置元件时位号可能默认是R1但通过编译和按实例编号配置重复生成后会自动变成R1_ADC_Ch0、R1_ADC_Ch1这样的区别形式。如果这一步自动编号没有正确触发就会在 PCB 导入时报重复位号错误。遇到这种情况我的排查顺序是先检查子图纸里的元件的Unique Id是否有重复在原理图上右键元件属性里查看再检查工程的注解配置。多数情况下重新执行一次完整注解并且勾选上Remove duplicate designators在Annotate对话框的Recommendations里问题就能解决。6.4 层次深度过大的可读性问题层次化设计虽好但我不建议无限嵌套。有些项目喜欢在顶层下面再分中层、底层动辄三层四层看起来很有结构感但实际阅读时每一层都要切换上下文查找一个信号要经过多张图纸思维负担反而变大。我的经验是一般项目控制在两层到三层之间最舒服。两层顶层 子图适合大多数中等复杂度的板卡三层顶层 功能板级模块 子模块适合大型系统。如果超过三层我会优先考虑是不是模块划分太碎了能不能合并一些相关功能到同一张子图里。这个判断标准也很朴素你在看一张子图时是否能在一屏之内理解它的完整功能如果需要上下滚好几屏还理不清说明这一层的抽象粒度有问题。最后分享一点我的实际体会做了这么多年 PCB 设计我越来越觉得层次化原理图设计真正改变的不是画图的方式而是思考系统的方式。当你习惯了先画顶层框图再去填充细节你会不自觉地开始对每个模块的接口做严格的规划——信号怎么进出、方向怎么约定、命名怎么统一这在项目早期就能暴露很多设计缺陷比后期在 PCB 上发现网表对不上要省太多事。AMD 的官方文档里其实对层次化设计着墨不少但文档读起来总归是枯燥的。真正上手时我建议你找一个已经完成的小项目比如一个带电源、单片机、接口电路的三模块板卡把它拆成三张子图纸重新画一遍——这个过程比看十篇教程都管用。拆的时候你会遇到端口对不上、网络不连通、位号混乱等各种问题全部自己排查一遍之后层次化设计的基本功就算彻底过关了。
返回列表