简易锁相环,输入频率20MHz,输出800MHz,锁定时间1us,相位噪声-111dB@10MHz,功耗1.5mW。 采用smic130mmrf工艺,附工艺完整pdk。 整体电路包含鉴频鉴相器,电荷泵,环路滤波器,压控振荡器,预分频器和可编程分频器,锁定检测电路。 附带锁相环相关论文和教材,以及基于MATLAB的锁相环相位噪声融合方法和教程。
这个800MHz锁相环项目用smic130mmrf工艺实现挺有意思的,咱们直接拆解核心模块来说说实战经验。整个环路最烧脑的当属压控振荡器(VCO),毕竟要把20MHz怼到800MHz。工艺库里提供的变容二极管模型特别关键,这里直接调用工艺参数定义调谐曲线:
// 环形振荡器拓扑 varactor_cell XVAR ( .ctrl(vtune), .n(n1), .p(p1) ); inductor L1 ( .pos(n1), .neg(p1) ) l=120n w=5u;实测发现当控制电压在0.6V-1.2V之间线性度最好,这时候振荡频率刚好覆盖750-850MHz窗口。这里有个坑——工艺偏差会让实际频率偏移10%左右,得在MATLAB里做蒙特卡洛仿真校准。
电荷泵的电流匹配直接影响杂散,用互补电流镜结构时特别要注意版图对称性。代码里设置充放电电流为80uA是个平衡点:
% 电荷泵电流优化 for Icp = 50:10:100 phase_noise = calc_noise(Icp, Kvco, N); if phase_noise < -110 break; end end disp(['最优电流值:', num2str(Icp), 'uA']);环路滤波器用三阶无源结构,电容值别抠搜。有个骚操作是在MATLAB里直接用阻抗变换计算元件值:
omega = 2*pi*1e6; % 1MHz带宽 C1 = (Kvco*Icp)/(N*omega^2); R2 = 2*zeta/(omega*C1); % 输出实际用120fF+20kΩ组合分频器链最怕时序错乱,预分频器用源极耦合逻辑(SCL)结构扛高频。可编程分频器部分用Verilog写个吞脉冲计数器,注意门控时钟的处理:
always @(posedge clk_div8) begin if (reset) count <= 0; else count <= (count == N-1) ? 0 : count + 1; end锁定检测用了个土法子——连续8个周期误差小于1ns就亮灯。实测发现有时候会误触发,后来加了个迟滞比较器才稳定下来。
相位噪声融合这块,把各模块的噪声传递函数在MATLAB里拼起来跑仿真。关键是要注意VCO噪声在带外的主导地位:
L_total = 10*log10(10.^(L_pfd/10) + 10.^(L_vco/10)); plot(offset, L_total,'LineWidth',2); title('合成相位噪声曲线');最后流片测试时功耗卡在1.6mW,比预期高了0.1mW。查了半天发现是电荷泵的开关管尺寸太大导致寄生电容超标,改小W/L比例后刚好达标。这个案例说明,锁相环设计就是不断在性能参数之间走钢丝的过程。