简介:这份文档面向电子设计与集成电路相关专业的学习者,围绕四位移位寄存器的仿真与设计展开,适合需要掌握 CMOS 数字电路设计流程、熟悉 Tanner 工具链的读者参考。内容以 1.25 μm CMOS 工艺模型为基础,借助 Tanner13 软件完成从 CMOS 反相器、二输入与非门到边沿 D 触发器、四位右移寄存器的搭建,并给出功能验证、功耗分析、上升下降与延迟时间测量、最高工作频率计算及温度分析等完整环节,可帮助读者理解移位寄存器在计数器、顺序脉冲发生器、串行累加器及液晶显示驱动等场景中的应用。资源包共 1 个 doc 文件,约 274KB,为完整设计报告文档,含摘要、目录、各章节论述与附录,便于按模块查阅。目前已有 1962 人学习,适合作为课程设计或入门仿真的对照材料。
1. 四位 CMOS 移位寄存器:一份能跑通 Tanner13 全流程的仿真设计包
做数字 IC 课程设计或入门级电路验证时,最难受的不是不会写 SPICE 网表,而是手里只有一张原理图,却不知道从反相器到 D 触发器再到四位移位寄存器该怎么一层层搭起来、怎么在仿真器里把波形跑对。这份资源就是围绕四位 CMOS 移位寄存器展开的完整设计与仿真记录,工艺模型锁定在 1.25 μm,工具链是 Tanner13(S-Edit 画图、T-Spice 仿真、W-Edit 看波形),从 CMOS 反相器、二输入与非门的宽长比调试,到边沿 D 触发器、四位右移寄存器的符号化封装,再到功能、功耗、上升下降延迟、最高工作频率和温度分析,一条线走完。它适合正在做寄存器/触发器类课程设计的学生,也适合想补一遍 CMOS 门级到时序模块设计流程的初级工程师。空载延迟 0.6 μs、上升 0.65 ns、下降 0.77 ns、功耗 32 μw 这些数字,就是这套流程跑出来的结果,能不能复现、怎么复现,下面拆开讲。
2. 从反相器到与非门:1.25 μm 工艺下的宽长比怎么调
2.1 为什么先做反相器和二输入与非门
四位 CMOS 移位寄存器不是一上来就画四个触发器,它的最小可复用单元是反相器和二输入与非门。边沿 D 触发器由 8 个二输入与非门加 3 个反相器组成,四个 D 触发器串起来才是移位寄存器。所以整条设计链是:NMOS/PMOS → 反相器 → 二输入与非门 → 边沿 D 触发器 → 四位右移寄存器。每一级都做成符号图(symbol),上一级的符号才能被下一级直接拖进原理图里用。这个分层思路是 Tanner 流程里最值得先立住的一点,跳过它直接画顶层,后面改一个管子尺寸就得全图重连。
选 CMOS 而不是 TTL,原料里给了理由:互补结构静态功耗理论上为零、工作电压范围宽、逻辑摆幅接近电源轨、噪声容限典型值为电源电压的 45%、温度稳定性好、输入阻抗可达 10 MΩ 量级。对一份要跑功耗和温度分析的仿真作业来说,这些特性正好是后面几组数据的物理基础,不是背概念。
2.2 反相器的搭建与参数
在 S-Edit 里新建 cell,把 Tanner EDA 安装目录下 Libraries 里的器件库加进来,拖出 NMOS 和 PMOS,栅极相连作输入,漏极相连作输出,NMOS 源极和衬底接地,PMOS 源极和衬底接高电平。然后进入宽长比调试:长度统一取模型最小尺寸 1.25 μm,反复调宽度看输入输出波形,最终定下来的参数是:
| 器件 | W | L | AS | PS | AD | PD |
|---|---|---|---|---|---|---|
| NMOS | 15u | 1.25u | 2.25p | 6.8u | 2.25p | 6.8u |
| PMOS | 35u | 1.25u | 2.25p | 6.8u | 2.25p | 6.8u |
PMOS 宽度取到 NMOS 的 2 倍多,是为了补偿空穴迁移率低于电子迁移率,让上升和下降沿尽量对称。AS/AD 是源漏区面积,PS/PD 是源漏区周长,这几个寄生参数在 1.25 μm 这种相对大的工艺节点下不能随手填 0,否则后面延迟和功耗会偏乐观。
调完尺寸做直流扫描,在生成的 T-Spice 网表里加:
.dc lin VVoltageSource_2 0 5 0.05 .print dc v(in) V(out).dc lin表示线性扫描,源名后面跟起点 0、终点 5、步长 0.05,.print dc把输入输出节点电压打进输出文件。看的是电压传输特性曲线陡不陡、翻转点是否接近 Vdd/2。功耗分析加.power VV3,从 out 文件读到反相器平均功耗约 8.8 μw。
2.3 二输入与非门的并联串联关系
与非门的结构是两只 PMOS 并联、两只 NMOS 串联:PMOS 并联保证任一输入为低时输出被拉高,NMOS 串联保证只有两输入同时为高时输出才被拉低。栅极两两相连作两个输入端,PMOS 漏极与上端 NMOS 漏极相连引出输出。优化后的参数是两只 NMOS 均为 W=15u、L=1.25u,两只 PMOS 分别为 W=25u 和 W=45u,其余寄生参数与反相器一致。两只 PMOS 宽度不同,是因为串联路径上不同位置的 PMOS 面对的等效负载和体效应不同,等宽反而会让两个输入到输出的延迟不对称。
同样做功耗分析,与非门平均功耗约 8.4 μw。这一步的意义在于:顶层功耗不是拍脑袋估的,而是由这些单元功耗逐级累加上去的,先把单元级数据跑准,后面 32 μw 的整机功耗才有说服力。
提示:宽长比调试不要一次只改一个管子就下结论,NMOS 和 PMOS 的宽度要成组调,否则你看到的波形改善可能只是某一沿变好、另一沿变差。
3. 符号图与边沿 D 触发器:把原理图变成可复用模块
3.1 符号图生成的两个硬性对应
反相器和与非门电路图完成后,在 cell 上右键 New View,View type 选 symbol,进入符号编辑界面画方框、加引脚。这里有一条血泪经验:符号图的输入输出端口名必须和电路图里的端口名严格一致,反相器电路图输入端叫 In、输出端叫 Out,符号图也必须叫 In 和 Out。名字对不上,符号拖进上层原理图后网表连接会断,仿真报节点悬空,波形一片平线,排查起来非常费时间。
这个动作看起来只是画个框,实际是把「电路」抽象成「器件」的关键一步。做完之后,反相器和与非门就变成库里的两个符号,后面画 D 触发器时不用再关心内部管子,只连符号和导线。
3.2 边沿 D 触发器的组成与连线
新建模板,按 D 触发器结构拖入 8 个二输入与非门符号和 3 个反相器符号,按图序排列后用导线连接。原料里没有逐门展开内部拓扑,常见做法是主从结构:前级锁存器在时钟某一电平采样,后级在另一电平输出,反相器用来生成互补时钟和缓冲。连线时特别注意时钟 CP 的极性,主从两级用的 CP 是反相的,接错会变成电平触发而不是边沿触发,功能表看着对、时序一测就露馅。
连完后再生成一次符号图,同样保证端口名与电路图一致。到这里,一个边沿 D 触发器就成了可拖拽的模块,四位寄存器只需要把它复制四份。
3.3 四位右移寄存器的串接
新建模板,拖入四个 D 触发器符号,前一级的 Q 输出接后一级的 D 输入,第一个触发器的 D 作整机串行输入,四个触发器的 CP 端并在一起接同一时钟,从各级 Q 引出 Q0~Q3 四个输出,反向输出端空载。这就是最基本的串入并出右移结构。
串接时容易翻车的地方是输出抽头位置:如果从 Q 反端抽头,移位方向看起来会反,功能表全对不上。另一个是时钟并接后的扇出,四个触发器共用一路 CP,在 1.25 μm 工艺下驱动能力要留意,必要时在 CP 路径上加缓冲级,否则后级触发器时钟沿变缓,建立保持时间余量被吃掉。
4. 功能仿真:高电平与低电平两组波形怎么读
4.1 瞬态仿真环境怎么配
顶层符号拖进新模板后,CP 端加脉冲源,输入端先接高电平。库工具栏里加 Include 命令,模型文件填 ml2_125.md,这是 1.25 μm 工艺模型;再加 PrintVoltage 命令,把打印点放到输入和各输出节点上。然后点 setup simulation,勾选瞬态分析,参数设为:停止时间 1u,最大时间步距 20n,开始打印时间 0n,打印步距 20n。生成 T-Spice 网表后运行,W-Edit 里看波形。
这几个参数的含义要清楚:停止时间决定你观察几个时钟周期,最大步距限制仿真器内部最大推进步长,步距太大波形会失真、边沿测不准,步距太小仿真时间成倍增加。20 ns 步距对 1 μs 窗口是折中值,做上升下降时间精细测量时要再收紧。
4.2 输入高电平时的移位序列
初始状态 0000,时钟下降沿到来后右移,依次变为 1000、1100、1110、1111,连续四个周期后全为 1。这里要注意原料明确写的是下降沿触发,如果你按上升沿去对波形,会以为功能错了,其实是触发极性没对上。
4.3 输入低电平时的移位序列
输入端接低电平,时钟仍为脉冲,从 1111 开始依次变为 0111、0011、0001、0000,四个周期后清零。两组波形合起来就是完整的功能表:D 端连续输入 1 时逐位右移填 1,连续输入 0 时逐位右移填 0。功能表不是抄出来的,是从这两组瞬态波形里读出来的,这也是为什么仿真步距和打印点要设对——读错一个沿,整张表就错位。
注意:功能仿真通过不等于时序达标,功能只看逻辑序列,上升下降时间和最高频率要另开仿真,别用功能波形去量边沿。
5. 功耗、延迟与最高频率:32 μw 和 704 MHz 是怎么测出来的
5.1 功耗分析只算电源
整机功耗分析时,输入端和 CP 端的信号源理论上不贡献功耗,只分析接在 Vdd 和 Gnd 之间的电源 VV3。T-Spice 里.power命令必须和瞬态分析联用,所以先配瞬态:停止时间 100u,最大步距 20u,开始打印 0s,打印步距 20u,再加 Print Power 命令指定 VV3,网表里补.power VV3。out 文件读到平均功耗 3.274e-5 W,即约 32 μw,最大功耗 72 mw 出现在 2.4 ns 附近,最小 0.34 μw 在 48 μs 时刻。
最大功耗出现在时钟翻转瞬间,是容性负载充放电的尖峰,平均值才是常说的功耗指标。把这两个数分开看,才不会拿尖峰值去吓自己。
5.2 上升、下降、延迟时间的测量口径
定义先立住:上升时间是稳态值 10% 到 90%,下降时间是 90% 到 10%,延迟时间是输入变化到 50% 与输出变化到 50% 的时间差。输入 5 V 时,10% 是 0.5 V,90% 是 4.5 V,50% 是 2.5 V。在波形上量 0.5 V 到 4.5 V 的横向时间差得上升时间 0.65 ns,反向得下降时间 0.77 ns,输入输出各自过 2.5 V 的时刻差得延迟 0.6 μs。
这里有个容易混的点:延迟 0.6 μs 和上升时间 0.65 ns 差了三个数量级,不是笔误。延迟是从输入跳变到输出开始有效响应的时间,包含多级门传播,上升时间是输出沿本身的斜率,两者物理含义不同,量的时候别把横轴刻度看串。
5.3 负载与最高频率的换算
最高工作频率由上升下降时间结合负载推算,原料给出空载 704 MHz,负载 1 pF 时 270 MHz,5 pF 时 66 MHz,10 pF 时 33 MHz。负载越大,输出沿被拉得越缓,能容忍的周期越短,频率随之下降。这组数据说明一个边界:这个四位寄存器在轻载下能跑到几百兆,一旦挂上较大容性负载,实际可用频率掉到几十兆,选型时不能只看空载那个漂亮数字。
| 负载条件 | 最高工作频率 |
|---|---|
| 空载 | 704 MHz |
| 1 pF | 270 MHz |
| 5 pF | 66 MHz |
| 10 pF | 33 MHz |
5.4 温度分析的观察窗口
温度分析是在一定温度范围内扫输出,看温度变化对输出的影响。原料结论是范围内影响很小,这和 CMOS 互补结构、低功耗、参数对称自动补偿的特性一致。做这组分析时,扫描范围要覆盖你实际应用的环境区间,别只扫一个点就下结论;同时注意模型文件里温度参数是否被正确引用,模型没带温度系数,扫出来当然是一条平线,那是假稳定。
6. 避坑与排查:五条仿真翻车记录
6.1 波形全是平线,输出不翻转
现象:瞬态跑完,所有输出节点电压不动。原因:最常见是符号图端口名和电路图端口名不一致,上层网表连接断开;其次是 Include 的模型文件名写错,器件没有有效模型,仿真器按默认参数跑或直接忽略。解决:逐级打开符号图核对端口名,确认 ml2_125.md 路径和文件名与安装目录一致,先单独仿一个反相器验证模型加载正常,再往上叠。
6.2 功能对但触发沿对不上
现象:移位序列正确,但变化时刻和预期时钟沿差半个周期。原因:D 触发器主从两级时钟极性接反,或者 CP 端脉冲源上升下降沿设置与设计假设不符。解决:回到 D 触发器符号内部查互补时钟连接,确认 CP 源的高低电平时间和占空比,功能表按实际触发沿重新对一遍。
6.3 功耗数据大得离谱
现象:out 文件里平均功耗比预期高一个数量级。原因:.power指定的源名写错,把信号源当电源统计了;或者瞬态停止时间太短,只统计到启动尖峰段。解决:核对.power后面的源名与原理图中电源标号完全一致,把停止时间拉长到覆盖多个稳定周期,再看平均值。
6.4 上升下降时间量出来是 0 或跳变
现象:波形上读不到 0.5 V 到 4.5 V 的过渡段。原因:最大时间步距设得太大,边沿被仿真器一步跨过,打印点太稀。解决:把最大步距收紧到边沿量级的几分之一,打印步距同步减小,重新跑瞬态,边沿才有足够采样点。
6.5 温度扫描结果一条直线
现象:不同温度下输出完全不变。原因:模型文件未包含温度相关参数,或温度扫描语句没生效。解决:确认模型文件版本和温度卡是否被引用,检查扫描命令写在正确的分析段里,先用一个已知有温度特性的单元验证扫描链路通不通。
7. 进阶用法:把这份设计当模板去改参数
这份资源真正的价值不在那几组数字,而在它给了一条可改可扩的验证链路。我一般会拿它当模板做三件事。第一,改工艺角:把 ml2_125.md 换成同目录下其他模型文件,同一套原理图和测试台不动,直接对比延迟和功耗漂移,快速看设计对工艺的敏感度。第二,改位宽:四位右移的串接结构是线性的,复制 D 触发器符号、改输出抽头数量,就能扩到 8 位,重点检查 CP 扇出和末级延迟是否还满足目标频率。第三,改负载条件重算频率:把 1 pF、5 pF、10 pF 三档负载做成参数化测试,一次跑完出表,比手工改三次网表可靠得多。
验证方法上,我习惯先跑单元级再跑整机:反相器的直流曲线和功耗先过一遍,与非门真值表过一遍,D 触发器单拍波形过一遍,最后才看四位序列。任何一级不过,绝不往上叠,否则顶层出错时你根本分不清是哪个单元的问题。这套顺序看着慢,实际比反复重跑顶层快得多。
参数边界也要心里有数:1.25 μm 工艺、5 V 电源、空载 704 MHz 是在特定模型和测试条件下得到的,换工艺、换电源电压、加负载,这些数字都会变,别把某一组结果当成器件的固有属性到处套。温度分析结论是「一定范围内影响很小」,范围之外没有数据支撑,不要外推。
从那以后我每次做这类门级到模块级的仿真,都强制先核对符号图端口名、再确认模型文件加载、最后才看波形,这三步走完再谈调参数。希望帮到你。
本文还有配套的精品资源,点击获取