4、模拟存算一体:基于电阻阵列的向量矩阵乘法、电流求和与模数转换、非理想因素与补偿
好,咱们今天聊点硬核的。模拟存算一体,说白了就是用物理定律直接算数学题。我当年第一次在实验室看到电阻阵列算矩阵乘法时,说实话,被震撼到了——电流在导线里自己就把结果算出来了,根本不需要时钟。
4.1 电阻阵列:最朴素的向量矩阵乘法器
先看最基础的结构。你有一堆电阻,排成阵列。行线输入电压,列线输出电流。每个交叉点放一个电阻,阻值代表权重。
为什么能算乘法?欧姆定律嘛。电压除以电阻等于电流。每个电阻贡献的电流就是 V_in / R。如果我把权重编码成电导(也就是 1/R),那电流就等于 V_in * G。你看,乘法就这么完成了。
我习惯把这种结构叫做「模拟计算的最美实现」。没有晶体管开关,没有时钟沿,电流流过电阻的瞬间,乘法就发生了。
核心公式:
第 j 列的输出电流:I_j = Σ (V_i * G_ij)
其中 G_ij 是第 i 行第 j 列的电阻电导值。
嗯,这里要注意:电阻值不能太小,否则电流太大烧芯片。也不能太大,否则电流太小信噪比不够。我做过一个设计,阻值范围定在 10kΩ 到 1MΩ 之间,算是比较实用的区间。
4.2 电流求和:基尔霍夫定律的完美应用
矩阵乘法的第二步是求和。每一列的所有电流汇到一根线上,自然就加起来了。这就是基尔霍夫电流定律——流入节点的电流之和等于流出节点的电流之和。
你想想看,数字电路做加法需要加法器,需要进位链,需要时钟周期。模拟电路呢?一根导线就搞定了。这就是存算一体的魅力所在——计算发生在数据流动的过程中,而不是在专门的运算单元里。
我在项目中遇到过一个问题:列线上的寄生电阻会导致求和误差。每条列线都有电阻,电流流过时会产生压降,影响其他行的电流贡献。解决办法是让列线足够宽,降低寄生电阻。我一般要求列线电阻小于最小电阻值的 1/100。
实战技巧:
电流求和后的信号非常微弱,通常在微安到毫安级别。建议在列线末端加一个虚拟地(virtual ground)的运放,把电流转换成电压,同时保持列线电位稳定。
4.3 模数转换:从模拟世界回到数字世界
算完的结果是电流,但最终我们要的是数字。所以需要模数转换器(ADC)。
这里有个关键问题:ADC 放在哪?
- 每列一个 ADC:速度快,但面积大、功耗高。适合列数少的场景。
- 多列共享一个 ADC:面积小,但需要模拟多路选择器,速度受限。
- 时间域 ADC:把电流转换成时间,再用数字计数器测量。我比较喜欢这种,因为它面积小、功耗低,适合大规模阵列。
我曾经踩过一个坑:ADC 的量化噪声和电阻阵列的热噪声叠加,导致有效位数下降。后来我学乖了,在设计 ADC 时留出 1-2 位的余量。比如我需要 8 位精度,ADC 至少做 10 位。
注意:
ADC 的采样率要和矩阵运算的吞吐量匹配。模拟存算一体虽然计算快,但 ADC 转换时间可能成为瓶颈。我见过一个设计,矩阵计算只用了 1ns,ADC 却花了 100ns,整体性能被 ADC 拖垮了。
4.4 非理想因素:理想很丰满,现实很骨感
理论讲完了,咱们聊聊现实中的坑。模拟电路最大的敌人就是非理想因素。
4.4.1 电阻精度与失配
理想情况下,电阻值精确等于设计值。实际上,制造工艺会有偏差。比如 100kΩ 的电阻,实际可能是 95kΩ 到 105kΩ 之间。这种失配会导致权重误差。
我建议的做法是:
- 使用修调(trimming)技术,在芯片测试时微调电阻值
- 采用差分结构,抵消共模误差
- 在算法层面做校准,测量实际电阻值后修正权重
4.4.2 温度漂移
电阻值随温度变化。芯片工作时会发热,温度升高,电阻值变化,计算结果就偏了。
我记得有一次测试,芯片刚上电时精度很好,跑了 10 分钟后误差越来越大。查了半天,发现是温度漂移导致的。后来加了温度传感器和补偿电路,才解决问题。
4.4.3 非线性
电阻本身是非线性的,尤其是用晶体管实现的伪电阻。电压不同,电阻值也不同。这会导致乘法结果出现非线性失真。
解决办法:
- 限制输入电压范围,让电阻工作在线性区
- 使用线性度更好的电阻材料(如多晶硅电阻)
- 采用反馈补偿技术
4.5 补偿技术:把不完美的电路变完美
非理想因素不可避免,但我们可以补偿。
4.5.1 背景校准
在正常计算之前,先输入一组已知的测试向量,测量实际输出,计算出误差矩阵。然后在后续计算中减去这个误差。
我习惯在芯片上电时做一次背景校准,大约需要 100μs。之后每隔一段时间重新校准一次,应对温度漂移。
4.5.2 实时补偿
对于温度漂移这种缓慢变化,可以用片上温度传感器实时监测温度,查表修正权重。
我曾经设计过一个方案:在电阻阵列旁边放一个参考电阻,它的阻值变化反映了温度变化。用这个参考值去修正其他电阻的计算结果。效果不错,误差从 5% 降到了 0.5% 以内。
4.5.3 冗余与纠错
对于关键应用,可以加入冗余行或列。当某个电阻失效时,用冗余单元替代。这有点像存储器的冗余修复。
总结一下补偿策略:
| 非理想因素 | 补偿方法 | 实现复杂度 |
|---|---|---|
| 电阻失配 | 修调、校准 | 中 |
| 温度漂移 | 温度补偿、实时校准 | 中高 |
| 非线性 | 线性区限制、反馈补偿 | 低中 |
| 噪声 | 过采样、差分结构 | 中 |
说实话,模拟存算一体这条路不好走。非理想因素多,设计难度大。但一旦做好了,性能和能效比是数字方案没法比的。我做了这么多年芯片,越来越觉得:真正的创新,往往藏在那些「不完美」的物理世界里。
好,这一章就到这。记住一句话:模拟计算不是魔法,是物理。理解物理,你就能驾驭它。
想要更多资料,联系可可