☰
AD层次化原理图设计:从拆分到复用,复杂项目不再乱
2026/9/29 7:31:14 网站建设 项目流程

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 自顶向下:先定骨架,再填血肉

自顶向下的思路是从系统框图出发,先搭好整个架构的骨架,再逐层完善细节。

具体操作步骤是:

  1. 新建一个原理图文件作为顶层图纸,比如命名为Top.SchDoc。
  2. 在顶层图纸上用Design -> Add Sheet Symbol放置若干个图纸符号,数量和你预期的功能模块一致。
  3. 为每个图纸符号设置好Designator(比如 PSU、MCU、AFE)和Filename(比如Power.SchDoc、MCU.SchDoc、AFE.SchDoc)。
  4. 在图纸符号上放置图纸入口,命名好模块间的连接信号。
  5. 在图纸符号之间连线,把整个系统的信号流向在顶层确定下来。
  6. 逐个选中图纸符号,执行Design -> Create Sheet From Sheet Symbol,AD 会自动生成一张对应 Filename 的子原理图,并且自动在子图纸上放置好与图纸入口同名的端口。

这一步非常顺手——子图纸里端口已经放好,你只需要在子图纸内放置元器件、连内部网络,端口就自动对上了。这种方式很符合"先系统后细节"的设计思路,适合你在项目规划阶段已经把模块划分和模块间接口想清楚的情况。

3.2 自底向上:先把子模块画好,再组装成系统

自底向上的思路正好反过来:先分别画好每一张子原理图,再用一个命令把它们统一生成到顶层。

操作路径是:

  1. 在工程中分别创建并绘制好各子原理图,比如Power.SchDoc、MCU.SchDoc、AFE.SchDoc,在每张图纸内部把电路画完整,并在需要对外连接的信号上放好端口。
  2. 新建一个顶层原理图Top.SchDoc,把它设为工程的顶层图纸(建议在工程面板中检查文件结构)。
  3. 在顶层图纸上执行Design -> Create Sheet Symbol From Sheet(或通过菜单Design -> Create Sheet Symbol From Sheet or HDL),在弹出的对话框里勾选要生成图纸符号的子图纸文件。
  4. 点 OK,AD 会自动在顶层图纸上生成对应的图纸符号,并自动添加好与子图纸端口同名的图纸入口。

这种方式适合你已经把各功能模块电路定义得很清楚、甚至已经可以参考已有模块图纸的情况,减少顶层设计阶段对系统细节的干预。实际项目里,我经常先自顶向下画一个粗略的顶层框架,然后在细化子图过程中发现接口设计不合理,再回顶层调整图纸入口和连线——两种方式配合使用,比死守某一条路线顺畅得多。

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.SchDoc,Designator 设置为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 的官方文档里其实对层次化设计着墨不少,但文档读起来总归是枯燥的。真正上手时,我建议你找一个已经完成的小项目,比如一个带电源、单片机、接口电路的三模块板卡,把它拆成三张子图纸重新画一遍——这个过程比看十篇教程都管用。拆的时候你会遇到端口对不上、网络不连通、位号混乱等各种问题,全部自己排查一遍之后,层次化设计的基本功就算彻底过关了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询