BB-World

基于Zynq等精度测量的100M频率计连载篇(二)--频率测量

0
阅读(67) 评论(1)


        测频原理如图3.1所示,在被测信号频率较低时,通常设置较长的闸门时间,当被测信号频率提高时,只要适当提高标准信号的频率,就能实现宽频域测量。

 image.png

图3.1等精度测量原理

        设在闸门时间t1内对标准信号和被测信号的计数值分别为为N_0和N_1,标准信号频率为f_0,则被测信号频率和周期

f_x=f_0*N_1/N_0  (1)

T_x=1/f_x    (2)

        被测信号频率的相对误差只与实际闸门时间和标准信号的频率有关,随着闸门时间和标准频率的增大,相对误差就减少。为了提高测量范围,应使闸门时间较长,标准信号频率较高。因此设置闸门时间t1为1s,标准信号为FPGA提供的250Mhz时钟信号。

电路设计和仿真验证     

        等精度测频模块实现方法可以简化如图3.2所示框图。计数器1和计数器2分别为标准时钟计数器和被测信号时钟计数器,当闸门信号为高电平时开始计数,每个Clk信号上升沿计数一次,当闸门信号为低电平时停止计数,分别得到计数值T_cnt和S_cnt,通过乘法器和除法器运算逻辑单元,由公式(1)可得到被测信号频率。

image.png

 图3.2等精度测频功能电路实现方法

        核心代码就是两个计数器在不断的计数

//标准时钟计数
always@(posedge clk or negedge rst_n)
if(!rst_n)
S_cnt <= 32'd0;
else if(Tpr)
S_cnt <= S_cnt + 1'b1;
else if(Tpr_nedge_rr)
S_cnt <= 1'b0;
//测试信号计数
always@(posedge clk or negedge rst_n)
if(!rst_n)
T_cnt <= 32'd0;
else if(Tpr & Fre0_in_podge)
T_cnt <= T_cnt + 1'b1;
else if(Tpr_nedge_rr)
T_cnt <= 1'b0;


        仿真激励文件中设置输入信号,标准时钟频率Clk为100MHz,被测信号Fre0_in为10MHz,闸门信号Tpr高电平延长一段时间后置为低电平,得到如图3.3所示波形。可以看出计数器S_cnt在闸门信号Tpr为高电平且时钟信号Clk的上升沿开始计数,同时计数器T_cnt在闸门信号Tpr为高电平且被测信号Fre0_in的上升沿开始计数,闸门信号Tpr为低电平时都停止计数,接着得到被测信号测量频率Fre_out为10Mhz,即仿真通过。

image.png

        其他测试频率通过改变激励文件中的注释即可,附件里给出了详细的代码和仿真激励文件,有问题的可以留言


源代码

fre.zip


  1. 感谢分享~~