一、模块功能概述NCO(数控振荡器)在Gardner定时同步环中承担两个任务:产生插值使能信号o_sels,告诉内插器何时进行一次插值;同时输出分数间隔o_uk,告诉内插器插值点位于哪两个采样点之间。这两个信号缺一不可,内插器拿到o_sels才知道动作,拿到o_uk才知道怎么插。模块接口如下:端口方向位宽说明i_clkinput1系统时钟i_rstinput1异步复位i_wkinput16频率控制字,来自环路滤波器o_selsoutput1插值使能脉冲o_ukoutput16分数间隔,Q14格式o_resetoutput1符号周期脉冲二、参数与定点格式parameter P_Q0 = 16'd14745; // 0.9*2^14 parameter P_OFFSET = 16'd16384; // 2^14 parameter P_THRESHOLD = 16'd50;采用Q14定点格式,P_OFFSET = 16384对应数值1.0。P_Q0是相位寄存器复位值,设为0.9使启动后很快产生第一个插值脉冲,不用等太久。P_THRESHOLD = 50对应约0.003,用于检测uk是否接近零值。三、相位累加器设计assign w_wtmps = r_q_0 - i_wk; assign w_cond = (r_q_0 i_wk); assign w_next_q = w_cond ? w_wtmps : (P_OFFSET + w_wtmps);相位寄存器r_q_0在每个时钟周期减去i_wk,这是递减累加器。判断r_q_0 i_wk:成立说明没有跨过零点,直接相减;不成立说明减完会小于0,需要加上P_OFFSET做回绕,保持相位在[0, 1)区间。w_cond同时作为插值使能的原始信号——相位回绕意味着NCO溢出了,此时应该输出一个插值点。assign w_next_sels = w_cond;w_next_sels的值正是w_cond,打一拍输出为o_sels。四、分数间隔uk的计算assign w_next_uk = w_cond ? ro_o_uk : (2 * r_q_0);uk的计算是这里最需要注意的地方。正常情况下uk保持不变(