zoukankan      html  css  js  c++  java
  • 【My Project】数字频率测量FPGA实现

    注:以前在**负责激光测速频率信号采集相关研究,今日整理资料时看到,近乎遗忘,共享了~

    -------------------------------------------------------------------------------------------------------------------------------

    数字频率测量FPGA实现

    SkySeraph May 24th 2010  HQU

    Email:zgzhaobo@gmail.com    QQ:452728574

    Latest Modified Date:May 24th 2010 HQU

    -------------------------------------------------------------------------------------------------------------------------------

    一    工具:Alter Quartus

           语言:VerilogHDL

      

    -------------------------------------------------------------------------------------------------------------------------------二   相关原理

    1  常用的测频方法[1]

    ①  利用电路的某种频率响应特性来测量频率,如谐振测频法[低频测量,应用较广]、电桥测频法[高频、微波段测量]

    ②  利用标准频率与测频进行比较来测量,精度取决于标准频率的准确度,如拍频法[低频]、示波器法[低频]、差频法[高频]

    ③  电子计数测频法[适用于用数字电路实现]:直接测频法[测周期法和测频率法]和等精度测频法

    2  频率测量的常用方法

    直接测频法

    原理:在一个单位时间t里计数被测信号的上升沿/下降沿的个数N。如t=1s,则被测信号频率为N Hz

    优点:过程简单,计算量少,计数的结果就是被测信号的频率

    缺点:单位时间t的精确影响测量误差;计数个数存在±1的误差,其对低频影响较大,对高频影响较小。

    缺点:整个测频范围内的测频精度是不同的。如闸门时间是1s时,测量100MHz的信号可达到10-8的测量精度,但测量10Hz的信号只能达到10-1的测量精度。[3]

    适用存在正负1误差,适合于高频

    周期测频法

    原理:测量被测信号连续两个上升沿/下降沿之间的时间间隔t,再求t的倒数。

    在被测信号的一个周期里,计数标准信号的个数NN*t(t为标准信号周期)即为被测信号的周期,1/N*t即为频率

    优点:测量时间快,最短只需被测信号的一个周期

    缺点:需要求倒数/除法运算,存在误差;计数时间间隔存在±1的误差;这些误差对低频影响小,对高频影响大;当被测信号频率大于标准信号时,这种方法几乎不可以用

    适用:适用于低频,当被测信号大于标准信号时,不适用

    等精度测频法

    原理:对时间闸门信号用被测信号进行同步,达到减少正负1的误差。对低频信号尤其有效。

    计算:标准时钟计数结果为Nt,频率为Fs,单位为Hz,则被测频率Ft = Fs*(Nt/Ns)

    优点在低频阶段比直接测频法有所改进,在测量频率比标准频率高时,精度不会提高

    3  等精度测频法原理

     等精度测频方法是在直接测频方法的基础上发展起来的。如图1所示,它的闸门时间不是固定的值,而是被测信号周期的整数倍,即与被测信号同步,其实现方式可用图2来说明。图中,预置门控信号是为Tpr 的一个脉冲,CNT1和CNT2是两个可控计数器。标准频率信号从CNT1的时钟输入端CLK输入,其频率为fs 。经整形后的被测信号(频率为fx)从CNT2的时钟输入端CLK输入,当预置门信号为高电平(预置时间开始)时,被测信号的上升沿通过D触发器的Q端同时启动计数器CNT1和CNT2计数。CNT1和CNT2分别对被测信号(频率为fx)和标准频率信号(频率为fs)同时记数。同样,当预置门信号为低电平(预置时间结束)时,随后而至的被测信号的上升沿通过D触发器的输出端,同时关闭计数器的计数。设在一次预置门时间Tpr中计数器对被测信号的计数值为Nx,对标准信号的计数值为Ns。则下式成立:

     

    由此可推得:

     

    等精度测频法具有三个特点:

    (1)相对测量误差与被测频率的高低无关;

    (2)增大Tpr或fs可以增大Ns,减少测量误差,提高测量精度;

    (3)测量精度与预置门和标准频率有关,与被测信号的频率无关,在预置门和常规测频闸门时间相同而被测信号频率不同的情况下,等精度测量法的测量精度不变。

    一种实现过程[7]

    ①  预设闸门模块:由标准时钟产生预设闸门信号。如标准时钟100us[10kHz],计数1000次,产生预设闸门信号为100ms

    ②  实际闸门模块:用被测信号来同步预设闸门模块产生的闸门信号来产生新的实际闸门信号,本质是一个D触发器

    ③  计数模块:在实际闸门信号有效时,标准时钟和被测信号同时计数,在闸门信号结束时输出计数结果

    ④  频率计算模块:由公式进行乘法和除法运算

    直接计数测频法

    测频法原理:在确定的闸门时间Tw内,记录被测信号的变化周期数或脉冲个数Nx,有fx=Nx/Tw  [1]

    测周期法原理:需要有标准信号频率fs,在待测信号的一个周期时间Tx内,记录标准频率的周期数Ns,有fx=fs/Ns [1]

    最高测量频率为标准信号频率[个人总结]。

    测量误差:两种方法都会产生±1个字的误差。最大误差为1/N,N为周期个数。[1]

    直接计数测频法缺点:整个测频范围内的测频精度是不同的。如闸门时间是1s时,测量100MHz的信号可达到10-8的测量精度,但测量10Hz的信号只能达到10-1的测量精度。[3]

    参考信号:测频法需要得到一个标准的脉宽,测周期法需要一个标准时钟。实际上标准的脉宽必须从一个标准时钟分频得到,而一般,标准始终是从外部晶振分频得到。[1]

    测量时间:当计数周期为106个时,计数时间为1s[个人总结]

    -------------------------------------------------------------------------------------------------------------------------------------------------

    三 实现

    除法运算的Verilog实现(累加比较法)

    View Code
    1 module mydiv(clk, dataa, datab, start, datac);
    2  input clk;
    3 input [7:0] dataa;//被除数
    4 input [7:0] datab;//除数
    5 input start;//开始新的运算
    6 output [7:0] datac;//
    7
    8 reg [7:0] datac;
    9 reg [7:0] cbuf;
    10 reg [7:0] temp;
    11
    12 always @(posedge clk)
    13 begin
    14 if(1'b1 == start)
    15 begin
    16 temp <= 8'd0;
    17 cbuf <= 8'd0;
    18 end
    19 else if (dataa > temp)
    20 begin
    21 temp <= temp + datab;
    22 cbuf <= cbuf + 8'h01;
    23 end
    24 else
    25 begin
    26 datac <= cbuf;
    27 end
    28 end
    29
    30 Endmodule

    直接测频法

    View Code
    1 闸门产生模块/gateout输出1s,clk设为1ms
    2 module gate(clk, gateout);
    3 input clk;
    4 output gateout;
    5
    6 reg [9:0] cnt;
    7 reg gatebuf;
    8
    9 assign gateout = gatebuf;
    10
    11 always @(posedge clk)
    12 begin
    13 if (10'd999 == cnt)
    14 begin
    15 cnt <= 10'd0;
    16 gatebuf <= ~gatebuf; //产生1s闸门
    17 end
    18 else
    19 begin
    20 cnt <= cnt + 10'd1;
    21 end
    22 end
    23
    24 endmodule
    25
    26 计数模块
    27 说明:闸门信号高有效下进行计数,当闸门信号为低时停止计数并输出计数结果。采用5位十进制计数
    28 module cnt(clk, gate, done, dtwo, dthree, dfour, dfive);
    29 input clk;
    30 input gate;
    31 output done;//个位
    32 output dtwo;//十位
    33 output dthree;//百位
    34 output dfour;//千位
    35 output dfive;//万位
    36
    37 reg [3:0] done, dtwo, dthree, dfour, dfive;
    38 reg [3:0] ddone, ddtwo, ddthree, ddfour, ddfive;
    39 reg gatebuf;
    40
    41 always @(posedge clk)
    42 begin
    43 gatebuf <= gate;
    44 end
    45
    46 always @(posedge clk)
    47 begin
    48 if((gatebuf == 1'b0) && (gate == 1'b1))
    49 begin
    50 ddone <= 4'd1;
    51 ddtwo <= 4'd0;
    52 ddthree <= 4'd0;
    53 ddfour <= 4'd0;
    54 ddfive <= 4'd0;
    55 end
    56 else if((gatebuf == 1'b1) && (gate == 1'b0))
    57 begin
    58 done <= ddone;
    59 dtwo <= ddtwo;
    60 dthree <= ddthree;
    61 dfour <= ddfour;
    62 dfive <= ddfive;
    63 end
    64 else if(gate == 1'b1)
    65 begin
    66 if (ddone == 4'd9)
    67 begin
    68 ddone <= 4'd0;
    69 if (ddtwo == 4'd9)
    70 begin
    71 ddtwo <= 4'd0;
    72 if (ddthree == 4'd9)
    73 begin
    74 ddthree <= 4'd0;
    75 if (ddfour == 4'd9)
    76 begin
    77 ddfour <= 4'd0;
    78 if (ddfive == 4'd9)
    79 begin
    80 ddfive <= 0;
    81 end
    82 else
    83 begin
    84 ddfive <= ddfive + 4'd1;
    85 end
    86 end
    87 else
    88 begin
    89 ddfour <= ddfour + 4'd1;
    90 end
    91 end
    92 else
    93 begin
    94 ddthree <= ddthree + 4'd1;
    95 end
    96 end
    97 else
    98 begin
    99 ddtwo <= ddtwo + 4'd1;
    100 end
    101 end
    102 else
    103 begin
    104 ddone <= ddone + 4'd1;
    105 end
    106 end
    107 end
    108
    109 endmodule

    周期测频法

    View Code
    1 计数模块
    2 module periodcnt(clk, clkt, cntout,cntok);
    3 input clk;//标准时钟信号
    4 input clkt;//被测信号
    5
    6 output [19:0] cntout;//计数结果输出
    7 output cntok;//计数结果输出标志
    8
    9 reg [19:0] cntout, cnt;
    10 reg cntok, clktbuf;
    11
    12 always @(posedge clk)
    13 begin
    14 clktbuf <= clkt;
    15 end
    16
    17 always @(posedge clk)
    18 begin
    19 if((clkt == 1'b1) && (clktbuf == 1'b0))//在被测信号上升沿输出计数结果并置计数为1
    20 begin
    21 cntout <= cnt;
    22 cnt <= 20'd1;
    23 cntok <= 1'b1;
    24 end
    25 else
    26 begin
    27 cnt <= cnt + 20'd1;
    28 cntok <= 1'b0;
    29 end
    30 end
    31 endmodule
    32
    33 除法运算模块
    34 module perioddiv(clk, datab, start, datac);
    35 input clk;
    36 input [19:0] datab;
    37 input start;
    38 output [19:0] datac;
    39
    40 reg [19:0] dataa,datac, databbuf;
    41 reg [19:0] cbuf;
    42 reg [19:0] temp;
    43 reg finish, cntflag;
    44
    45 always @(posedge clk)
    46 begin
    47 if((1'b1 == start) && (finish == 1'b0) && (datab != 20'd0))
    48 begin
    49 dataa <= 1000000;
    50 temp <= datab;
    51 cbuf <= 20'd1;
    52 databbuf <= datab;
    53 cntflag <= 1'b1;
    54 end
    55 else if ((dataa > temp) && (cntflag == 1'b1) )
    56 begin
    57 temp <= temp + databbuf;
    58 cbuf <= cbuf + 20'd1;
    59 finish <= 1'b1;
    60 end
    61 else
    62 begin
    63 datac <= cbuf;
    64 finish <= 1'b0;
    65 cntflag <= 1'b0;
    66 end
    67 end
    68
    69 endmodule

    等精度测频法

    1 预设闸门模块:由标准时钟计数产生
    2 module pregate(clk, gateout);
    3 input clk;
    4 output gateout;
    5
    6 reg gateout, gatebuf;
    7 reg [19:0] cnt;
    8
    9 always @(posedge clk)
    10 begin
    11 if (cnt == 20'd1000)
    12 begin
    13 gatebuf <= ~gatebuf;
    14 gateout <= gatebuf;
    15 cnt <= 20'd0;
    16 end
    17 else
    18 begin
    19 cnt <= cnt + 20'd1;
    20 end
    21 end
    22
    23 endmodule
    24
    25 实际闸门模块:由被测信号来同步预设闸门模块产生
    26 module actgate(clk, gatein, gateout);
    27 input clk;
    28 input gatein;
    29 output gateout;
    30
    31 reg gateout;
    32
    33 always @(posedge clk)
    34 begin
    35 gateout <= gatein;
    36 end
    37
    38 endmodule
    39
    40 计数模块:在实际闸门信号有效时,标准时钟与被测信号同时进行计数;在闸门信号结束时输出计数结果
    41 module cnt(clk, gate, cntout);
    42 input clk;
    43 input gate;
    44 output [19:0] cntout ;
    45
    46 reg [19:0] cnt, cntout;
    47 reg gatebuf;
    48
    49 always @(posedge clk)
    50 begin
    51 gatebuf <= gate;
    52 end
    53
    54 always @(posedge clk)
    55 begin
    56 if((gate == 1'b1) && (gatebuf == 1'b0))
    57 begin
    58 cnt <= 20'd1;
    59 end
    60 else if((gate == 1'b0) && (gatebuf == 1'b1))
    61 begin
    62 cntout <= cnt;
    63 end
    64 else if(gatebuf == 1'b1)
    65 begin
    66 cnt <= cnt + 20'd1;
    67 end
    68 end
    69 endmodule
    70
    71 频率计数模块:根据公式计算
    72 module frediv(clk, datat,datas, freout);
    73 input clk;
    74 input [19:0] datat;
    75 input [19:0] datas;
    76
    77 output [19:0] freout;
    78
    79 reg [19:0] datam,freout, databbuf;
    80 reg [19:0] cbuf;
    81 reg [19:0] temp;
    82 reg finish, cntflag;
    83
    84 always @(posedge clk)
    85 begin
    86 if((finish == 1'b0) && (datas != 20'd0) && (datat != 20'd0))
    87 begin
    88 datam <= 20'd10000 * datat;
    89 temp <= datas;
    90 cbuf <= 20'd1;
    91 databbuf <= datas;
    92 cntflag <= 1'b1;
    93 finish <= 1'b1;
    94 end
    95 else if ((datam > temp) && (cntflag == 1'b1) )
    96 begin
    97 temp <= temp + databbuf;
    98 cbuf <= cbuf + 20'd1;
    99
    100 end
    101 else
    102 begin
    103 freout <= cbuf;
    104 finish <= 1'b0;
    105 cntflag <= 1'b0;
    106 end
    107 end
    108
    109 endmodule

    -------------------------------------------------------------------------------------------------------------------------------------------------

     参考资料 

    [1]求是科技.CPLD/FPGA应用开发设计与工程实践.北京:人民邮电出版社[M]2005.1

    [2]王金名,冷自强.EDA技术与Verilog设计[M].北京:科学出版社,2008.4

    [3]杨晓慧,杨旭.FPGA系统设计与实例[M].北京:人民邮电出版社,2010.1

    [4]PPT:采用等精度测频原理的频率计

    [5]王刚,张潋.基于FPGASOPC嵌入式系统设计与典型实例[M].北京:电子工业出版社社,2009.1

    [6]叶舒亚.基于FPGA的便携式振动频谱分析仪的设计[D].成都理工大学硕士论文,2007.5

    [7]刘福奇,刘波.VerilogHDL应用程序设计实例精讲[M].电子工业出版社,2009.10

    [8]常晓明等.VerilogHDL语言编程[M].北京航天航空出版社,2005.8

    [9]王彦.基于FPGA的工程设计与应用[M].西安:西安电子科技大学出版社,2007.5

    -------------------------------------------------------------------------------------------------------------------------------

    Author:         SKySeraph

    Email/GTalk: zgzhaobo@gmail.com    QQ:452728574

    From:         http://www.cnblogs.com/skyseraph/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

     -------------------------------------------------------------------------------------------------------------------------------

     

     

  • 相关阅读:
    mysql show的常见用法
    【转】在ubuntu下完美安装RTX(解决离线、乱码问题)(图片无法显示)
    bcdedit 替代easybcd 编辑grub
    Ruby学习札记(二)[数组]
    Ruby学习札记(一)常用数据
    [分布式]分布式锁
    移动docker数据文件到nas共享盘、释放C盘空间
    [分布式]分布式限流
    [分布式]分布式会话session、spring-session
    学习强国挑战答题学习资料
  • 原文地址:https://www.cnblogs.com/skyseraph/p/2095039.html
Copyright © 2011-2022 走看看