异步SAR simulink模型(和virtuoso电路模型很像,精度自己可以改)。 做MATLAB仿真,包括zoom或者其他混合架构adc可以用到这个模型。
在玩ADC设计的时候,异步SAR结构就像个宝藏男孩——速度快还省电,但要把行为级模型建得真实好用可不容易。最近折腾了个Simulink异步SAR模型,比传统Matlab脚本灵活得多,特别是需要做混合架构(比如Zoom ADC)的时候,这种模块化建模的优势就出来了。
先看核心模块——异步状态机。这里直接用了Matlab Function块写了个鬼畜版状态流转逻辑:
function ctrl = async_FSM(clk, cmp_result) persistent state; if isempty(state) state = uint8(0); % 0:采样 1:逐次逼近 end if clk switch state case 0 ctrl = 'sample'; state = 1; case 1 if cmp_result ~= 0 ctrl = 'shift'; else ctrl = 'hold'; end end end end这个状态机的精髓在于不依赖固定时钟周期,每次比较器结果(cmp_result)一出来就立即触发动作。注意第9行的clk信号其实是外部事件驱动,模拟实际电路中的异步就绪信号。
DAC模块的实现更有意思。为了支持精度调整,专门做了个参数化电容阵列模型:
classdef VarDAC < matlab.System properties bit_depth = 8; % 可自定义精度 C_unit = 1e-15; % 单位电容 end methods function y = step(obj, code) weights = 2.^(0:obj.bit_depth-1); total_C = sum(weights) * obj.C_unit; y = sum(code .* weights)/total_C * Vref; % 模拟电荷分配 end end end重点在bitdepth参数——做Zoom ADC时可能需要12bit模式的SAR子模块,这时候不用改结构,直接把bitdepth从8调到12就能验证架构可行性。
仿真时最抓狂的是时序对齐问题。异步SAR的每个bit转换时间不固定,这里用Simulink的Triggered Subsystem实现动态调度:
- 比较器输出触发T延迟模块
- 延迟时间取自当前bit位置的查找表(模拟DAC建立时间)
- 触发信号连到控制状态机的使能端
这种骚操作完美复现了实际电路中的"完成-触发"机制。测试时发现当DAC建立时间设置为非线性分布(比如高位比低位多50%延迟)时,系统依然稳定工作,说明模型对非理想因素兼容性不错。
最后来个实战场景:在Zoom ADC里调用这个SAR模块。需要把模型封装成Simulink Component,通过configSet动态修改SAR的精度参数。比如当Delta-Sigma调制器检测到高频信号时,自动把SAR精度从10bit切换到8bit,这时候模型里的DAC权重会实时重新计算,整个过程不需要停止仿真——这对验证架构适应性简直不要太方便。
这个模型的彩蛋是埋了个噪声注入端口,可以直接在比较器输入端加随机抖动。曾经用它发现了某个工艺角下会出现误码突增,后来在流片前加了冗余比较电路避坑。所以说,行为级模型玩得够溜,真的能救命。