测频率的原理

传统测量方法

1、直接测频法


直接数在闸门信号内有多少上升沿,但这样总有1个信号的误差,如果在高频域,则相对误差比较小,但如果在低频域,相对误差就会比较大。

2、测周法

即在一个被测信号的周期内,测量基准时钟的个数,得到被测信号的周期,再将其转化为频率。此种方法适用于测量低频信号,但同时也会带来测量速度过慢的问题,误差来自一个系统基准时钟。
所以,高频适用测频法,低频适用测周法,但是低频和高频的界限难以界定,也比较麻烦,所以需要新的方法、

等精度测量法

测量的相对误差与输入信号的频率大小无关,实现整个频段的等精度测量

基本思想是:在基准时钟信号域,及被测时钟信号域获取同等时间(门控时间),在此时间内,分别对基准时钟、被测时钟计数,可有等式关系: 基准时钟个数*基准时钟频率=被测时钟个数 *被测信号频率。
指定闸门信号是被测信号的整数倍,两个闸门信号的时间相等,基准时钟的数目始终有±1的误差,但由于基准时钟频率较大,所以相对误差始终比较小

实验程序实现

gate模块,产生闸门信号

设置闸门信号周期为待测信号周期的5000倍,如果是低频信号的话,等待的时间会很长,可以适当减小倍数
当复位信号为低电平时,正常工作

module gate
(input                 clk_fs ,     // 基准时钟信号input                 rst_n   ,  // 复位信号//cymometer interfaceinput                 clk_fx ,//待测信号output        reg             gate , //门控信号output    reg           gate_fs // 同步到基准时钟的门控信号);localparam   GATE_TIME = 16'd5_000;        // 门控时间设置
reg    [15:0]   gate_cnt    ;           // 门控计数reg             gate_fs_r   ;           // 用于同步gate信号的寄存器//门控信号计数器,使用被测时钟计数
always @(posedge clk_fx or negedge rst_n) beginif(!rst_n)gate_cnt <= 16'd0; else if(gate_cnt == GATE_TIME + 5'd20)gate_cnt <= 16'd0;elsegate_cnt <= gate_cnt + 1'b1;
end//门控信号,拉高时间为GATE_TIME个实测时钟周期
always @(posedge clk_fx or negedge rst_n) beginif(!rst_n)gate <= 1'b0;else if(gate_cnt < 4'd10)gate <= 1'b0;     else if(gate_cnt < GATE_TIME + 4'd10)gate <= 1'b1;else if(gate_cnt <= GATE_TIME + 5'd20)gate <= 1'b0;else gate <= 1'b0;
end//将门控信号同步到基准时钟下
always @(posedge clk_fs or negedge rst_n) beginif(!rst_n) begingate_fs_r <= 1'b0;gate_fs   <= 1'b0;endelse begingate_fs_r <= gate;gate_fs   <= gate_fs_r;end
end
endmodule

pexg模块

捕捉基准时钟和待测时钟的下降沿

module pexg
(input                 clk_fs ,     // 基准时钟信号input                 rst_n   ,  // 复位信号input                 clk_fx , input gate,input gate_fs     ,  output    neg_gate_fs,output    neg_gate_fx);
reg                gate_fs_d0  ;           // 用于采集基准时钟下gate下降沿
reg                gate_fs_d1  ;           //
reg                gate_fx_d0  ;           // 用于采集被测时钟下gate下降沿
reg                gate_fx_d1  ;           //
//wire define//边沿检测,捕获信号下降沿
assign neg_gate_fs = gate_fs_d1 & (~gate_fs_d0);
assign neg_gate_fx = gate_fx_d1 & (~gate_fx_d0);//打拍采门控信号的下降沿(被测时钟)
always @(posedge clk_fx or negedge rst_n) beginif(!rst_n) begingate_fx_d0 <= 1'b0;gate_fx_d1 <= 1'b0;endelse begingate_fx_d0 <= gate;gate_fx_d1 <= gate_fx_d0;end
end//打拍采门控信号的下降沿(基准时钟)
always @(posedge clk_fs or negedge rst_n) beginif(!rst_n) begingate_fs_d0 <= 1'b0;gate_fs_d1 <= 1'b0;endelse begingate_fs_d0 <= gate_fs;gate_fs_d1 <= gate_fs_d0;end
end
endmodule

计数及计算模块

检测在一个闸门周期内分别有多少个基准时钟信号及待测时钟信号,并利用公式计算出待测时钟的频率

module CNT#(parameter    CLK_FS = 26'd50_000_000,// 基准时钟频率parameter  MAX       =  10'd64)  // 定义数据位宽        (   //system clockinput                 clk_fs ,     // 时钟信号input                 rst_n   ,  // 复位信号//cymometer interfaceinput                 clk_fx ,     // 待测信号input gate,       // 门控信号(与待测时钟同步)input gate_fs,    // 与基准时钟同步的门控信号input  neg_gate_fx,//input  neg_gate_fs,//output reg    [MAX-1:0]   fs_cnt      ,           //门控时间内基准时钟信号的个数 output reg    [MAX-1:0]   fx_cnt      ,          // 门控时间内待测信号的个数output reg      [MAX-1:0]   data_fx_temp  // 待测信号的频率值
);reg    [MAX-1:0]   fs_cnt_temp ;           // fs_cnt 计数
reg    [MAX-1:0]   fx_cnt_temp ;           // fx_cnt 计数//门控时间内待测信号的计数,设置的为5000个,这里重新计数,只是用于检验信号是否正确
always @(posedge clk_fx or negedge rst_n) beginif(!rst_n) beginfx_cnt_temp <= 32'd0;fx_cnt <= 32'd0;endelse if(gate)beginfx_cnt_temp <= fx_cnt_temp + 1'b1;end   else if(neg_gate_fx) beginfx_cnt_temp <= 32'd0;fx_cnt <= fx_cnt_temp;end
end//门控时间内基准时钟的计数
always @(posedge clk_fs or negedge rst_n) beginif(!rst_n) beginfs_cnt_temp <= 32'd0;fs_cnt <= 32'd0;endelse if(gate_fs)beginfs_cnt_temp <= fs_cnt_temp + 1'b1;endelse if(neg_gate_fs) beginfs_cnt_temp <= 32'd0;fs_cnt <= fs_cnt_temp;end
end
//计算待测信号的频率值
always @(posedge clk_fs or negedge rst_n) beginif(!rst_n) begindata_fx_temp <= 64'd0;endelse if(gate_fs == 1'b0)data_fx_temp <=CLK_FS*fx_cnt/fs_cnt;
endendmodule

顶层BDF文件


分配管脚,clk50接入50M 的晶振时钟,可以从下列划红线的管脚输入外部信号,信号从信号发生器出来,黑色夹子接地

调试验证

因为仅仅使用了FPGA,就用signaltap进行验证频率
输入信号为410kHz时

误差为2Hz,相对误差满足要求

输入信号为1.8MHz时

误差为11Hz,相对误差满足要求

输入信号为125489Hz时

误差为0

当输入信号为110Hz时

误差为0

在调试过程中,发现如果输入信号的电压过小,频率就会非常不稳定

基于FPGA的数字等精度频率计相关推荐

  1. 基于 FPGA 的数字抢答器设计

    下面是基于 FPGA 的数字抢答器设计,在quartusII下,modelsim下仿真,编程语言VHDL.   1.抢答器的工作原理 主持人宣布可以抢答后,在 20s 的定时时间内若有人按键抢答,则这 ...

  2. [FPGA]基于FPGA的数字跑表

    基于FPGA的数字跑表的设计与实现 一.设计要求 用FPGA设计并实现一个数字跑表,范围为0~59分59.99秒.可以实现数字跑表进行启动.停止计时和显示读数三个操作,可以在数码管上显示读数. 二.设 ...

  3. 基于FPGA的数字时钟设计

    基于FPGA的数字时钟设计 芯片与开发板 技术指标 1.具有正常的日时分秒技术显示功能,用七个数码管分别显示日,时,分,秒. 2.有按键校日,校时,校分,校秒. 3.利用led模拟整点报时功能. 4. ...

  4. 基于FPGA的数字识别实现

    前言 数字识别在我们生活中很常见,比如车牌识别.本篇博客就将介绍数字识别的方法,由于只是研究数字识别的方法,我们就不用硬件平台,而是用Modelsim和Matlab来仿真验证. 具体方法如下: 我们用 ...

  5. 基于FPGA的数字钟(四)——时钟控制模块

    一.需求分析 时钟控制模块,需要生成秒,分,时三路信号,需要有外部信号能对其进行控制. 按照正常时钟逻辑: 秒满60归零: 分在秒满60时进1,分满60归零: 时在分满60时进1,时满24归零. 外部 ...

  6. 基于FPGA的数字钟——(三)时钟显示模块(数码管)

    基于FPGA的数字钟--(三)数码管显示模块 一.硬件原理 本设计中使用 6 个共阳数码管,可以显示 6 个数字(包含小数点) .电路用 PNP管来反向驱动并且控制列扫描信号来选择哪个数码管.而且所有 ...

  7. 基于FPGA的数字视频信号处理器设计(中)

    今天给大侠带来基于FPGA的数字视频信号处理器设计,由于篇幅较长,分三篇.今天带来第二篇,中篇,视频信号概述和视频信号处理的框架.话不多说,上货. 之前也有图像处理相关方面的文章,这里超链接几篇,给各 ...

  8. 基于FPGA的数字识别的实现

    基于FPGA的数字识别的实现 1 背景知识 1.1基于FPGA的数字识别的方法 通常,针对印刷体数字识别使用的算法有:基于模版匹配的识别方法.基于BP 神经网络的识别方法.基于数字特征的识别方法等.下 ...

  9. 基于FPGA的数字时钟(使用vivado)

    基于FPGA的数字时钟(使用vivado) 使用两个四位数码管,可以实现时钟分钟秒钟显示,高两位设置不显示. 换了一个新开发板,nexys4ddr,资料不多,最多使用的就是一本英文Reference ...

最新文章

  1. SCOM发送邮件通知
  2. 关于BMP格式图像的理解和读写(c++).docx
  3. 动态更新ViewPager?
  4. (七)OpenStack---M版---双节点搭建---Dashboard安装和配置
  5. [IOI2014]Wall
  6. 计算机基础-软件梗概
  7. Eclipse export导出war包报错(Module name is invalid.)
  8. 拒绝网络*** 如何防御Sniffer***
  9. android 拉伸view,安卓ImageView拉伸展示
  10. VBA中对内存地址的操作
  11. 结对编程-黄金点游戏之旅[二]
  12. 【亲测可用】彻底解决Google谷歌地球启动无法连接到登录服务器、无法启动问题
  13. 9gag for android,GitHub - Mixiaoxiao/9GAG: 9GAG-Android (unofficial), Android Design.
  14. premiere(Pr)为视频配字幕 开放式字幕使用详解
  15. 20_java使用谷歌邮箱发送邮件
  16. ios真机测试,Ineligible Devices,不可以选中真机
  17. 查看Win7电脑密钥期限
  18. 解决 NDP40-KB2468871不能安装
  19. 15张超详细的Python学习路线图,纯良心分享,零基础学习宝典
  20. 基于验证分离的PLC保护系统

热门文章

  1. 信用百度公司商标信息爬取
  2. FCKeditor相关资料简介
  3. java动物代码_Java基于接口实现模拟动物声音代码实例
  4. nginx+keepalived+tomcat+memcache负载均衡搭建小集群
  5. 刘军荣电商培训——电商成长之路
  6. JAVA实现简易的酒店管理系统
  7. 西行漫记(3):敏捷的奥秘
  8. 招聘java是什么意思_企业招聘Java程序员的标准到底是什么?
  9. centos(7.9) minikube(v1.28.0) kaniko 构建镜像
  10. ubuntu22从双系统开始到深度学习环境搭建+必备软件安装