草庐IT

基于FPGA等精度的实时测量频率和占空比

猪突猛进进进 2025-06-21 原文

目录

一、要求:

二、指标要求 

三、 等精度测频设计原理

四、时序分析: 

五、模块设计 

1、计数器

2、读数据

3、数据处理

4、数码管显示模块

六、仿真分析

1、计数模块

A、测量1Mhz频率占空比为50%的信号的频率。

 B、Em设置为1Mhz,占空比为46%的信号的占空比

2、数据处理模块

3、总体仿真 

七、实测展示

 八、说明


一、要求:

        利用Altera公司的FPGA开发软件Quartus 13.1采用混合设计实现方波信号频率和占空比测量。 

二、指标要求 

1) 待测方波信号频率范围1Hz~1MHz,测量精度优于0.1Hz

2) 待测方波信号占空比范围1%~95%,测量精度优于1%

3) 频率数据显示精度0.1Hz,给出8位数字的BCD码结果

4) 占空比给出2位整数百分比的BCD码结果

三、 等精度测频设计原理

 设计原理流程图如图 1:

1设计原理流程图 

         将在相同时间内对被测信号和标准信号同时计数 ,D触发器保证实际闸门时间与被测信号同步,消除被测信号计数误差;读数据模块两个技术模块数据同时读入送进数据处理模块处理;数据处理模块将读入的数据计算出频率与占空比后送入显示模块;显示模块将频率与占空比显示在数码管上。

等精度测频率原理:

        等精度测频法本质上是多周期同步测频,它是在直接测频基础上发展起来的,在目前的测频系统中得到了越来越广泛的应用。等精度测频时,同时对标准信号和待测信号计数,而且实际闸门时间不是固定的,而是被测信号的整数倍,即与被测信号保持同步,因此消除了对被测信号计数所产生的士1个数字误差,使测量精度大为提高。

四、时序分析: 

         如图 2所示,Tx待测型号在Cl的预置闸门信号期间进行采样计数,使得在En为高时Tx总是整数倍出现。 

2时序分析图 

        设在一次实际闸门时间τ中计数器对被测信号的计数值为Nx,对标准信号的计数值为Ns。标准信号的频率为fs,则被测信号的频率为:

                                               fx=(Nx/Ns)·fs                                                                   (1)         

五、模块设计 

        如图 3所示,计数器模块同时计数频率Ns、Nx值与占空比Nh值,数值传给数据处理模块,由数据模块switch信号切换显示数据的不同位,数值传给数码管显示模块显示。

        由一个D触发器实现预置闸门与待测信号的同步,触发信号为Tx,后面四个D触发器为读信号和清零信号延时,由50Mhz标准信号触发,延时两个标准信号单元为Read信号,延时四个标准单元为clr信号;复位信号控制五个D触发器的使能信号。

 

3系统总体设计图 

 模块代码展示:

1、计数器

频率计数器:

module counter(clk,En,clr,tsq);
input clk,clr,En;
output reg [27:0]tsq;
always@(posedge clk or negedge clr)
begin
		if(!clr)
		begin
			tsq<=28'b0;
		end
		else
			begin
				if(En)
				begin
					tsq<=tsq+1;
				end
			end
end
endmodule

 占空比计数器:

module counter_duty(clk,En,clr,Tx,duty,tsq);
input clk,clr,En,Tx;
output reg [27:0]duty;
output reg [27:0]tsq;
always@(posedge clk or negedge clr)
begin
		if(!clr)
		begin
			duty<=28'b0;
			tsq<=28'b0;
		end
		else
			begin
				tsq<=tsq+1;
				if(En&Tx)
					duty<=duty+1;//高电平数
			end
end
endmodule

2、读数据

module read_value(read,Ns_data_in,Ns_data_out,TX_data_in,TX_data_out,Nh_data_in,Nh_data_out);   
input read;
input [27:0] Ns_data_in,TX_data_in,Nh_data_in;
output reg [27:0] Ns_data_out,TX_data_out,Nh_data_out;

always@(negedge read) 
begin
  TX_data_out<= TX_data_in;
  Ns_data_out<=Ns_data_in+28'd4;
  Nh_data_out<=Nh_data_in+28'd4;
end
endmodule

3、数据处理

module data_processing(Ns_data,TX_data,Fre_data_INT,Fre_data_Fra,duty,duty_rs);   
input [27:0] Ns_data,TX_data,duty;
reg [55:0] temp;
reg [27:0] remainder;

output reg [9:0]duty_rs;				//占空比
output reg [27:0] Fre_data_INT;   // 频率整数部分
output reg [6:0]  Fre_data_Fra;    // 频率小数部分

always@(Ns_data,TX_data) 
begin
  temp = 50_000_000*TX_data;
  Fre_data_INT = temp/Ns_data;
  remainder = temp%Ns_data;  
  Fre_data_Fra= remainder*100/Ns_data;   // 保留2位小数
  duty_rs =(duty*1000)/Ns_data;
end
endmodule

4、数码管显示模块

module display(switch,Fre_data_INT,Fre_data_Fra,clk_50M,duty,Dis1,Dis2,Dis3,Dis4,Dis5,Dis6);
input [27:0] Fre_data_INT;
input [6:0] Fre_data_Fra;
input [9:0] duty;
input switch;
input clk_50M;
output reg [3:0] Dis1;
output reg [3:0] Dis2;
output reg [3:0] Dis3;
output reg [3:0] Dis4;
output reg [3:0] Dis5;
output reg [3:0] Dis6;

reg [27:0] Ns_data;

always@(clk_50M)
begin
	if(switch)//前六位
	begin
		Dis1[3:0]<= Fre_data_INT/1_000_000;
		Dis2[3:0]<= (Fre_data_INT%1_000_000)/100000;
		Dis3[3:0]<= (Fre_data_INT%100000)/10000;
		Dis4[3:0]<= (Fre_data_INT%10000)/1000;
		Dis5[3:0]<= (Fre_data_INT%1000)/100;
		Dis6[3:0]<= (Fre_data_INT%100)/10;
	end
	else//后六位(其中最后三位为占空比数据)
		begin
			Dis1[3:0]<= Fre_data_INT%10;
			Dis2[3:0]<= 0;
			Dis3[3:0] <= Fre_data_Fra/10;
			Dis4[3:0]<=duty/100;
			Dis5[3:0]<=(duty%100)/10;
			Dis6[3:0]<=duty%10;
		end
end
endmodule

六、仿真分析

1、计数模块

        在计数模块中Ns为标准信号个数,Nx为待测信号个数,Nh为高电平计数个数,tsq为频率值,duty为占空比值。

       计算公式tsq = 50_000_000*Nx/Ns;  duty=Nh/Ns;用quartus自带仿真,仿高频信号。

A、测量1Mhz频率占空比为50%的信号的频率。

        设置Tx为1Mhz,预置闸门preset_gate周期为20us,clk_50M为标准50Mhz,reset为使能信号,始终为高。

理论测得tsq=500。

        实际仿真测得tsq=496,由于clr信号延时四个标准信号周期,所以tsq=500-4,后期数据处理模块会将Ns补4,符合理论结果,如图 4所示。

 4计数器模块频率计数仿真图 

 B、Em设置为1Mhz,占空比为46%的信号的占空比

        理论测得Nh=230,Ns=500,duty计算得460(乘以1000后的结果,以便显示)实际仿真测得duty=460,Nh补4后符合理论结果(原因同上),如图 5所示。

5计数器模块占空比计数仿真图 

2、数据处理模块

        Duty_rs为占空比值*1000,Fre_data_INT为频率整数值,Fre_data_Fra为频率小数值Read为读信号,switch为显示位输出转换开关。

仿真1MHz,占空比为46%的信号。

根据公式tsq = 50_000_000*Nx/Ns;  duty=Nh/Ns。

理论测得Duty_rs=460,fre_data_INT=1000000,fre_data_Fra=0。

实际仿真测得Duty_rs=460,fre_data_INT=1000000,fre_data_Fra=0如图 6。

6数据处理模块仿真图 

3、总体仿真 

        总体仿真电路图如图 7所示,随机选取了5656.5Hz占空比为55.5%的信号测试,仿真结果如下图所示。频率仿真得到fre =5656.5hz,占空比为55.5%符合题目设计要求。 

7总体仿真电路图 

测试文件设置如图 8

单位1ps,精度1ps。

8测试文件图 

图 9总体仿真测试图 

 Switch为1时输出频率高六位,为0时输出低一位和小数点后一位,以及用0代替小数点(此模块小数点没接管脚),和占空比(最后一位为小数后一位)。如上图9所示。

七、实测展示

        用50Mhz分频的待测信号,测量280.8hz,占空比50%信号。(随机选择)

 10生成待测信号分频器设计

11前六位显示 

12后六位显示

        如图 11前六为分别是频率的小数点前2至7位,如图 12第一位是频率的小数点前1位,第二位是用来当小数点的0(此块板子没有接小数点管脚),第三位是频率的小数点后一位,后三位用于表述占空比,其中最后一位是占空比小数点后一位;可见测得数据位,频率:280.8hz,占空比为50.0%。

        将图 10中的第7行89000改为85000,可改变其占空比,理论计算得89000/178000=47.7%,实际测得也为47.7%,如下图所示。

 图 13改变占空比后的后六位显示

 八、说明

        因为实际测量信号不是由信号发生器生成的标准信号,而是通过50Mhz分频产生而得, 根据实际测量结果可知,较高频的测量误差较大,其原因是因为其待测信号是由标准50Mhz分频而得,在生成较高频时由于  (数据处理+程序运行时间)/理论分频的周期 的比值较大,数据处理时间+程序运行时间使实际分频周期偏大,使得实际测得信号频率偏小,误差较大;待测频率越高误差越大。

        如果使用信号发生器作为标准输入信号,误差应该符合题目需求,但是没有实测过。

有关基于FPGA等精度的实时测量频率和占空比的更多相关文章

  1. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  2. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  3. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  4. [工业相机] 分辨率、精度和公差之间的关系 - 2

    📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年

  5. ruby-on-rails - ruby on rails 模型验证中的浮点精度 - 2

    我正在尝试使用正则表达式验证美元金额:^[0-9]+\.[0-9]{2}$这工作正常,但每当用户提交表单并且美元金额以0(零)结尾时,ruby(或rails?)将0砍掉。所以500.00变成500.0,因此正则表达式验证失败。有没有办法让ruby​​/rails保持用户输入的格式,而不管尾随零? 最佳答案 我假设您的美元金额是小数类型。因此,用户在字段中输入的任何值在保存到数据库之前都会从字符串转换为适当的类型。验证适用于已转换为数字类型的值,因此在您的情况下,正则表达式并不是真正合适的验证过滤器。不过,您有几种可能性可以解决这个问

  6. ruby - 在没有基准或时间的情况下用 Ruby 测量用户时间或系统时间 - 2

    因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实

  7. ruby-on-rails - (Ruby,Rails) 基于角色的身份验证和用户管理...? - 2

    我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源

  8. ruby - 在 Rakefile 中动态生成 Rake 测试任务(基于现有的测试文件) - 2

    我正在根据Rakefile中的现有测试文件动态生成测试任务。假设您有各种以模式命名的单元测试文件test_.rb.所以我正在做的是创建一个以“测试”命名空间内的文件名命名的任务。使用下面的代码,我可以用raketest:调用所有测试require'rake/testtask'task:default=>'test:all'namespace:testdodesc"Runalltests"Rake::TestTask.new(:all)do|t|t.test_files=FileList['test_*.rb']endFileList['test_*.rb'].eachdo|task|n

  9. ruby - 如何使用 Ruby 基于字母数字字符串生成颜色? - 2

    我想要像“嘿那里”这样的东西变成,例如,#316583。我希望将任意长度的字符串“归结”为十六进制颜色。我不知道从哪里开始。我在想,每个字符串的MD5散列都是不同的-但如何将该散列转换为十六进制颜色数字? 最佳答案 你可以只取几位前几位:require'digest/md5'color=Digest::MD5.hexdigest('Mytext')[0..5] 关于ruby-如何使用Ruby基于字母数字字符串生成颜色?,我们在StackOverflow上找到一个类似的问题:

  10. 【自动驾驶环境感知项目】——基于Paddle3D的点云障碍物检测 - 2

    文章目录1.自动驾驶实战:基于Paddle3D的点云障碍物检测1.1环境信息1.2准备点云数据1.3安装Paddle3D1.4模型训练1.5模型评估1.6模型导出1.7模型部署效果附录show_lidar_pred_on_image.py1.自动驾驶实战:基于Paddle3D的点云障碍物检测项目地址——自动驾驶实战:基于Paddle3D的点云障碍物检测课程地址——自动驾驶感知系统揭秘1.1环境信息硬件信息CPU:2核AI加速卡:v100总显存:16GB总内存:16GB总硬盘:100GB环境配置Python:3.7.4框架信息框架版本:PaddlePaddle2.4.0(项目默认框架版本为2.3

随机推荐