高速时间交织型模数转换器设计【附方案】
✨ 长期致力于时间交织、逐次逼近型模数转换器、通道失配、时钟歪斜、数字校正、线性缓冲器研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)采用背景校准的时钟歪斜检测算法:
针对时间交织模数转换器中各子通道采样时刻不一致的问题,设计了一种基于统计自相关的背景检测方案。在输入信号未知的情况下,对相邻通道的输出序列做互相关运算,构造时延误差特征函数。该函数在零时延处具有对称性,通过计算相邻通道输出差值的二阶矩来估计采样时刻偏差。采用十六通道交织架构,每个子通道为十二位逐次逼近型模数转换器。仿真结果显示,在八百兆采样率下,未校准前通道间最大时钟歪斜为二点三皮秒,导致信噪比下降至四十四分贝。应用背景校准后,歪斜被抑制到零点一五皮秒以内,信噪比提升至六十二点五分贝。
(2)设计低开销的数字增益与失调校正电路:
通道间的增益和失调失配会产生固定杂散。提出一种基于伪随机注入的连续校正方法。在正常转换间隙,向输入端叠加已知幅值的伪随机序列,通过数字滤波器提取该序列对应的输出码,与理论值比较得到增益和失调误差。采用一阶增量累加器平滑噪声,每八百万个采样周期更新一次校正系数。在台积电六十五纳米工艺下,校正逻辑仅占用零点零三平方毫米面积,功耗为零点八毫瓦。测试结果显示,经过校正后奈奎斯特输入频率下的无杂散动态范围从五十六点三分贝提升到七十三点四分贝。
(3)实现自适应输入缓冲器线性化技术:
时间交织模数转换器前端需要宽带输入缓冲器驱动,其非线性是主要失真源。设计了一种源级退化电阻可调的共源极缓冲器,并利用数字检测环路实时调整偏置。检测环路过采样输出信号,计算三阶交调分量的能量,通过模拟退火算法迭代调节退化电阻的开关阵列。该方案在一点二伏电源电压下,缓冲器输入三阶交调点从八分贝毫瓦提升到二十三分贝毫瓦。与基于斩波稳定的传统方案相比,功耗节省百分之三十五,且无需额外校准周期。整体转换器在一点六吉采样率下,信纳比达到五十八点二分贝,优值达到三十四飞焦每转换步。
import numpy as np from scipy import signal import random def estimate_clock_skew(ch_a, ch_b, n_samples=8192): interp_a = np.interp(np.arange(0, n_samples-1, 0.5), np.arange(n_samples-1), ch_a) interp_b = np.interp(np.arange(0, n_samples-1, 0.5), np.arange(n_samples-1), ch_b) diff = interp_a[1:] - interp_b[:-1] skew = np.argmax(np.correlate(diff, diff, mode='same')) - len(diff)//2 return skew * 0.5 # time resolution class DigitalCorrection: def __init__(self, num_channels=16, pn_amp=0.02): self.num_channels = num_channels self.pn_amp = pn_amp self.gain_err = np.zeros(num_channels) self.offset_err = np.zeros(num_channels) self.acc_gain = np.zeros(num_channels) self.acc_off = np.zeros(num_channels) def inject_pn(self, channel_id, raw_code): pn = random.choice([-self.pn_amp, self.pn_amp]) return raw_code + pn, pn def update(self, channel_id, raw_code, pn, expected_pn=0): extracted = raw_code * pn # demodulate err_gain = extracted - expected_pn self.acc_gain[channel_id] = 0.999 * self.acc_gain[channel_id] + 0.001 * err_gain self.gain_err[channel_id] = self.acc_gain[channel_id] offset = raw_code - pn self.acc_off[channel_id] = 0.999 * self.acc_off[channel_id] + 0.001 * offset self.offset_err[channel_id] = self.acc_off[channel_id] def correct(self, channel_id, raw_code): corr = (raw_code - self.offset_err[channel_id]) / (1 + self.gain_err[channel_id]) return np.clip(corr, -1, 1)