CML 输出结构和工作原理

先从电流模逻辑说起

CML,全称 Current Mode Logic,中文叫电流模逻辑。你想想看,这名字就已经把核心说透了——它靠的是电流的切换,而不是电压的摆来摆去。

我记得刚接触 CML 那会儿,心里总犯嘀咕:这玩意儿电压摆幅才几百毫伏,能靠谱吗?结果一测眼图,干净得像个乖孩子。说白了,CML 就是拿小摆幅换速度,拿恒定电流换低噪声。

输出级长啥样?

一个典型的 CML 输出级,你拆开来看,就那么几个东西:

  • 差分对管:两只 NPN 晶体管(或者 NMOS),基极(栅极)接输入信号。
  • 尾电流源:接在发射极(源极)下面,提供恒定电流 ISS。
  • 负载电阻:两个等值的电阻 RL,一头接电源 VCC,另一头接到各自的集电极(漏极)。

输出就从两个集电极(漏极)拉出来,记作 VOUT+ 和 VOUT-。

核心要点:CML 的静态功耗几乎是恒定的!不管输出是 1 还是 0,尾电流 ISS 始终在流,只不过从这路换到那路。

CML 输出级基本结构 CML 差分输出级基本结构 VCC RL RL VOUT+ VOUT– Q1 Q2 VIN+ VIN– ISS GND ISS 流经 Q1 电流始终恒定,只是切换通道 —— 这正是 CML 低噪声的根源

工作原理:电流去哪,逻辑就在哪

当 VIN+ 高于 VIN– 时,差分对管 Q1 导通,Q2 关断。尾电流 ISS 全部流过 Q1,经过左侧的 RL 回到 VCC。这时候 VOUT+ 的电压就被拉低到 VCC – ISS × RL;而 Q2 这一侧没有电流,右侧 RL 上没有压降,所以 VOUT– 保持在 VCC。

反过来,当 VIN– 更高时,电流就切换到 Q2,输出极性翻转。两个输出端的电压差就是 CML 的摆幅:ΔV = ISS × RL。通常这个值在 400 mV 到 800 mV 之间。

我的一点经验:我曾遇到一个项目,CML 输出眼图的上升沿明显变慢。最后排查发现是负载电阻 RL 的值偏大了 20%,导致 RC 常数过大。其实 CML 的寄生容性负载非常敏感,调 RL 是控制带宽和摆幅的关键。

关键参数与设计原则

参数 典型值 影响
尾电流 ISS 10~20 mA 功耗、摆幅、驱动能力
负载电阻 RL 25~50 Ω 摆幅(ΔV = ISS·RL)、带宽
输出摆幅 VOD 300~800 mVpp 信噪比、接收端灵敏度
共模电压 VCM VCC – VOD/2 AC 耦合电容选择、输入偏置

你看这个表,ISS 和 RL 一起决定了摆幅。但 RL 不能随便加大——输出阻抗要和传输线匹配。CML 的输出阻抗基本就等于 RL,所以 50 Ω 电阻很常见。

CML 与 LVPECL 的直观差别(先尝个鲜)

虽然下一章才细讲对比,但这里我忍不住提一句:CML 的共模电压比 LVPECL 低得多,而且 CML 不需要上拉到 VCC – 2V 那么夸张。你在做 AC 耦合时,CML 对耦合电容的耐压要求就友好很多。

曾经翻车的地方:有一块 10 Gbps 的背板,我在中间 AC 耦合电容用了 0402 封装的 0.1 μF。结果信号眼图抖得厉害。后来换成 0603 的 0.47 μF,低频转折点移到了几十 kHz,才稳下来。CML 虽然自身低频响应好,但耦合电容选小了会出低频抖动,别省那点面积。

输出共模偏置与终端匹配

CML 输出通常要求终端电阻从每个输出端到 VCC 或者到地?这个取决于接收器。我个人习惯的做法是:

  • 如果接收器是内部偏置型(很多高速 ADC 是这样),直接 AC 耦合,然后让接收器自己偏置共模。
  • 如果接收器需要外部偏置,那就用一对电阻从输出端拉到 VCC 或目标共模电压,注意不要和芯片内部的 RL 并联产生额外分压。

说白了,CML 的终端设计比 LVPECL 简单,但你必须知道芯片内部有没有自带 50 Ω 到 VCC。很多 CML 驱动器的输出端已经内置了 50 Ω 上拉,你在外部再加并联电阻反而会把摆幅拉低。

功耗优势在哪里?

CML 的功耗几乎恒定,不随数据率变化。因为无论 0 还是 1,电流都在 ISS 的数值上。这对于高占空比变化的信号特别有利——功耗可预测,散热好做。

我做过一个 12.5 Gbps 的多通道收发器,LVPECL 每通道静态功耗大概是 150 mW 左右,而 CML 能做到 80 mW 以内。差别主要在于 LVPECL 的发射极跟随器要消耗额外的静态电流。

一个记忆小技巧:CML 的功耗 ≈ ISS × VCC,几乎就是尾电流乘以电源电压。你估算的时候拿这两项一乘,八九不离十。

好了,CML 的基本架构和原理就说到这。它结构简单、速度高、噪声低,是很多高速接口的首选。你在实际设计时,记得先看数据手册里是否内置了终端电阻,然后算清楚摆幅和共模点,匹配好耦合电容。做到这些,CML 基本不会给你找麻烦。