基于FPGA的数字等精度频率计
测频率的原理
传统测量方法
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的数字等精度频率计相关推荐
- 基于 FPGA 的数字抢答器设计
下面是基于 FPGA 的数字抢答器设计,在quartusII下,modelsim下仿真,编程语言VHDL. 1.抢答器的工作原理 主持人宣布可以抢答后,在 20s 的定时时间内若有人按键抢答,则这 ...
- [FPGA]基于FPGA的数字跑表
基于FPGA的数字跑表的设计与实现 一.设计要求 用FPGA设计并实现一个数字跑表,范围为0~59分59.99秒.可以实现数字跑表进行启动.停止计时和显示读数三个操作,可以在数码管上显示读数. 二.设 ...
- 基于FPGA的数字时钟设计
基于FPGA的数字时钟设计 芯片与开发板 技术指标 1.具有正常的日时分秒技术显示功能,用七个数码管分别显示日,时,分,秒. 2.有按键校日,校时,校分,校秒. 3.利用led模拟整点报时功能. 4. ...
- 基于FPGA的数字识别实现
前言 数字识别在我们生活中很常见,比如车牌识别.本篇博客就将介绍数字识别的方法,由于只是研究数字识别的方法,我们就不用硬件平台,而是用Modelsim和Matlab来仿真验证. 具体方法如下: 我们用 ...
- 基于FPGA的数字钟(四)——时钟控制模块
一.需求分析 时钟控制模块,需要生成秒,分,时三路信号,需要有外部信号能对其进行控制. 按照正常时钟逻辑: 秒满60归零: 分在秒满60时进1,分满60归零: 时在分满60时进1,时满24归零. 外部 ...
- 基于FPGA的数字钟——(三)时钟显示模块(数码管)
基于FPGA的数字钟--(三)数码管显示模块 一.硬件原理 本设计中使用 6 个共阳数码管,可以显示 6 个数字(包含小数点) .电路用 PNP管来反向驱动并且控制列扫描信号来选择哪个数码管.而且所有 ...
- 基于FPGA的数字视频信号处理器设计(中)
今天给大侠带来基于FPGA的数字视频信号处理器设计,由于篇幅较长,分三篇.今天带来第二篇,中篇,视频信号概述和视频信号处理的框架.话不多说,上货. 之前也有图像处理相关方面的文章,这里超链接几篇,给各 ...
- 基于FPGA的数字识别的实现
基于FPGA的数字识别的实现 1 背景知识 1.1基于FPGA的数字识别的方法 通常,针对印刷体数字识别使用的算法有:基于模版匹配的识别方法.基于BP 神经网络的识别方法.基于数字特征的识别方法等.下 ...
- 基于FPGA的数字时钟(使用vivado)
基于FPGA的数字时钟(使用vivado) 使用两个四位数码管,可以实现时钟分钟秒钟显示,高两位设置不显示. 换了一个新开发板,nexys4ddr,资料不多,最多使用的就是一本英文Reference ...
最新文章
- SCOM发送邮件通知
- 关于BMP格式图像的理解和读写(c++).docx
- 动态更新ViewPager?
- (七)OpenStack---M版---双节点搭建---Dashboard安装和配置
- [IOI2014]Wall
- 计算机基础-软件梗概
- Eclipse export导出war包报错(Module name is invalid.)
- 拒绝网络*** 如何防御Sniffer***
- android 拉伸view,安卓ImageView拉伸展示
- VBA中对内存地址的操作
- 结对编程-黄金点游戏之旅[二]
- 【亲测可用】彻底解决Google谷歌地球启动无法连接到登录服务器、无法启动问题
- 9gag for android,GitHub - Mixiaoxiao/9GAG: 9GAG-Android (unofficial), Android Design.
- premiere(Pr)为视频配字幕 开放式字幕使用详解
- 20_java使用谷歌邮箱发送邮件
- ios真机测试,Ineligible Devices,不可以选中真机
- 查看Win7电脑密钥期限
- 解决 NDP40-KB2468871不能安装
- 15张超详细的Python学习路线图,纯良心分享,零基础学习宝典
- 基于验证分离的PLC保护系统
热门文章
- 信用百度公司商标信息爬取
- FCKeditor相关资料简介
- java动物代码_Java基于接口实现模拟动物声音代码实例
- nginx+keepalived+tomcat+memcache负载均衡搭建小集群
- 刘军荣电商培训——电商成长之路
- JAVA实现简易的酒店管理系统
- 西行漫记(3):敏捷的奥秘
- 招聘java是什么意思_企业招聘Java程序员的标准到底是什么?
- centos(7.9) minikube(v1.28.0) kaniko 构建镜像
- ubuntu22从双系统开始到深度学习环境搭建+必备软件安装