☰
Cadence CIS模块复用:把电路块变成标准化器件,附配置与避坑
2026/10/22 7:48:51 网站建设 项目流程

简介:《Cadence基于CIS的模块复用》是一份面向印制电路板设计工程师的实用技术文档,讲解如何在专业设计软件中通过复用模块来降低重复劳动、提高设计一致性和团队协作效率。文档先介绍复用模块的设计流程,包括原理图绘制、封装与属性设置、自动标注、规则检查、网表导出、印刷电路板布局、模块文件创建与命名规则,以及反标处理;随后说明在新工程项目中调用模块的具体方法,包括层次化模块的放置、参数填写和后续标注设置,并提示了常见易错点。资源内含1个文件,格式为文档(doc),压缩包大小1.32MB,内容精简且步骤完整。读者可依据文中步骤,完成从原理图设计到印刷电路板布局再到模块调用的闭环操作,有效提升复杂项目的设计效率。文档对模块命名、反标属性等细节的强调,也有助于避开实操中的常见问题。目前已有225人浏览学习,是开展模块化设计时一份实用的操作指引。

1. Cadence基于CIS的模块复用:把“电路块”也当成一颗标准化器件

在设计团队里待过一阵子的人都会有同感:最让人烦的不是复杂的新电路,而是那些看起来很简单、却每个项目都要重画一遍的电路块。电源保护、MCU最小系统、RS485接口,谁都能画,但画出来的风格、网络命名、封装归属往往各不相同,评审时反复抓错,改版时又互相找不到参照。Cadence基于CIS的模块复用,本质上是把这种“多器件、多网表、多属性”的组合体当成一颗可被数据库管理的器件来看待:模块有编号、有版本、有符号、有子图、有BOM库存,在原理图里按“Place Database Part”的方式放进去,后续由配置和脚本把坑挡在外面。这篇文章写给要建立统一硬件库、希望减少重复劳动、又担心模块化之后失控的工程师。

2. CIS模块复用的底层逻辑:数据表、符号和子图的关系

CIS全称是Component Information System,很多人只把它当成“查元件、放元件”的工具,觉得它和普通元件库的差别就是多了一个数据库前缀。真正开始做模块复用之后,我的看法变了:CIS是元器件属性、原理图符号、模块子图以及BOM信息的捆绑器。它把一堆本来分散在文件夹里的东西,全部收进一条数据库记录,再让Cadence Capture CIS按这条记录找到并放置。能不能复用、复用得规不规范,关键在于你怎么设计这条记录,而不是你会不会点鼠标。

2.1 模块不是“复制粘贴”,而是三层数据对象

如果一个模块还是靠“复制上一版图纸再改”,那它只是复制粘贴,算不得模块复用。以我实践下来的理解,一个真正能通过CIS复用的模块,至少要拆成三层来看。

第一层是数据库记录,字段包含PART_NUMBER、MODULE_REV、VALUE、FOOTPRINT、DATASHEET_LINK等。这一层负责回答“这个模块是什么、哪个版本、用哪个封装、看哪个手册”。第二层是Capture库里的原理图符号,负责画引脚、画边框、让设计师能在图纸上看到并连接它。第三层是模块子图,可能是一个独立的原理图文件,也可能是一个层次式原理图单元,负责把电容、电阻、连接器、保护器件真正放进去并连好网。

放置时,CIS把数据库记录和模块子图的引用信息绑定到符号实例上。注意,绑定之后CIS不会实时同步,你改了数据库,原理图里的旧实例不会自动改。这一点很多人到最后才明白,CIS只管“装载”和“选择”,不管“同步”。

这样的三层结构,最大的收益在版本管理。同一个符号可以对应两条记录,比如PWR-5V-A01和PWR-5V-A02,符号外观一致,但子图里的滤波参数、物料清单可能完全不同。新项目要选新版本,只需要搜索PART_NUMBER,而不是去旧图纸里逐页找。

2.2 选择数据源:Access、Excel还是SQL Server

CIS通过ODBC读取数据库,所以理论上只要提供ODBC驱动的数据源都能用。实际项目中见得最多的是三种:Access、Excel、SQL Server。选型不是越高级越好,而是看团队规模和写库方式。

数据源适合场景主要优点主要注意点
Access (.mdb/.accdb)十人以内、单机或内部共享配置简单,驱动通用,字段类型可控多人同时写库容易锁文件
Excel (.xlsx)小批量验证、临时试运行编辑直观,非技术人员也能维护长文本、日期类型容易漂移,并发差
SQL Server十人以上、多人并发稳定,可做权限和备份需运维配合,ODBC连接配置多一层

我一般建议中小团队用Access起步。原因很实在:Capture CIS的数据库功能本来就是从Access时代开始普及的,微软的Access ODBC驱动稳定性最好,而且用Access可以建关联表,例如把模块表和BOM明细表拆开,CIS只查主表,BOM导出时再关联子表。Excel适合临时验证,但不适合作为正式模块库,因为技术人员很难控制“ID”列不被改成文本格式。

等团队规模超过十个人,再迁到SQL Server。迁移时Capture CIS端不需要大改,ODBC数据源名称保持CIS_DB不变,表结构也尽量保持一致,只需要重新映射一次字段。切忌一开始就上SQL Server但没人会备份,那样反而比Access更容易丢数据。共享数据库放在服务器上之后,最好把写权限收回来,普通设计师只读,由专人负责发布模块。

2.3 CIS_MODULE表结构:主键是PART_NUMBER,不是描述

模块复用里最容易犯的一个错,是拿“模块名称”当唯一标识。比如“5V电源模块”这种名字,换一个人可能写成“5V_PWR”,换一个语言写成“5伏电源块”,数据很快就乱了。我通常用PART_NUMBER做唯一主键,名称只做描述。

下面是Access里创建模块主表的SQL,可以直接在Access查询设计器中执行:

CREATE TABLE CIS_MODULE ( PART_NUMBER TEXT(20) PRIMARY KEY, MODULE_NAME TEXT(80) NOT NULL, MODULE_TYPE TEXT(40), MODULE_REV TEXT(10), SYMBOL_NAME TEXT(80), VALUE TEXT(40), FOOTPRINT TEXT(40), DATASHEET_LINK TEXT(200), MODULE_PATH TEXT(200), LIB_PATH TEXT(200), LAST_MODIFIED DATETIME );

PART_NUMBER用文本型做主键,例如PWR-5V-A01、MCU-MIN-A02。不要把它设计成自动编号的数字列,因为原理图里这个编号会被写进元件属性,数字可读性太差。MODULE_NAME是给人看的模块名,比如“5V/3A同步降压保护模块”。MODULE_REV是版本号,建议用A01、A02或者带日期的编号,不要直接写V1,因为V1和V1.1混在一起很难排序。MODULE_PATH和LIB_PATH分别指向模块子图文件和符号库文件,路径建议用相对路径,例如MODULE/PWR_5V/PWR_5V.DSN,这样整个库目录拷到别的机器也不会断。

字段命名尽量用英文大写加下划线。ODBC在不同版本里对中文列名的兼容不一致,尤其是老版本的Access驱动,中文列名偶尔会出现乱码,而Capture的字段映射是按列名精确匹配的,一旦对不上,放置元件时就会报“Cannot find property”。表结构里不要塞过多冗余字段,像“DESCRIPTION”这种字段可以留一个,但不要拿它做主键。

数据库里除了主表,还应该有一张模块明细表,用来记录模块内部的BOM元件。这张表不一定要在CIS的主查询里出现,但导出BOM展开模块时非常有用。主表只负责“这个模块怎么选”,明细表负责“这个模块里面到底有什么”。

3. 搭建一个能发布模块的CIS数据库环境

概念理清之后,下一步是把环境搭起来。很多人在这里犯拖延症,总想等“全部模块整理完”再配置。实际上应该先配好一套最小流程,选一个电源模块做试点,从Access建表、ODBC配置、CIS字段映射、原理图调用跑通一遍,再慢慢扩充。跑通一次之后,整个团队的接受度会明显提高,因为大家看到的不再是一堆规范文档,而是“从数据库里放一个模块,BOM和子图自动带出来”的真实效果。

3.1 准备一个干净的模块原理图库

模块符号不是随手画的,它要长期被几十个人调用,所以必须有明确的规范。我建议先建一个独立的模块符号库,不要和生产用元件库混在一起。

文件结构可以参考这样:

C:\HARD_LIB\ SYMBOL\ CAPTURE.OLB MODULE\ PWR_5V\ PWR_5V.DSN MCU_MIN\ MCU_MIN.DSN RS485\ RS485.DSN CIS_CFG\ CIS_MODULE.DBC

SYMBOL目录放Capture库文件,MODULE目录按模块名分文件夹,每个文件夹放一个独立原理图文件,CIS_CFG放CIS配置文件。模块符号的绘制建议统一以下几项:边框用矩形并加外框尺寸标注,尺寸尽量标准化,这样放在图纸上排版整齐;引脚名必须和子图里的层次端口一一对应,信号端口的命名要能看出功能,比如UART_TX、CAN_H、PWR_SENSE,不要用N001这类自动编号;电源引脚统一用电源符号VCC/GND,不要用普通引脚去画电源网络;内部器件标号使用带模块前缀的位号,例如模块内部第一颗电阻标号写成R_PWR5V_01,避免模块复制到新设计后和外部位号冲突。

模块子图里不要出现“对着别的图纸复制过来的孤岛网络”。每个信号都要通过层次端口引到模块边界,否则模块放在不同项目里,网络无法和外部连接。子图文件尽量做成独立DSN,而不是把整个模块页面塞进当前设计文件,独立的DSN可以单独拷走、单独做EDC检查,也方便用脚本做版本比对。

3.2 在Access里落地数据表并录入第一条模块记录

Access新建一个空白数据库,命名为HARD_MODULE_LIB.mdb,放在C:\HARD_LIB下面。然后执行前面那一段建表SQL,再插入第一条测试记录。以最简单的5V电源模块为例:

INSERT INTO CIS_MODULE ( PART_NUMBER, MODULE_NAME, MODULE_TYPE, MODULE_REV, SYMBOL_NAME, VALUE, FOOTPRINT, DATASHEET_LINK, MODULE_PATH, LIB_PATH, LAST_MODIFIED ) VALUES ( 'PWR-5V-A01', '5V/3A DC-DC Module', 'POWER', 'A01', 'PWR_5V', '5V/3A', 'MODULE_PWR_5V', '', 'MODULE/PWR_5V/PWR_5V.DSN', 'SYMBOL/CAPTURE.OLB', Now() );

PART_NUMBER和MODULE_REV尽量保证对应关系清晰。MODULE_PATH写成相对路径,根目录以CIS配置里的基准目录为准。FOOTPRINT这里填的是模块自身的封装名,很多时候模块在PCB上是作为整体摆放的,要挑选对应的PCB封装,否则后端布局阶段会找不到封装。DATASHEET_LINK第一版可以为空,但正式发布时最好填上模块的设计说明或参考电路文档链接,方便设计人员核对。

插入后在CIS_MODULE里能看到一条记录,标签页里确认PART_NUMBER、MODULE_NAME都有值,不要有Null。Null字段在后续BOM脚本里会变成空字符串,反而容易误判。

3.3 配置ODBC DSN:图形界面步骤和命令行两种方式

Capture CIS读取数据库时,需要先在操作系统里配置一个ODBC数据源。以Windows上的Access数据库为例,打开控制面板里的“ODBC数据源管理器”,注意32位和64位是两个入口,Cadence Capture CIS如果是32位程序,必须使用SysWOW64目录下的odbcad32.exe,否则在CIS里会找不到你新建的DSN。

在用户DSN或系统DSN里点新增,选择“Microsoft Access Driver (*.mdb, *.accdb)”,数据源名填CIS_DB,然后选择数据库文件路径。配置完成后点“测试连接”,确认能读到表,再打开Capture CIS做下一步。

如果团队里需要批量部署,也可以用命令行方式创建:

odbcconf /A {CONFIGDSN "Microsoft Access Driver (*.mdb, *.accdb)" "DSN=CIS_DB|DBQ=C:\HARD_LIB\HARD_MODULE_LIB.mdb|READONLY=FALSE"}

这段命令要放在管理员权限的命令行里运行。DBQ参数指向数据库文件路径;READONLY=FALSE表示允许读取,如果只给设计人员用,建议改成TRUE,防止在CIS里误改数据。命令行方式适合新同事入职时快速配环境,但要注意系统里已经装了对应用户DSN之后,重复执行CONFIGDSN可能不会覆盖已有同名DSN,需要先把旧DSN删掉再配置。

3.4 在Capture CIS里做字段映射并保存配置

打开OrCAD Capture CIS,进入Options菜单,找到CIS Configuration。弹出的配置窗口左侧是数据库设置,右侧是字段映射。点数据库图标,选择刚才配好的CIS_DB,然后选择表CIS_MODULE。Capture会自动读取字段列表。

接下来需要做映射,这一步是调试时间最多的环节。PART_NUMBER映射到Part Number,VALUE映射到Value,SYMBOL_NAME映射到Symbol Name,FOOTPRINT映射到PCB Footprint。MODULE_REV不要直接映射到现有属性,而是新建一个用户属性,比如MODULE_REV,这样在原理图里能单独看到这个字段,也方便后续脚本提取。MODULE_PATH和LIB_PATH同样映射成用户属性,它们不会显示在原理图文字上,但会跟着元件实例保存到网表和BOM里。

映射完成后点保存,会生成一个扩展名为.DBC的CIS配置文件。这个文件要放到共享目录C:\HARD_LIB\CIS_CFG下,团队每个人都指向同一个DBC。我的经验是不要把DBC文件发到个人桌面,否则某个人改了映射,其他人看不到,最后同一套库出现两套行为。

配置完成后,可以先在CIS面板里浏览CIS_MODULE表,双击PWR-5V-A01这条记录,如果右侧能预览到符号信息,说明字段映射没问题。如果预览不到符号,通常是因为SYMBOL_NAME和库里的元件名不一致,或者是符号名写错,不是数据库的问题。

3.5 把第一个模块符号放进CIS记录里

在Capture库编辑器里新建一个元件,元件名必须是PWR_5V,和SYMBOL_NAME字段完全一致。符号的引脚放置顺序也有讲究,建议电源引脚放在上方,主输入输出引脚放在左右,控制引脚放下方,这样原理图看起来清晰。

保存元件到SYMBOL/CAPTURE.OLB之后,重新进入CIS数据库预览,这时选择PWR-5V-A01,应该能看到符号外形。如果仍然只看到一条记录但无法预览,检查三个常见地方:数据库表里的SYMBOL_NAME是否有多余空格;Capture库文件是否已经被其他进程锁定;DBC配置里“Library List”是否包含SYMBOL/CAPTURE.OLB。这三个问题占了模块复用调试中的大半“怪现象”。

等到符号能正常预览,环境搭建就算完成了。此时先别急着做复杂模块,用PWR-5V-A01在空白原理图页上放置一次,确认能放进图纸、属性里带有MODULE_REV和MODULE_PATH,再继续填充其他模块。

4. 在原理图里调用CIS模块:放置、关联子图和网络接入

环境配好之后,真正的使用流程并不复杂,但很多人在这里会照着手册按部就班,却不知道为什么模块放进来之后电阻电容没有跟着出现。这里需要说清楚一个关键点:CIS负责放的是“模块符号本身”和“相关属性”,模块内部的子图需要通过Capture的层次化设计机制带进来。两者配合好,才能算完整的模块复用。

4.1 Place Database Part和普通Place Part的差别

普通Place Part是从Capture的元件库中放置一个符号,库里只有符号和默认属性,没有额外的物料信息。Place Database Part则是先从CIS数据库中按条件搜索记录,再将记录里映射好的字段填充到元件属性上。模块复用选择的是后者,因为模块的版本、子图路径、BOM对应关系都靠这些字段承载。

放置时打开CIS Explorer,在搜索框里输入PWR-5V-A01,找到结果后双击,就可以在原理图页面中放置符号。放置后点击符号,打开属性列表,检查是否包含PART_NUMBER、MODULE_REV、MODULE_PATH、LIB_PATH这些字段。如果字段缺失,说明DBC映射没生效,先不要继续画图,回去补配置,否则后面导出BOM时会因为缺关键字段而很难排查。

4.2 把模块子图带入当前设计

模块符号放进图纸,等于告诉设计系统“这里有一个模块”,但模块内部电路还得有一个实体。常见做法是给模块目录里的DSN文件单独留一个设计入口:在新工程中右键添加已有的DSN文件,或者用Capture的层次设计功能在顶层符号下建立指向MODULE_PATH的子图链接。

需要手工完成的动作通常是:在项目管理器里把MODULE/PWR_5V/PWR_5V.DSN作为独立设计资源加入当前工程,然后在顶层原理图中放置与模块符号引脚一致的层次端口。这个步骤看起来冗余,但正是这个“显示关联”的过程,让模块内部电路真正成为当前设计的一部分,网表导出时才会带上内部元器件。

如果团队希望减少手工动作,可以将一套标准的操作步骤固化到“模块发布模板”里:每个模块子图都使用统一的页面命名和端口顺序,新设计加入模块时,导入DSN后只需要把顶层的层次端口名字和模块符号引脚对齐。整齐的端口命名比漂亮的电路图重要得多,因为网表是按网络名生成连接的,端口一错,整块模块等于没有接入主设计。

4.3 模块网络怎么和主设计接在一起

模块内部网络和外部设计的连接,靠的是层次端口和全局网络。电源网络建议使用全局电源符号,例如VCC和GND,这样模块复制到任何一页,都不会因为图纸复制产生“VCC_1”之类的后缀网络。信号网络则使用层次端口,端口名如UART_TX、CAN_H等,放在模块边界。

这里有一个很容易踩的坑:从旧图纸复制过来的模块内部,如果原来用的是普通网络标签,导入新设计时Capture为了保证网络唯一性,自动给它们加上随机数字后缀,结果模块内部的B点没有和外部B点连上。我在模块规范里强制规定:模块内部非电源网络全部用层次端口引出来,模块内部绝不允许出现悬空普通标号网络。网表导出后如果发现某个网络带了下划线加数字后缀,先去查它是不是从模块内部直接连出来的,而不是从外部接入的端口。

模块放进设计后,用DRC跑一遍电气规则,重点检查单端网络、未连接引脚和短路。模块复用最大的风险不是画错,而是画的时候“看起来连上了、实际上没连上”,因为模块内部密密麻麻,眼睛很难看出断点。

5. 避坑:CIS模块复用最容易翻车的5个现场

5.1 数据库配置明明成功,Place Database Part却一直是灰的

现象:ODBC测试连接能通过,CIS配置里也能看到表,但工具栏上的Place Database Part就是灰色,点不了。

原因:通常是Capture CIS没把当前库设为“活动”。CIS配置保存完之后,还需要在配置窗口里选择该DBC作为当前使用配置;有些版本会同时存在多个配置,当前配置没切换,面板里的数据库就是空壳。

解决:重新打开CIS Configuration,确认当前激活的DBC是CIS_MODULE.DBC,然后关闭并重开原理图页。如果仍然灰色,再检查ODBC的位数,32位Capture对64位DSN是看不到的,把DSN重建到SysWOW64入口下。

5.2 模块里的VCC和GND变成VCC_123、GND_456

现象:从一个模块子图导入新设计后,电源网络全部变成带随机后缀的网络名,电源平面完全断开。

原因:Capture在复制或导入原理图页面时,会对“局部电源符号”重命名,以保证不同页面间的唯一性。模块内部如果用普通电源符号而不是全局电源符号,导入时就会触发重命名。

解决:模块内部电源网络统一使用全局Power符号,不要用“平铺的VCC标号”代替。已经出现问题的设计,用全局替换功能把所有VCC_xxx替换为VCC,替换后马上重跑DRC,确认没有短路。血的教训是替换前先导出网络表备份,因为全局替换一旦操作到非电源网络,会把信号网络也误伤。

5.3 从CIS放出来的模块在BOM里变成一行,而不是模块明细

现象:导出BOM后,模块只输出一行PART_NUMBER,模块内部的电容、电阻、IC全部没有出现在BOM里。

原因:CIS默认把放进去的模块当成一个“元件实例”,不会主动展开内部子图。BOM模板如果只按当前原理图的器件实例提取,就会漏掉子图内部的器件。

解决:BOM模板改为“按层次展开”模式,或者把模块内部电路单独导出,再由脚本合并。我习惯的做法是导出一份“当前设计器件清单”和一份“模块内器件清单”,最后用脚本按PART_NUMBER把模块内的器件展开进总BOM。如果工具链不支持层次展开,就在模块明细表里维护一份物料清单,BOM输出后按模块编号关联明细。

5.4 改了CIS库里的MODULE_REV,原理图里的旧模块却不更新

现象:管理员在数据库里把PWR-5V-A01改成A02,打开旧原理图,发现模块属性仍然是A01。

原因:这就是本章开头说的“CIS只管装载,不管同步”。元件实例在放置时已经把属性快照写进原理图,数据库记录变更不会反向推送实例。

解决:不要试图用数据库同步旧图。正确的发布流程是“改库 + 发布新符号版本 + 设计师在设计中执行资料库替换/更新属性”。Capture里可以用批量更新属性功能把旧模块的MODULE_REV字段批量改成A02,但前提是原理图库符号也同步到A02;如果只是想追溯板上实际用了什么版本,保留A01反而更真实,不用强改历史设计。

5.5 两个工程师同时维护同一个CIS库,记录被覆盖

现象:A同学在Access里新增了一个模块记录,B同学在Excel导出的旧副本上改了几个字段后又导回来,A的新记录消失,B的旧数据重新出现。

原因:Access共享库缺少并发控制和版本控制,两个编辑者没有锁定机制。

解决:把共享的Access库设置为只读,所有写入操作通过一个“发布目录”进行。模块库管理员负责import和release,其他人只能浏览。如果团队实在需要多人写库,趁早迁移到SQL Server,利用行锁和权限来管理。不要在Access文件共享模式下做多人同时写库,这是所有CIS模块库事故里恢复成本最高的一个。

6. 复用完之后,用清单Diff锁住版本,给团队留个后手

6.1 导出当前复用清单

CIS模块复用做到最后,你需要的其实不是一份原理图,而是一份“这张板卡到底用了哪些模块、每个模块什么版本”的清单。Capture CIS的报表功能可以直接导出当前设计的CSV,勾选PART_NUMBER、MODULE_REV、Quantity这三列,生成一份复用清单。文件名建议和项目绑定,例如REV_A1_MODULE_LIST.CSV,单独放在项目发布目录下。

6.2 用Python脚本对比两版模块差异

清单导出之后,可以用一段很小的Python脚本做版本比对。脚本逻辑很简单:读取两个CSV,按模块编号和版本号分组,输出新增、删除、版本变化的情况。

import csv def load_module_list(path): modules = {} with open(path, newline="", encoding="utf-8-sig") as f: for row in csv.DictReader(f): key = (row["PART_NUMBER"].strip(), row["MODULE_REV"].strip()) modules[key] = modules.get(key, 0) + int(row["Quantity"]) return modules def diff_lists(old_path, new_path): old = load_module_list(old_path) new = load_module_list(new_path) added = {k: v for k, v in new.items() if k not in old} removed = {k: v for k, v in old.items() if k not in new} changed = {k: old[k] for k in old if k in new and old[k] != new[k]} return added, removed, changed if __name__ == "__main__": added, removed, changed = diff_lists("A1_MODULE_LIST.CSV", "A2_MODULE_LIST.CSV") print("新增/更换:", added) print("移除:", removed) print("数量变化:", changed)

脚本里的列名需要和导出CSV的列头保持严格一致,如果报表导出时带了空格,就在DictReader里对列名做strip。逻辑上,它只验证“用了哪版模块”,不验证原理图电气连接是否正确,所以它是发布前的“看门人”,不是DRC替代品。

6.3 我现在的习惯

现在每次投板前,我都会把当前设计的模块清单和“已批准模块清单”跑一遍diff,确认没有混用旧版本、没有多放模块、没有数量异常。这个习惯帮我挡住了好几次“改了一个电容但版本号没变”的疏忽。别指望一键全自动,原理图千变万化,自动化做得太重反而没人维护;但一份几十行的小脚本,已经能锁住最关键的版本风险。希望帮到你。

本文还有配套的精品资源,点击获取

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

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

立即咨询