第四节:温度计编码架构
好,咱们今天聊聊温度计编码。说实话,我第一次接触这个名词时,还以为是跟温度传感器有关的东西。后来才知道,这名字来源于老式水银温度计——你想想看,水银柱上升时,每一格都是连续变化的,不会跳格。温度计编码也是这个道理。
温度计编码原理
温度计编码,说白了就是一种「有多少算多少」的编码方式。举个例子:
- 输入数字 0 → 输出 0000 0000(全0)
- 输入数字 1 → 输出 0000 0001(最低位变1)
- 输入数字 2 → 输出 0000 0011(最低两位变1)
- 输入数字 3 → 输出 0000 0111(最低三位变1)
- ...以此类推
看到规律了吗?每增加一个码值,就多一个「1」,而且这些「1」是从低位到高位连续排列的。不会出现像二进制那样,从 0111 跳到 1000 时所有位都翻转的情况。
核心要点:温度计编码的每个码字之间,只有一位发生变化。这就是它降低失真的根本原因。
如何通过编码方式降低 DNL
DNL(微分非线性)是 DAC 设计里最让人头疼的问题之一。我当年做第一个 12 位 DAC 时,就被 DNL 折磨得够呛。二进制加权架构下,最高位和最低位的电流源尺寸差了 2048 倍,匹配精度根本保证不了。
温度计编码是怎么解决这个问题的?
嗯,这里要注意:温度计编码里,每个单位电流源都是完全相同的。没有大小之分,只有「开」和「关」的区别。
- 二进制编码: 需要 12 个电流源,尺寸从 1 到 2048
- 温度计编码: 需要 4095 个电流源,每个尺寸都是 1
你想想看,4095 个完全相同的电流源,匹配起来是不是容易得多?每个单元的失配误差是随机的,当多个单元同时工作时,误差会相互抵消,而不是累积放大。
个人经验:我在一个 14 位 DAC 项目中,二进制架构的 DNL 做到了 ±1.5 LSB,换成温度计编码后直接降到了 ±0.3 LSB。代价是芯片面积大了不少,但性能提升是实打实的。
温度计编码与二进制编码的对比
咱们来做个直观的对比。我习惯用表格说话,这样一目了然:
| 对比项 | 二进制编码 | 温度计编码 |
|---|---|---|
| 单位电流源数量 | N 个 | 2^N - 1 个 |
| DNL 性能 | 较差(受匹配限制) | 优秀(随机误差抵消) |
| INL 性能 | 中等 | 良好 |
| 毛刺能量 | 大(多位同时翻转) | 小(每次只变一位) |
| 芯片面积 | 小 | 大(指数增长) |
| 功耗 | 低 | 高 |
| 解码电路复杂度 | 无(直接加权) | 高(需要温度计解码器) |
从表格能看出来,温度计编码几乎在所有性能指标上都占优,唯独面积和功耗是硬伤。这也是为什么实际设计中很少用全温度计架构——成本扛不住。
实际设计中的折中方案
那怎么办?我见过的大多数高性能 DAC,用的都是「分段式架构」:
- 高几位用温度计编码(保证线性度)
- 低几位用二进制编码(节省面积)
举个例子,一个 12 位 DAC 可以这样分:
高 6 位:温度计编码 → 63 个单位电流源
低 6 位:二进制编码 → 6 个加权电流源
总共:63 + 6 = 69 个电流源(而不是 4095 个)
这样既保证了 DNL 性能,又把面积控制在了可接受范围内。我曾经在一个项目中试过 8+4 的分段方式,效果不错,但后来发现 6+6 的性价比更高。
避坑指南:分段架构有个坑——高段和低段之间的「交界处」容易出问题。我曾经因为高段最后一位和低段第一位之间的增益不匹配,导致 DNL 在中间码值处出现了一个大跳变。解决办法是在交界处加一级缓冲器,或者做一点重叠校准。
温度计解码器的实现
温度计编码需要把二进制输入转换成温度计码。这个解码器可以用简单的逻辑门实现:
// 3位二进制转7位温度计码
// 输入:b2 b1 b0
// 输出:t6 t5 t4 t3 t2 t1 t0
t0 = b2 | b1 | b0
t1 = b2 | b1
t2 = b2 | (b1 & b0)
t3 = b2
t4 = b2 & (b1 | b0)
t5 = b2 & b1
t6 = b2 & b1 & b0
你看,其实就是一组或门和与门的组合。对于更高位数的解码,可以用树形结构或者 ROM 查表来实现。我个人习惯用树形结构,延迟更可控。
小结
温度计编码的核心思想,就是用「数量」换「精度」。它牺牲了面积和功耗,换来了优异的 DNL 性能和极低的毛刺能量。在实际工程中,我们很少用纯温度计架构,而是采用分段式设计,在性能和成本之间找到平衡点。
下一节咱们聊聊另一种常见的失真消除技术——动态元件匹配(DEM)。这玩意儿跟温度计编码是绝配,能进一步把失真切碎在频域里。