简易频率计的设计与验证

news2024/12/26 23:21:32

1.原理

频率测量法缺点:时间T确定,但不能保证被测时钟信号在测量时间T内的时钟周期是整数倍。N出现误差那么 结果也会出现误差,而且被测信号的频率越小,T不变,N的个数就会变小,而误差是不变的。N越小误差对测量的结果影响是越大的。反之,被测信号的频率越大,T不变,N约大,那么正负1个时钟周期的影响较小。

周期测量法直接测上升沿的一个时钟周期

缺点:如果被测时钟信号的频率较低,测量时钟信号的上升沿是比较容易的,如果被测信号的频率很高,那么就需要用很高的计时器测量微小的时间差。所以周期测量法在高频时往往不能满足精度要求。但是比较适合测量低频。但是用周期测量法测量频率也是可以的,可以测量多个时钟炸藕其的时间,比如求100个时钟周期所持续的时间,T/100就等于单个的时钟周期,然后求出频率,可以稍微提高精度。

TX与软件闸门会出现正负1个时钟周期的误差,实际闸门没有误差,标准时钟信号的频率是已知的,在实际闸门的有效期内,对标准时钟信号进行计数,计数也会有1个周期的误差,与频率测量法的成因是一致的。

等精度测量法消除了被测时钟信号正负1个时钟周期的误差,但是会产生对标准时钟信号正负1个时钟周期的误差。(消除被测时钟信号+-1的误差,产生可控制的标准时钟误差)

减小误差的两种方式:

(1)增加软件闸门的时间:实际闸门也会增加,标准时钟信号的的计数也会增加,而+-1的误差是不变的,因此误差对Y的影响也缩小了。其他值不变对被测新年好的影响也会变小。可以缩小频率测量值的误差。

(2)提高标准时钟信号的频率:实际测量时间TX不变,频率增加,Y值也会增加,误差不变,对Y值得营销变小,对实际被测信号频率检测得误差也会变小。

以上两种方式得原理都是提高Y值。

因为时钟IP核生成的频率是HZ,数码管的数据位可能会溢出,首先将测得得频率除以1000,单位就变成了KHZ,然后再把小数点放到第3位,单位就又扩大了1000倍,现在的单位是MHZ。

软件闸门是1S,但是计数器不能只计1S,要计1.5s。因为前0.25s是被测时钟稳定的时间,中间1S是测试时间,最后0.25s是计算频率的时间。

1.5s=1500ms=1500_000us=1500_000_000ns

1500_000_000/20=75,000,000=0100011110000110100011000000(27位)

0.25s=250ms=250_000us=250_000_000ns

250_000_000/20=12,500,000

1s=1000ms=1000_000us=1000_000_000ns

1000_000_000/20=50_000_000

clk_stand的时钟是100MHZ

2.代码

以上是被检测信号的时钟频率,实际产生的是右边小数点位很多的值

仿真对了,但是上板错误要打开在线逻辑分析仪。

然后全编译

默认0.9999等于0,FPGA中都是整数,出现小数默认为0。

做出以上修改,先乘后除

因为数码管显示除以了1000.数码管最多显示999_999,所以s是999_999_999,而位宽只有32位宽,因此位宽是不够的。

需要57位位宽,以防万一增加到64位。

将在线调试关闭,在线调试会使用芯片的资源。再次进行全编译,再次下载程序

最终波形图

2.1  freq_meter_calc.v

module freq_meter_calc(	
	input wire		sys_clk		,
	input wire		sys_rst_n	,
	input wire		clk_test		,
	
	output reg[31:0]freq   			//因为6个数码管,最夿999-?999,迌且除以亿1000,所以是30位位宽,以防万一定义32位宽

);

parameter CNT_GATE_S_MAX  =27'd74_999_999,
		  CNT_RISE_MAX    =27'd12_499_999,
		  CNT_STAND_FREQ  =27'd100_000_000;

reg  [26:0]cnt_gate_s;
reg gate_s;
reg gate_a; 
reg [47:0]cnt_clk_test; //没有说为仿么要定义这么夿
reg gate_a_test_reg;
wire gate_a_fall_t;
reg [47:0]cnt_clk_test_reg;
wire clk_stand;
reg [47:0]cnt_clk_stand;
reg gate_a_stand_reg;
wire gate_a_fall_s;
reg [47:0]cnt_clk_stand_reg;
reg calc_flag;
reg [63:0]freq_reg;
reg calc_flag_reg;


assign gate_a_fall_t=((gate_a==1'b0)&&(gate_a_test_reg==1'b1)) ? 1'b1 : 1'b0; 

assign gate_a_fall_s=((gate_a==1'b0)&&(gate_a_stand_reg==1'b1))?1'b1:1'b0;


always@(posedge sys_clk or negedge sys_rst_n)
	if(sys_rst_n==1'b0)
		cnt_gate_s<=27'd0;
	else if(cnt_gate_s==CNT_GATE_S_MAX)
		cnt_gate_s<=27'd0;
	else 
		cnt_gate_s<=cnt_gate_s+1'b1;
		
always@(posedge sys_clk or negedge sys_rst_n)
	if(sys_rst_n==1'b0)
		gate_s<=1'b0;
	else if((cnt_gate_s>CNT_RISE_MAX)&&
			(cnt_gate_s<=(CNT_GATE_S_MAX-CNT_RISE_MAX)))
		gate_s<=1'b1;
	else
		gate_s<=1'b0;
		  
always@(posedge clk_test or negedge sys_rst_n)
	if(sys_rst_n==1'b0)
		gate_a<=1'b0;
	else
		gate_a<=gate_s;
		
always@(posedge clk_test or negedge sys_rst_n)
	if(sys_rst_n==1'b0)
		cnt_clk_test<=48'd0;
	else if(gate_a==1'b0)
		cnt_clk_test<=48'b0;
	else if(gate_a==1'b1)
		cnt_clk_test<=cnt_clk_test+1'b1;
	else
		cnt_clk_test<=cnt_clk_test;


always@(posedge clk_test or negedge sys_rst_n)
	if(sys_rst_n==1'b0)		
		gate_a_test_reg<=1'b0;
	else if(gate_a==1'b1)
		gate_a_test_reg<=gate_a;
	else
		gate_a_test_reg<=1'b0;
		
	
always@(posedge clk_test or negedge sys_rst_n)
	if(sys_rst_n==1'b0)	
		cnt_clk_test_reg<=48'b0;
	else if(gate_a_fall_t==1'b1)
		cnt_clk_test_reg<=cnt_clk_test;
	else
		cnt_clk_test_reg<=cnt_clk_test_reg;


always@(posedge clk_stand or negedge sys_rst_n)
	if(sys_rst_n==1'b0)
		cnt_clk_stand<=48'd0;
	else if(gate_a==1'b0)
		cnt_clk_stand<=48'd0;
	else if(gate_a==1'b1)
		cnt_clk_stand<=cnt_clk_stand+1'b1;
	else
		cnt_clk_stand<=cnt_clk_stand;
		
always@(posedge clk_stand or negedge sys_rst_n)
	if(sys_rst_n==1'b0)
		gate_a_stand_reg<=1'b0;
	else
		gate_a_stand_reg<=gate_a;//这里我原来写错了
  	
		
always@(posedge clk_stand or negedge sys_rst_n)
	if(sys_rst_n==1'b0)
		cnt_clk_stand_reg<=48'd0;
	else if(gate_a_fall_s==1'b1)
		cnt_clk_stand_reg<=cnt_clk_stand;
	else
		cnt_clk_stand_reg<=cnt_clk_stand_reg;

always@(posedge sys_clk or negedge sys_rst_n)
	if(sys_rst_n==1'b0)
		calc_flag<=1'b0;
	else if(cnt_gate_s==CNT_GATE_S_MAX)
		calc_flag<=1'b1;
	else
		calc_flag<=1'b0;
		
always@(posedge sys_clk or negedge sys_rst_n)
	if(sys_rst_n==1'b0)
		freq_reg<=64'd0;
	else if(calc_flag==1'b1)
		freq_reg<=(CNT_STAND_FREQ*cnt_clk_test_reg/cnt_clk_stand_reg);


always@(posedge sys_clk or negedge sys_rst_n)
	if(sys_rst_n==1'b0)
		calc_flag_reg<=1'b0;
	else
		calc_flag_reg<=calc_flag;
		//滞后calc_flag丿个时钟周期,已经完成了计箿
		

always@(posedge sys_clk or negedge sys_rst_n)
	if(sys_rst_n==1'b0)
		freq<=32'd0;
	else if(calc_flag_reg==1'b1)
		freq<=freq_reg[31:0];


		
clk_stand clk_stand_inst
(
    .c0(clk_stand),     // output c0
	
    .reset(~sys_rst_n), // input reset
    .inclk0(sys_clk)
);      // input inclk0


// clk_stand clk_stand_inst
// (	.areset	(~sys_rst_n),
	// .inclk0 (sys_clk),
	// .c0		(clk_stand)
// );


endmodule

2.2  freq_meter.v

module freq_meter(
	input wire 			sys_clk		,
	input wire 			sys_rst_n	,
	input wire 			clk_test	,
	
	output wire 		clk_out		,
	output wire 		ds			,
	output wire 		oe			,
	output wire 		shcp		,
	output wire			stcp		
);

wire [31:0]freq;



freq_meter_calc freq_meter_calc_inst(	
	.sys_clk	(sys_clk)	,
	.sys_rst_n	(sys_rst_n),
	.clk_test	(clk_test)	,
	
	.freq   	(freq)		
);


seg_595_dynamic seg_595_dynamic_inst(
	.sys_clk		(sys_clk)	,
	.sys_rst_n		(sys_rst_n),
	.data			(freq/1000),
	.point			(6'b001_000),
	.sign			(1'b0),
	.seg_en			(1'b1),
	
	.ds				(ds	),
	.oe				(oe	),
	.shcp			(shcp),
	.stcp		    (stcp)
);


clk_test clk_test_inst
   (
    .c0(clk_out),     // output c0
   
   .reset(~sys_rst_n), // input reset
   .inclk0(sys_clk));      // input inclk0



// clk_test clk_test_inst
// (
	// .areset	(~sys_rst_n),
	// .inclk0 (sys_clk),
	// .c0		(clk_out)
// );

endmodule

2.3  tb_freq_meter.v

`timescale 1ns/1ns
module tb_freq_meter();

reg sys_clk;
reg sys_rst_n;
reg clk_test;

initial 
	begin
		sys_clk=1'b1;
		sys_rst_n<=1'b0;
		clk_test<=1'b1;
		#20
		sys_rst_n<=1'b1;
	end
	
always #10 sys_clk=~sys_clk;
always #100 clk_test=~clk_test;  //涓?涓椂閽熷懆鏈熷氨鏄?200ns=0.2us=0.0002ms=0.000_0002s,鎵?浠ラ鐜囩瓑浜?1/0.0000002=	5,000,000hz=5MHZ	

defparam freq_meter_inst.freq_meter_calc_inst.CNT_GATE_S_MAX=74_9;
defparam freq_meter_inst.freq_meter_calc_inst.CNT_RISE_MAX=12_4;


freq_meter freq_meter_inst(
	.sys_clk	(sys_clk	)	,
	.sys_rst_n	(sys_rst_n	),
	.clk_test	(clk_test	),

	.clk_out	(clk_out	)	,
	.ds			(ds			),
	.oe			(oe			),
	.shcp		(shcp		),
	.stcp		(stcp		)
);


endmodule

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

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

相关文章

mac如何通过Teminal查找本机ip地址

方法1 ifconfig ifconfig终端中使用 ifconfig 可以查看本地 ip 但是看到的信息太多了&#xff0c;我们只是想要一个本机ip而已 方法2 ifconfig en0 ifconfig en0相比方法1我们算是直接获取到了本机ip&#xff0c;但是第一眼看到还是需要反应一段时间 方法3 精准获取IP ifcon…

一个简单的java递归下降语法分析器例子

import parser.Parser; import parser.RecursiveDescentParser;import java.util.ArrayList; import java.util.Arrays; import java.util.List;public class Main {public static void main(String[] args) {// 关键词List<String> keyList new ArrayList<>(Arra…

SSH Key生成

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

G2024-04-24 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-04-24统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目5TypeScript项目3PowerShell项目1C++项目1非开发语言项目1LLaMA模型的C/C++移植 创建周期:306 天开发语言:C, C++协议类型:MIT Li…

详解数据结构:队列(含栈与队列扩展)

一、顺序队列 有一种线性序列&#xff0c;特点是先进先出&#xff0c;这种存储结构称为队列。队列也是一种线性表&#xff0c;只不过它是操作受限的线性表&#xff0c;只能再两端操作&#xff1a;一端进、一端出。进的一端称为队尾&#xff0c;出的一端称为队头。队列可以用顺…

西电超算使用方法-简易版

一、引言 西电超算不错&#xff0c;我很喜欢。本文仅供自己学习使用。 二、环境搭建 搭建环境需要有一些依赖库&#xff0c;但是其实西电超算说明手册并没有写的非常清楚。因此&#xff0c;这次实战演示一下&#xff0c;写一个运行sh文件脚本并提交作业。 1、选择GPU还是CP…

[计算机效率] 网站推荐:文字转语音

4.7 文字转语音 文字转语音的作用主要体现在以下几个方面&#xff1a; 便捷性&#xff1a;文字转语音功能为视觉障碍者提供了极大的便利。通过语音输出&#xff0c;他们可以更轻松地获取和理解信息&#xff0c;从而在日常生活中更加独立自主。 节省时间&#xff1a;对于那些需…

沐风老师3dMax万有引力插件ToGround使用方法详解

3dMax万有引力插件ToGround使用教程 3dMax万有引力插件ToGround&#xff0c;用于在复杂地形&#xff08;曲面&#xff09;上将对象放置在适当高度的实用工具。例如&#xff1a;将大量的人、植物和汽车快速放置在一个街道、公园和小跑道高度不同的区域尤其有用。 【适用版本】 …

工信部政策要求试点城市20%资金奖励中小企业用SaaS上云转型数字化

随着数字经济的不断发展&#xff0c;中小企业也迎来了前所未有的机遇和挑战。为了持续推动中小企业数字化转型&#xff0c;工信部出台了一项新政策&#xff0c;主要通过资金奖励的方式&#xff0c;鼓励中小企业采纳软件即服务&#xff08;SaaS&#xff09;模式&#xff0c;实现…

Redis入门到通关之Redis数据结构-List篇

文章目录 ☃️概述☃️数据结构☃️源码☃️其他 欢迎来到 请回答1024 的博客 &#x1f353;&#x1f353;&#x1f353;欢迎来到 请回答1024的博客 关于博主&#xff1a; 我是 请回答1024&#xff0c;一个追求数学与计算的边界、时间与空间的平衡&#xff0c;0与1的延伸的后端…

GAN的loss为nan的解决办法(成功)

跑了好几个GAN模型&#xff0c;一运行loss就巨大&#xff0c;几次epoch后就变NaN&#xff0c;或者直接就爆掉 有人说loss为nan是因为里面有log出问题了&#xff0c;但我想着文章里给的代码肯定得是能跑的啊 后来换了个电脑&#xff0c;重新把cyclegan的源码跑了一下&#xff…

[SWPUCTF 2022 新生赛]ez_ez_unserialize

要绕过wakeup函数&#xff0c;只要序列化的中的成员数大于实际成员数&#xff0c;即可绕过。 <?php class X {public $x fllllllag.php; }$anew X(); echo serialize($a); O:1:“X”:1:{s:1:“x”;s:13:“fllllllag.php”;} 修改为 O:1:“X”:3:{s:1:“x”;s:13:“flllll…

面向多源异质遥感影像地物分类的自监督预训练方法

源自&#xff1a;测绘学报 作者&#xff1a;薛志祥, 余旭初, 刘景正, 杨国鹏, 刘冰, 余岸竹, 周嘉男, 金上鸿 摘 要 近年来,深度学习改变了遥感图像处理的方法。由于标注高质量样本费时费力,标签样本数量不足的现实问题会严重影响深层神经网络模型的性能。为解决这一突出矛盾…

matlab绘图之在曲线上加竖直线

matlab绘图之在曲线上加竖直线 clear clc close all x0:1:20; yxlsread(compare.xlsx,A1:A18); plot(y,b) grid on; hhaxis; hold on; plot([10,10],[hh(3),hh(4)],r--) plot([8,8],[hh(3),hh(4)],k--) plot([2,2],[hh(3),hh(4)],k--) xlabel(它是x轴) ylabel(它是y轴) text(4,…

其他代码题

1.阶乘累加 2.回文数 3.字典查询 4.“结构体”的应用 5.链表

ROM修改进阶教程------小米HyperOS系统 简单修改设置logo界面大小 等详细操作步骤解析

小米 HyperOS系统是目前小米推出的一款全新的操作系统.官方宣称采用了微内核设计和动态内存技术,具有高效能和稳定性。Hyperos的设计风格简约、现代化,注重用户体验的流畅性和直观性。Hyperos以其简约的设计风格和出色的性能表现赢得了用户的青睐。但他目前的设置版本里面其l…

YOLOv8常见水果识别检测系统(yolov8模型,从图像、视频和摄像头三种路径识别检测)

1.效果视频&#xff08;常见水果识别&#xff08;yolov8模型&#xff0c;从图像、视频和摄像头三种路径识别检测&#xff09;_哔哩哔哩_bilibili&#xff09; 资源包含可视化的水果识别检测系统&#xff0c;可识别图片和视频当中出现的六类常见的水果&#xff0c;包括&#xf…

用Python写一个去文档水印的算法

处理效果对比&#xff1a; #图片处理 def imgDeal(img_path,save_path):img Image.open(img_path)img levelsDeal(img,108,164)img_res Image.fromarray(img.astype(uint8))print(u图片[ img_path u]处理完毕)img_res.save(save_path)#图像矩阵处理 def levelsDeal(img,…

平台流量思维与私域电商思维的区别及特点

随着互联网的发展&#xff0c;电商平台已经成为了人们购物的主要渠道之一。然而&#xff0c;随着竞争的加剧&#xff0c;电商平台的流量获取成本也在不断提高。在这种情况下&#xff0c;私域电商思维应运而生&#xff0c;成为了一种新的商业模式。那么&#xff0c;对比另一种主…

深入了解O2OA的开发平台如何支撑涉密应用系统技术要求

涉密应用系统O2OA的开发平台是一个功能强大且高度安全的开发环境&#xff0c;旨在为涉密信息的处理、存储和传输提供坚实的技术支撑。该平台具备以下显著特点&#xff1a; 首先&#xff0c;安全性是涉密应用系统O2OA开发平台的核心优势。平台严格遵守国家关于涉密信息系统的安…