嵌入式学习ing
分享一个具体的设计步骤和调试流程:
第一步:系统参数定义。明确输入数据速率(比如1 Gbps)、期望的环路带宽(比如2 MHz)、阻尼系数(0.707)、FPGA系统时钟(比如200 MHz)以及相位更新周期(每个符号更新一次?还是每个UI更新一次?)。
第二步:理论计算。使用离散化设计方法(如双线性变换)。将模拟二阶PLL的传递函数转换为数字域。计算得到Kp和Ki的浮点值。
第三步:定点化与位宽规划。这是硬件实现的核心。
- 相位误差E:根据鉴相器范围确定,比如有符号数,位宽设为10位。
- 系数Kp、Ki:用Qm.n格式。根据其动态范围选择。例如Kp=0.01,Ki=1e-5,可以用Q0.20(20位小数)。但为了节省资源,可以先放大为整数。例如,将Kp和Ki乘以2^16=65536,得到整数Kp_int、Ki_int。
- 乘法器:E Kp_int,结果为有符号数,位宽扩展为(10+16)=26位。然后右移16位得到比例路径输出P_out(可取其中10-16位有效位)。
- 积分器:累加器acc <= acc + E Ki_int。EKi_int结果位宽26位,累加器acc位宽要更宽,比如32位,并设置上下限(例如±2^28)。积分路径输出I_out可取acc的高16位(相当于右移16位后的值)。
- 最终频率控制字:F_word = P_out + I_out(注意小数点对齐)。
第四步:协同仿真验证。
- 在MATLAB/Simulink中建立行为级模型,包括信道、数据、理想鉴相、你设计的数字滤波器(用定点模块模拟)、NCO模型。验证环路锁定、跟踪和抖动性能。
- 将MATLAB计算出的测试向量(输入相位误差序列)导入到你的Verilog测试平台中,运行RTL仿真,比较RTL输出与MATLAB模型输出是否一致。
- 可以使用System Generator或HDL Coder进行更紧密的协同仿真。
第五步:板上调试。
- 综合实现后,利用FPGA的在线逻辑分析仪(如Xilinx的ILA)抓取关键信号:相位误差E、频率控制字F_word、恢复时钟。
- 将抓取的数据导出到MATLAB,分析时域波形和频谱,评估实际环路带宽和阻尼特性。
- 如果性能不达标,通过JTAG/UART动态调整系数寄存器,实时观察锁定情况,找到最优值。
注意事项:
- 更新周期T必须准确。如果是从异步数据流中恢复,可能每个有效数据位才更新一次相位误差,T就是数据位周期的整数倍。
- 初始频率偏移不能太大,否则可能无法捕获。可以考虑加入频率牵引电路或初始频率预设。
- 资源允许的话,可以考虑使用更高阶的环路滤波器来改善带外噪声抑制,但设计和稳定性更复杂。
