4. 读出电路架构概述:像素级、列级、全局读出与数字/模拟SPAD对比
各位同学,今天我们聊聊读出电路的整体架构。说实话,这部分内容在SPAD阵列设计中非常关键,它直接决定了你的芯片面积、功耗、速度,甚至最终能做成什么级别的产品。我在几个项目中踩过不少坑,今天把这些经验分享给你们。
4.1 读出架构的三种基本类型
SPAD阵列的读出架构,说白了就是怎么把每个像素里那个雪崩信号给“捞”出来。根据信号处理的位置不同,主要分三种:像素级读出、列级读出和全局读出。
核心区别:处理电路放在哪?像素内、列上、还是阵列外?
4.1.1 像素级读出
每个像素里不仅有SPAD,还集成了完整的淬灭、整形、甚至计数或TDC电路。这种架构的优点是速度极快,每个像素独立工作,互不干扰。我记得在做一个高时间分辨率的激光雷达项目时,就用了像素级TDC,每个像素都能达到几十皮秒的精度。
但代价也很明显——面积大、填充因子低。你想想看,一个像素里塞那么多晶体管,感光区域自然就被挤占了。我曾经做过一个128×128的阵列,像素级读出后,填充因子只有不到5%,光利用率极低。
- 优点:速度快、并行度高、时间分辨率好
- 缺点:像素面积大、填充因子低、功耗高
- 适用场景:小阵列、高时间精度应用(如荧光寿命成像)
4.1.2 列级读出
这种架构把读出电路放在列上,每个像素只做简单的缓冲或整形,然后通过列总线共享处理单元。嗯,这里要注意,列级读出是面积和性能的折中方案,也是目前工业界最常用的架构。
我在一个64×64的SPAD阵列项目中就采用了列级读出。每个像素只放一个简单的淬灭电路和缓冲器,列上放一个共享的TDC。这样填充因子能做到15%左右,时间分辨率也能保持在100ps以内。说白了,就是“鱼和熊掌”都想要一点。
我的经验:列级读出设计时,一定要考虑列间的匹配问题。我曾经因为列放大器失配,导致整列像素的阈值电压偏差很大,最后不得不加了一路DAC做列级校准。
- 优点:面积适中、填充因子较高、功耗可控
- 缺点:列间串扰、读出速度受限于列总线
- 适用场景:中等规模阵列、通用型SPAD传感器
4.1.3 全局读出
全局读出架构最简单——所有像素的雪崩信号通过一根或几根全局总线传输,在芯片外部或边缘统一处理。这种架构的填充因子最高,因为像素里几乎不放任何电路。
但问题也很突出:速度慢、容易冲突。你想想看,如果几百个像素同时发生雪崩,全局总线怎么区分是哪个像素触发的?所以全局读出通常只用于光子计数模式,或者配合事件驱动读出。
我记得早期做的一个256×1的线阵SPAD,就用了全局读出。每个像素只输出一个脉冲,通过时间门控来区分不同像素。虽然简单,但动态范围受限,后来还是改成了列级读出。
- 优点:填充因子极高、设计简单、面积小
- 缺点:无法区分像素位置、速度慢、易冲突
- 适用场景:大阵列、低帧率、光子计数模式
4.2 数字SPAD与模拟SPAD读出架构对比
这个对比很有意思。数字SPAD和模拟SPAD,其实不是SPAD本身不同,而是读出信号的处理方式不同。
4.2.1 数字SPAD读出架构
数字SPAD,说白了就是每个像素输出一个数字脉冲(0或1),然后通过数字电路进行计数、时间测量或直方图统计。这种架构的优点是抗噪声能力强、易于集成数字处理。
我在一个3D堆叠的项目中,就用了数字SPAD读出。底层是SPAD阵列,顶层是数字处理电路,通过微凸点互联。每个像素输出一个数字信号,直接在顶层做TDC和直方图。效果很好,但功耗也不小——数字电路翻转时,动态功耗很可观。
数字SPAD的关键:每个像素需要至少一个比较器或施密特触发器,将雪崩电流整形为数字脉冲。
4.2.2 模拟SPAD读出架构
模拟SPAD则不同,它输出的是模拟信号——比如雪崩电流的大小、持续时间,或者通过模拟积分器累积的光子数。这种架构的优点是动态范围大、功耗低,但抗噪声能力相对弱一些。
我曾经做过一个模拟SPAD读出方案,每个像素用一个电容积分,然后通过列级ADC读出。这样填充因子能做到20%以上,而且动态范围比数字方案大一个数量级。但问题也很明显——模拟信号容易受工艺偏差影响,每个像素的积分电容、漏电流都不一样,需要做校准。
注意:模拟SPAD读出对温度非常敏感。我在一个项目中没做好温度补偿,结果芯片从25°C升到85°C时,读出信号漂移了30%以上。后来不得不加了片上温度传感器和校准算法。
4.3 架构对比总结
为了让大家看得更清楚,我整理了一个对比表格:
| 特性 | 像素级读出 | 列级读出 | 全局读出 |
|---|---|---|---|
| 填充因子 | 低(<5%) | 中(10-20%) | 高(>30%) |
| 时间分辨率 | 高(<50ps) | 中(50-200ps) | 低(>1ns) |
| 像素面积 | 大 | 中 | 小 |
| 功耗 | 高 | 中 | 低 |
| 设计复杂度 | 高 | 中 | 低 |
| 适用阵列规模 | 小(<32×32) | 中(64×64~256×256) | 大(>512×512) |
至于数字SPAD和模拟SPAD的对比,我个人的看法是:没有绝对的好坏,只有合不合适。数字SPAD适合需要高时间精度、数字处理能力强的场景;模拟SPAD适合需要大动态范围、低功耗的场景。
4.4 架构选择的经验法则
说了这么多,到底怎么选?我给大家几个实用的建议:
- 先看阵列规模:32×32以下,可以考虑像素级读出;64×64到256×256,列级读出最稳妥;512×512以上,全局读出或事件驱动读出更现实。
- 再看时间精度需求:需要亚纳秒级精度?像素级或列级TDC是必须的。只做光子计数?全局读出就够了。
- 别忘了功耗预算:数字SPAD的功耗主要来自数字电路翻转,模拟SPAD的功耗主要来自偏置和ADC。我建议在项目初期就做功耗估算,别等到流片了才发现散热搞不定。
- 工艺兼容性:有些工艺对模拟电路不友好,比如纯数字CMOS工艺。这种情况下,数字SPAD方案更合适。
一个小技巧:如果你不确定选哪种架构,可以先做一个小的测试芯片(比如8×8阵列),把几种架构都放上去。我每次做新项目都会这么干,花不了多少钱,但能避免很多坑。
4.5 本章小结
好了,这一章的内容就到这里。我们讲了三种读出架构——像素级、列级、全局读出,也对比了数字SPAD和模拟SPAD的差异。说白了,架构选择就是面积、速度、功耗、填充因子之间的权衡。没有完美的架构,只有最适合你应用需求的方案。
下一章我们会深入像素级读出电路的设计细节,包括淬灭电路、整形电路和像素内TDC的实现。到时候我会拿一个实际项目中的电路图来讲解,大家敬请期待。