频率检测计

news2024/9/23 15:33:42

前言

        频率计是一种用于测量信号频率的仪器。它可以准确地确定电子信号的频率,广泛应用于电子设备的测试和维护中。频率计的工作原理通常包括对输入信号进行采样,并通过内部电路计算信号的周期,从而得到频率值。现代频率计通常具有高精度、高稳定性,并且能够测量从赫兹(Hz)到千兆赫兹(GHz)范围的频率。

正文

一、频率检测计

        1.项目需求

实验目标:设计基于等精度测量法的频率计(误差不大于10ns)测量结果通过数码管进行显示

        2.技术介绍

        误差不大于10ns,1/(10ns/10^9)=100Mhz,需要完成目标精度需要标准时钟为100Mhz。

        常用频率测量法:频率测量法、周期测量法、等精度测量法。
频率测量法:在时间T内对被测时钟信号的时钟周期N进行计数,然后求出单位时间内的时钟周期数,即为被测时钟信号的时钟频率。(在T时间内记N个周期,F= N/T,不能保证周期的整数倍,因而产生一个周期的误差,当T较小时,误差对测量精度影响较大,因此在低频信号测量下误差较大,常用于高频信号测量)
周期测量法:先测量出被测时钟信号的时钟周期T,然后根据频率f=1/T求出被测时钟信号的频率。(不适应高频信号测量  )
等精度测量法:实际闸门Tx于测量信号进行同步,在标准时钟下对实际闸门的Tx进行计算,设置较长的软件闸门或提高标准时钟频率,即可消除频率测量法的误差。

        等精度测量法是一种用于提高测量精度的技术,特别适用于高精度测量仪器,如频率计。其基本原理是通过对输入信号进行多次测量,并采用统计方法来减少误差。具体来说,等精度测量法通常包括以下步骤:对同一个信号进行多次独立测量,记录每次测量结果。将多次测量的结果进行统计分析,例如计算平均值、标准偏差等。通过分析测量结果的分布情况,识别和校正系统误差和随机误差。通过对测量数据的处理,可以得到更精确的频率值,并减小由噪声、环境变化等因素引入的误差。

        等精度测量法的核心思想是通过多次测量和统计分析来提高测量结果的可靠性和准确性,从而在实际应用中减少测量误差。这种方法在高精度频率测量、信号分析等领域中非常重要。

设置高频率时钟调用ip核进行实验

这里要注意锁相环的复位信号时高电平有效,需要将外接的复位信号进行取反后接入。

        3.顶层架构

这里因为数据位宽原因未将数据输出到数码管上,总工程框架如下。

        4.端口描述

clk基础时钟(50MHZ)
rst_n复位按键(低电平有效)
[2:0] sel位选信号
[7:0] seg段选信号
test_clk待测信号

二、代码验证

频率测量模块freq_meter

module freq_meter(

	input 				clk		,
	input					rst_n		,
	input					clk_test	,

	output reg[31:0]	data		
);

parameter cnt_max = 27'd74999999;//1.5s计数器值
parameter cnt_05  = 27'd12499999;//0.5s计数器值
parameter a100Mhz = 27'd100000000;//100Mhz

reg [26:0]	cnt;
reg 			gate;//软件闸门		
reg 			gata;//实际闸门
reg [47:0]	cnt_clk;//高精度计数值
reg 			test_clk;//寄存被测时钟
reg [47:0]	cnt_test;//被测时钟周期计数
reg [47:0]	cnt_long;//高频率时钟下周期计数
reg			gata_100Mhz;//高频率下对实际闸门进行寄存
reg [47:0]	cnt_long_100;//高频率时钟下周期计数寄存
reg 			cale_flag;//计算使能

wire 			clk100Mhz;
wire  		gata_fall;//闸门下降沿检测
wire  		fall_100Mhz;//高频率闸门下降沿检测

always@(posedge clk,negedge rst_n)
begin
	if(rst_n == 0)
		cnt <= 27'd0;
	else
		if(cnt == cnt_max)
			cnt <= 27'd0;
		else
			cnt <= cnt +1'b1;	
end

always@(posedge clk,negedge rst_n)
begin
	if(rst_n == 0)
		gate <= 1'b0;
	else
		if((cnt > cnt_05)&&(cnt <= (cnt_max - cnt_05)))//0.5s的软件闸门开启
			gate <= 1'b1;
		else
			gate <= 1'b0;
end

always@(posedge clk_test,negedge rst_n)//使用待测时钟
begin
	if(rst_n == 0)
		gata <= 1'b0;
	else
		gata <= gate;//实际闸门
end

always@(posedge clk_test,negedge rst_n)//使用待测时钟
begin
	if(rst_n == 0)
		cnt_clk <= 48'd0;
	else
		if(gata == 1'b0)
			cnt_clk <= 48'd0;
		else
			if(gata == 1'b1)
				cnt_clk <= cnt_clk + 1'b1;
			else
				cnt_clk <= cnt_clk;
end

always@(posedge clk_test,negedge rst_n)//使用待测时钟
begin
	if(rst_n == 0)
        test_clk <= 1'b0;
    else
        test_clk <= gata;
end

assign gata_fall = ((test_clk == 1'b1)&&(gata == 1'b0))?1'b1:1'b0;

always@(posedge clk_test,negedge rst_n)//使用待测时钟
begin
	if(rst_n == 0)
		cnt_test <= 48'd0;
	else
		if(gata_fall == 1'b1)
			cnt_test <= cnt_clk;
end


always@(posedge clk100Mhz,negedge rst_n)//使用100Mhz
begin
	if(rst_n == 0)
		cnt_long <= 48'd0;
	else
		if(gata == 1'b0)
			cnt_long <= 48'd0;
		else
			if(gata == 1'b1)
				cnt_long <= cnt_long + 1'b1;
			else
				cnt_long <= cnt_long;
end

always@(posedge clk100Mhz,negedge rst_n)//使用100Mhz
begin
	if(rst_n == 0)
		gata_100Mhz <= 1'd0;
	else
		gata_100Mhz <= gata;
end

assign fall_100Mhz = ((gata_100Mhz == 1'b1)&&(gata == 1'b0))?1'b1:1'b0;

			
always@(posedge clk100Mhz,negedge rst_n)//使用100Mhz
begin
	if(rst_n == 0)
		cnt_long_100 <= 48'd0;
	else
		if(fall_100Mhz == 1'b1)
			cnt_long_100 <= cnt_long;
		else
			cnt_long_100 <= cnt_long_100;
end

always@(posedge clk,negedge rst_n)
begin
	if(rst_n == 0)
		cale_flag <= 1'b0;
	else
		if(cnt == cnt_max)
			cale_flag <= 1'b1;
		else
			cale_flag <= 1'b0;
end

always@(posedge clk,negedge rst_n)
begin
	if(rst_n == 0)
		data <= 32'd0;
	else
		if(cale_flag == 1'b1)
			data <=(a100Mhz / cnt_long_100 * cnt_test);
		else
			data <= data;
end		
	
mypll	mypll_inst (
	.areset ( ~rst_n ),
	.inclk0 ( clk 	 ),
	.c0 ( clk100Mhz )
	);

endmodule

数码管显示:该模块没有小数点显示,在仿真时未进行数据传入,如需实现数码管显示,对数据进行缩小例如对数据整/1000,再对缩小后的数据进行二进制转bcd,这里要注意数据位宽,不需要显示小数点时最大可显示999999Khz(首先得需要该频率的信号),最小可显示1Khz。

module seg_driver(
 
	input clk,
	input rst_n,
	input [23:0] data_in,//接收数字时钟信号
	
	output reg [2:0] sel,//位选信号
	output reg [7:0] seg//段选信号
);
 
reg [18:0] cnt;//1MS
parameter MAX = 19'd50_000;
//20ns记50000次
//产生1ms的延时
//位选信号1ms变换一次
reg [3:0] temp;
always @(posedge clk,negedge rst_n)
begin
	if(rst_n == 0)
		cnt <= 19'd0;
	else
		if(cnt < MAX - 1)//产生1ms的延时
			cnt <= cnt + 19'd1;
		else
			cnt <= 19'd0;
end 
 
//数码管位选信号控制逻辑
always @(posedge clk,negedge rst_n)
begin
	if(rst_n == 0)
		sel <= 3'd0;
	else
		if(cnt == MAX - 1)//位选信号6位,1ms的延时到变化一次
			if(sel < 5)
				sel <= sel + 3'd1;
			else 
				sel <= 3'd0;
		else 
			sel <= sel;	
end 
always @(*) begin
	if(rst_n == 0)
		temp <= 4'd0;
	else
		case(sel)//位选信号到将数据输出到对应输出位上
			3'd0	:	temp <= data_in[23:20];
			3'd1	:	temp <= data_in[19:16];
			3'd2	:	temp <= data_in[15:12];
			3'd3	:	temp <= data_in[11:8];
			3'd4	:	temp <= data_in[7:4];
			3'd5	:	temp <= data_in[3:0];
			default	:	temp <= 4'd0;
		endcase
end 
always @(*) begin
	if(rst_n == 0)
		seg <= 8'hff;
	else
		case(temp)//段选信号,对应的数码管信号
			4'd0	:	seg <= 8'b1100_0000;//0
			4'd1	:	seg <= 8'b1111_1001;//1
			4'd2	:	seg <= 8'b1010_0100;//2
			4'd3	:	seg <= 8'b1011_0000;//3
			4'd4	:	seg <= 8'b1001_1001;//4
			4'd5	:	seg <= 8'b1001_0010;//5
			4'd6	:	seg <= 8'b1000_0010;//6
			4'd7	:	seg <= 8'b1111_1000;//7
			4'd8	:	seg <= 8'b1000_0000;//8
			4'd9	:	seg <= 8'b1001_0000;//9
			4'd10	:	seg <= 8'b1000_1000;//A
			4'd11	:	seg <= 8'b1000_0011;//b
			4'd12	:	seg <= 8'b1100_0110;//C
			4'd13	:	seg <= 8'b1010_0001;//d
			4'd14	:	seg <= 8'b1000_0110;//E
			4'd15	:	seg <= 8'b1000_1110;//F
			default	:	seg <= 8'hff;
		endcase 
end 
endmodule 

顶层连线

module freq_meter_top(
	
	input clk,
	input rst_n,
	
	output [2:0]seg,
	output [7:0]sel
);

wire clk_test;
wire[31:0]data;

freq_meter freq_meter(

	.clk		(clk		) ,
	.rst_n	(rst_n	),
	.clk_test(clk_test),
         
	.data		(data		)
);

seg_driver seg_driver(
 
	.clk		(clk		),
	.rst_n	(rst_n	),
	.data_in	(     	),//接收数字时钟信号
        
	.sel		(sel		),//位选信号
	.seg		(seg		)//段选信号
);

pll_test	pll_test_inst (
	.areset ( ~rst_n 	),
	.inclk0 (  clk  	),
	.c0 ( clk_test 	)
	);


endmodule


仿真代码

`timescale 1ns/1ps
module freq_meter_top_tb;
	
	reg 			clk	;
	reg 			rst_n	;
	
	wire [2:0]	seg	;
	wire [7:0]	sel	;

	
defparam 	freq_meter_top.freq_meter.cnt_max = 74;//这里通过赋值减小计数,便于仿真
defparam 	freq_meter_top.freq_meter.cnt_05  = 12;//这里通过赋值减小计数,便于仿真

	
freq_meter_top freq_meter_top(
	
	.clk	(clk	),
	.rst_n(rst_n),
  
	.seg	(seg	),
	.sel	(sel	)
);


initial clk =1;
always #10 clk = ~clk;


initial begin
	rst_n = 0;
	#20
	rst_n = 1;
	#100000
	$stop;
end

endmodule

三、仿真验证

运行仿真文件,在顶层文件中未将数据传至数码管显示文件,这里需要直接调用频率计算模块,通过仿真可看到data的数据为46000000hz

与调用的IP核输出相同,证明实验成功。

a100Mhz / cnt_long_100 * cnt_test=100_000_000/100*46=46_000_000。在高时钟下记100个时钟周期,即1/100_000_000*100s,在这段时间上对被测信号进行计数,记得46个周期,即被测信号频率为46/(1/100_000_000*100)= 46_000_000hz

参考资料

频率计

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2050653.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无线通信代码搬运/复现系列(1) : 重新审视具有每天线功率约束的 MIMO 容量:固定点迭代和交替优化

无线通信代码搬运/复现系列(1) “Revisiting the MIMO Capacity with Per-antenna Power Constraint: Fixed-point Iteration and Alternating Optimization,” IEEE Trans. Wireless Commun., vol. 18, no. 1, pp. 388-401, Jan. 2019 by T. M. Pham, R. Farrell, and L.-N. …

C++入门——05STL

STL&#xff08;Standard Template Library&#xff0c;标准模板库&#xff09;是C标准库的重要组成部分&#xff0c;是一个通用的数据结构和算法库。STL提供了一组经过精心设计的模板类和函数&#xff0c;用于处理各种常见的数据结构&#xff08;如容器&#xff09;和算法&…

六. 部署分类器-preprocess-speed-compare

目录 前言0. 简述1. 案例运行2. 代码分析2.1 main.cpp2.2 preprocess.cpp 3. 补充说明结语下载链接参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习课程第六章—部署分类器&…

嵌入式面经篇八——进程线程

文章目录 前言一、进程&线程1、异步 IO 和同步 IO 区别&#xff1f;2、进程间通信方式&#xff1f;3、进程的地址空间模型&#xff1f;4、进程的五种状态分别是?5、子进程从父进程继承的资源有哪些&#xff1f;6、什么是进程上下文、中断上下文&#xff1f;7、如何防止僵尸…

写了一个分页 sql,因为粗心出了 bug 造成了 OOM!

大家好&#xff0c;我是君哥。 最近上完线后&#xff0c;凌晨收到一个生产告警&#xff0c;一个 OOM 异常导致了服务重启。今天来分享一下这个事故。 1.事故现场 事故的代码逻辑并不复杂&#xff0c;从一个大概有 8 万数据的表里面查出数据&#xff0c;汇总后对数据做处理。…

高校宣讲会管理系统--论文pf

TOC springboot370高校宣讲会管理系统--论文pf 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着电脑和笔记本的…

【myz_tools】Python库 myz_tools:Python算法及文档自动化生成工具 - 0.2.0版更新

文章目录 0.2.0 更新内容如下函数generate_2d_combinations_iter函数generate_row_permutations函数calculate_total_permutations函数display_combinations函数evaluate_list_similarity函数check_unique 写在前面关于库库使用库内所有函数目录文件名称: common_maths.py函数部…

ZooKeeper分布式协调系统介绍

1. ZooKeeper概述 1.1 ZooKeeper介绍 ZooKeeper 是 Apache 软件基金会的一个项目&#xff0c;它确实提供了一种非常有用的服务&#xff0c;用于维护分布式系统中的配置信息、命名、提供分布式同步和提供组服务等。它的核心是原子广播和大约一致性模型&#xff0c;这使得它能够…

CCF-GESP五级考级——初等数论,全网最精简的求最大公约数gcd和最小公倍数lcm方法(100%好使)

&#x1f451;一、约数和因数的区别 约数必须在整除的前提下才存在&#xff0c;而因数是从乘积的角度来提出的。如果数与数相乘的积是数&#xff0c;是的因数。 1.约数只能对在整数范围内而言&#xff0c;而因数就不限于整数的范围。 举个栗子&#xff1a;。2和8是16的…

中仕公考:国考往年招录情况对比

2025年国考预计10月中旬启动&#xff0c;11月进行笔试。中仕为大家总结了往年的国考招录情况&#xff0c;希望能给大家一些参考。 2024年计划招录3.96万人。截止到考试结束&#xff0c;共有225.2万人参加了考试&#xff0c;参加考试人数与录用计划数之比约为57:1&#xff0c;2…

CSP-J 2023真题一轮

选择题 阅读题 第1题 第2题 第3题 完善程序 第1题 第2题 答案&#xff1a; 一、单选题 1-5 BDAAC 6-10 BCADA 11-15 ABBAD 二、阅读程序 1&#xff09; 16. √ 17. √ 18. ⅹ 19.A 20.B 2&#xff09; 21. √ 22. ⅹ 23. √ 24. D 25.B 26.D 3&#xff09; 27. √ 28. √ 29…

EasyCVR视频汇聚平台构建远程安防监控:5大亮点解析,助力安防无死角

随着科技的飞速发展&#xff0c;远程安防监控系统已经成为现代社会中不可或缺的一部分&#xff0c;无论是在小区、公共场所还是工业领域&#xff0c;安防监控都发挥着至关重要的作用。而EasyCVR作为一款功能强大的视频监控综合管理平台&#xff0c;其在构建远程安防监控系统方面…

谷歌浏览器下载文件被阻止怎么解除

在工作生活中&#xff0c;我们会使用谷歌浏览器下载各种各样的文件&#xff0c;不过偶尔会遇到文件下载被阻止的情况。为了解决这一问题&#xff0c;本文为大家分享了实用的措施建议&#xff0c;一起来了解一下吧。&#xff08;本文由https://chrome.cmrrs.com/站点的作者进行编…

python爬取豆瓣电影数据

目录 一、背景 二、分析网站 1、ajax请求 三、代码实现 1、导包 2、面向对象实现 3、发送请求 4、解析数据 5、保存数据 6、定义主函数 7、实例化对象运行主函数 8、运行效果 四、以下是全部完整代码 五、报错解决 1、数据库连接报错 2、数据插入报错 一、背景…

136 只出现一次的数字

解题思路&#xff1a; \qquad 这道题目明确要求了时间复杂度为O(N)&#xff0c;空间复杂度为O(1)&#xff0c;不然借助哈希表很容易能够在O(N)的空间复杂度下解决。特殊的要求只能特殊处理&#xff0c;解这道题只能记住异或这种较特殊的运算方式。 \qquad 异或是对二进制数进…

《深入探究 @SpringBootApplication 注解的内部原理》

《深入探究 SpringBootApplication 注解的内部原理》 SpringBootApplication注解涵盖了 Spring Boot 的包扫描原理、自动装配原理等众多重要原理。接下来&#xff0c;我们将对该注解展开深入且详尽的研究。而研究上述原理的关键&#xff0c;在于剖析SpringBootApplication内部…

网上商品订单转手系统bootpf

TOC springboot408网上商品订单转手系统bootpf 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着电脑和笔记本的…

【SpringBoot】SpringBoot框架的整体环境搭建和使用(整合Mybatis,Druid,Junit4,PageHelper,logback等)

目录 1.介绍 1.1 配置文件 1.2 目录结构 2.基于SpringBoot的SpringMVC 4.整合Mybatis 5.整合Druid连接池 6.整合Junit4 7.整合Logback 8.整合PageHelper 9.SpringBoot整合Thymeleaf ​编辑 【附录】springboot的pom.xml 1.介绍 Spring框架的优点是方便解耦、简化开…

openEuler系统安装Visual Studio Code

openEuler系统安装Visual Studio Code 背景安装密钥和存储库更新包缓存并使用dnf安装包Fedora 22及以上版本旧版本使用yum 安装过程截图安装成功看桌面效果 背景 openEuler(openEuler-24.03-LTS)安装了麒麟UKUI桌面但是没有麒麟软件商店想安装Visual Studio Code 安装密钥和…

计算机毕业设计选什么题目好? springboot 大学志愿填报系统

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…