016、像素内ADC与列并行ADC读出架构对帧率与噪声的影响去年在调试一款车规级全局快门传感器时我遇到过一个让人抓狂的问题帧率标称120fps实际跑到90fps就开始出现行噪声条纹而且暗电流噪声比datasheet标称值高了将近一倍。当时团队里有人怀疑是电源纹波有人怀疑是温度补偿没做好折腾了两周最后发现罪魁祸首是读出架构的时序冲突——列并行ADC的采样窗口和像素复位窗口在高速模式下发生了重叠。这件事让我重新翻出了十年前做手机CMOS时的笔记把像素内ADC和列并行ADC的底层差异又捋了一遍。两种读出架构的本质差异先别急着看框图我们从信号路径的角度来理解。像素内ADC顾名思义每个像素单元里都塞了一个完整的模数转换器。这意味着光生电荷在像素内部就直接被量化成了数字码然后通过数字总线逐行或逐列读出。这种架构最直观的好处是读出速度几乎不受像素阵列规模限制。你想象一下一个2000万像素的传感器如果每个像素都在本地完成了转换那么读出过程就变成了数字信号的并行传输理论上帧率可以做到非常高。但代价是什么像素面积。每个像素里除了光电二极管、传输管、复位管、源跟随器还要塞进一个比较器、一个斜坡发生器或者逐次逼近寄存器、甚至一个计数器。在0.11μm工艺节点下一个像素内ADC的像素尺寸很难做到2μm以下。这就意味着同样的光学格式下像素内ADC传感器的分辨率做不高或者像素感光面积被压缩得很厉害导致满阱容量和动态范围受限。列并行ADC则是另一种思路像素阵列仍然保持传统的3T或4T有源像素结构每个像素只输出模拟电压。在像素阵列的下方每一列或者每两列共享放置一个ADC。读出时整行像素的模拟信号同时被采样到列级的采样保持电容上然后列ADC开始逐行转换。这种架构的像素尺寸可以做到很小1.0μm甚至更小都不是问题因为像素里不需要放转换电路。但是列并行ADC的帧率天花板在哪里在于“逐行转换”这个动作。假设一列有4000行像素每行转换时间需要1μs那么一帧的读出时间至少是4ms对应帧率250fps。听起来还不错别急这只是理想情况。实际中列ADC的转换时间受到列总线寄生电容、比较器建立时间、斜坡发生器精度等多重因素制约。更关键的是列并行ADC的噪声特性与像素内ADC有本质区别。噪声的源头在哪里像素内ADC的噪声主要来自两个地方像素本身的读出噪声包括复位噪声、1/f噪声、散粒噪声和ADC本身的量化噪声。但由于转换发生在像素内部模拟信号路径极短几乎没有列总线上的串扰和耦合噪声。而且像素内ADC通常采用多次采样或相关双采样CDS技术可以在像素内部就完成复位噪声的消除。我调试过一款索尼的堆叠式全局快门传感器采用像素内ADC架构暗场噪声能做到1.2e-以下这在列并行ADC架构里几乎不可能实现。列并行ADC的噪声问题就复杂多了。首先模拟信号要从像素经过源跟随器、列总线、采样保持电路再到列ADC的输入端。这条路径上寄生电容、漏电流、电源噪声、衬底噪声都会耦合进来。更麻烦的是列ADC之间的一致性。同一颗传感器上1024列ADC的增益、偏置、线性度不可能完全一致这就产生了列固定模式噪声Column FPN。这种噪声在低照度下尤其明显表现为垂直方向的条纹。我踩过一个坑某款安防监控传感器在30fps下画质很好一调到60fps画面左侧就出现周期性竖条纹。查了三天发现是列ADC的参考电压缓冲器在高速切换时负载变化导致参考电压出现周期性波动。列ADC的参考电压是共享的当所有列ADC同时开始转换时瞬间电流冲击会让参考电压产生毛刺。这个问题的根源在于列并行ADC的“同时性”——所有列ADC在同一时刻开始转换但每个列的转换进度不同导致负载电流呈现复杂的时变特性。帧率与噪声的博弈像素内ADC的帧率优势在高速场景下非常明显。比如工业视觉中的高速检测需要1000fps以上的帧率像素内ADC几乎是唯一选择。但代价是动态范围受限。因为像素内ADC的满阱容量受限于像素面积而列并行ADC可以通过大像素比如5μm以上获得很高的满阱容量从而在低帧率下实现极低的读出噪声和极高的动态范围。这里有一个容易被忽略的细节像素内ADC的帧率提升并不线性增加噪声。因为每个像素独立转换转换时间可以随帧率需求动态调整。但列并行ADC不同帧率提升意味着每行可用的转换时间缩短这直接导致列ADC的带宽需要增加而带宽增加会引入更多热噪声。更糟糕的是为了在更短时间内完成转换列ADC的量化步长可能被迫增大导致量化噪声上升。我在车载影像项目中做过一个对比测试同一颗传感器分别配置为像素内ADC模式和列并行ADC模式通过寄存器切换。在60fps下两种模式的信噪比相差不到1dB。但到了240fps像素内ADC模式的SNR只下降了2dB而列并行ADC模式下降了6dB而且出现了明显的列噪声。这个结果让团队决定在高速模式下强制使用像素内ADC虽然分辨率从12MP降到了8MP。实际调试中的陷阱如果你正在调试一款列并行ADC的传感器有几个地方要特别留意。第一列ADC的采样时序。别相信datasheet上给的典型值一定要在极限温度下验证采样保持的建立时间。我遇到过一款传感器在-20℃下采样建立时间比25℃时长了30%导致高速模式下出现行方向上的亮度渐变。解决方案是增加采样窗口的裕量但代价是帧率下降。这里有个经验值采样窗口至少留出1.5倍的理论建立时间别为了追求那几fps的帧率把噪声搞崩了。第二列ADC的校准。列FPN的校准通常是在暗场下采集一帧然后存储每列的偏置值在后续帧中减去。但这个方法在温度变化时失效。因为列ADC的偏置随温度漂移而且每列的漂移系数不同。我见过一个产线案例传感器在25℃下校准后到60℃环境下工作列FPN从0.3%跳到了1.2%。解决方案是加入温度传感器根据温度查表动态调整校准系数。别这样写死校准值除非你的产品只在一个温度点工作。第三像素内ADC的电源去耦。像素内ADC对电源噪声极其敏感因为每个像素的ADC都在同一时刻进行转换电源上的任何纹波都会同时影响所有像素。我调试过一款手机传感器在开启闪光灯时画面出现网格状噪声原因是闪光灯驱动电路的开关噪声耦合到了像素的ADC电源上。解决方案是在像素阵列周围加一圈去耦电容并且把ADC电源和像素电源分开走线。这里踩过坑去耦电容的ESR和ESL要选对普通MLCC在高频下表现很差要用低ESL的倒装电容。架构选择的实战建议别被厂商的datasheet参数迷惑。像素内ADC的“低噪声”是在特定条件下测出来的通常是低帧率、中等照度、25℃环境。一旦你把它推到高帧率或者高温环境噪声特性会显著恶化。同样列并行ADC的“高帧率”也是理论值实际中受限于列ADC的建立时间和校准精度很难达到标称值。我的经验法则是如果应用需要超过200fps的帧率优先考虑像素内ADC架构哪怕牺牲一些分辨率和动态范围。如果应用需要高动态范围80dB或者大像素3μm列并行ADC更合适。对于手机影像这种既要高分辨率又要高帧率的场景现在的主流方案是混合架构——部分像素采用内ADC用于高速对焦或HDR其余像素采用列ADC用于主成像。最后说一个容易被忽视的点读出架构的选择会影响整个系统的功耗分布。像素内ADC的功耗集中在像素阵列内部散热困难容易导致热像素和暗电流上升。列并行ADC的功耗集中在传感器底部可以通过散热片或PCB铜皮有效导出。在车载影像这种高温环境下列并行ADC的散热优势非常明显哪怕噪声差一点也比热像素导致的坏点要好处理。调试传感器就像调音没有完美的架构只有适合场景的妥协。下次遇到帧率上不去或者噪声降不下来先别急着换传感器把读出架构的时序图打开一行一行地看采样窗口和复位窗口有没有打架。很多时候问题就出在那几个微秒的重叠上。