我是靠谱客的博主 高兴小蘑菇,最近开发中收集的这篇文章主要介绍基于FPGA低频方波测量-频率与占空比,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述


  •  题目要求

设计基于FPGA的低频方波频率、占空比测量仪。实时测量输入方波信号的频率与占空比。


  •  指标要求

1) 输入方波频率1Hz~1kHz;幅度VH=3V, VL=0V

2) 测量误差优于10-4;显示分辨率0.1Hz

3) 采用4位数码管显示,其中3位整数,1位小数

4) 拨码开关控制测频率与测占空比的功能转换

  •  设计原理:

设计原理流程图如图 1:

图 1设计原理流程图

将低频被测信号通过I/O口送入,通过一个二分频单元,二分频后作为计数器的使能信号;延时两个标准信号周期作为读信号,读取计数器计数值,传给数据处理模块;延时四个标准信号周期作为清零信号,将计数器置零,重新计数;最后经过数据处理计算出频率值与占空比值,再传给数码管显示模块,显示出频率或占空比。

  1.  测频率
  1.  测频法

在确定的闸门时间 Tw 内,记录被测信号的变化周期数(或脉冲个数) Nx。如图 2所示。

图 2测频法原理图

被测信号频率为: fx = NxTw                                                                                      (1)

  1.  测周法

在待测信号的一个周期Tx内,记录频率为fs的标准信号周期数Ns。如图 3。

图 3测周法原理图

被测信号频率为:fx = fsNs                                                                                        (2)

因为测频法和测周法都会产生±1个字误差, 且测量精度与NxNs有关。为保证精度, 一般低频信号采用测周法, 高频信号采用测频法。题目要求测量范围属于低频范围,所以测量频率选用测频法较好。

  •  时序分析

   如图 4所示,输入被测信号后,经过二分频模块得到信号En,在En为高电平时,计数标准信号周期个数Ns,Em同被测信号;当En与Em同时为高时,计数标准信号周期个数Nh;

En延时2个标准信号周期后读取Ns,Nh的值送入数据处理模块,延时4个标准周期后清零信号对计数器计数值进行清零。

图 4时序分析图

  •  模块设计

如图 5所示,计数器模块同时计数频率Ns值与占空比Nh值,数值传给数据处理模块,由数据模块switch信号切换频率数值或占空比数值输出,数值传给数码管显示模块显示。

由反相器与一个D触发器设计二分频单元,触发信号为Tx,后面四个D触发器为读信号和清零信号延时,由50Mhz标准信号触发,延时两个标准信号单元为Read信号,延时四个标准单元为clr信号;复位信号控制五个D触发器的使能信号。

图 5系统总体设计图

模块代码展示:

1.计数器

module Counter(clk,En,Em,clr,tsq,duty);
input clk,clr,En,Em;
output reg [25:0] duty;
output reg [25:0] tsq;
always@(posedge clk or negedge clr)
begin 
    if(!clr)
	begin
		tsq<=26'd0;
		duty<=26'd0;
	end
	else
	begin 
		if(En)
		begin
			tsq<=tsq+1;
			if(En&Em)
			duty<=duty + 1;
		end
	end
end
endmodule

2.数据处理

module Data_Processing(Ns,Nh,Read,switch,data_out);
input Read,switch;//读信号与频率占空比切换开关
input [25:0] Ns;//计数clk周期数输入
input [25:0] Nh;//高电平clk周期数输入
reg [13:0] Fre_data;//频率
reg [13:0] Duty_data;//占空比
output reg [15:0] data_out;//输出数据
reg [30:0] Ns_data;//计数clk周期数
reg [30:0] Nh_data;//高电平clk周期数
always@(negedge Read)
begin
Ns_data <= Ns+4;//修正
Nh_data <= Nh;
end
always@(Ns_data)
begin
	if(switch) 
	begin//计算评率
		Fre_data = 500000000/Ns_data;
		data_out[15:12] = Fre_data/1000;
		data_out[11:8] = (Fre_data%1000)/100;
		data_out[7:4] = (Fre_data%100)/10;
		data_out[3:0] = Fre_data%10;
	end
	if(!switch)
		begin//计算占空比
		Duty_data = (Nh_data*1000)/Ns_data+1;
		data_out[15:12] = 0;
		data_out[11:8] = (Duty_data%1000)/100;
		data_out[7:4] = (Duty_data%100)/10;
		data_out[3:0] = Duty_data%10;
		end
end
endmodule

3.数码管显示模块

module multi_disp(Data_in,clk_50M,smg_en,Q,h,clk_1k);
input clk_50M;
input[15:0] Data_in;
output reg[3:0] smg_en=0;
output reg[3:0] Q=0;
output reg h=0;
output reg clk_1k=0;
reg [31:0] counter=0;
reg [1:0] cnt=0;
parameter Nmax=32'd25_000; //1k
always@(posedge clk_50M)
begin
	if(counter==Nmax-1) 
	begin
	   counter<=0;
		clk_1k<=~clk_1k;
	end
	else 
	   counter<= counter + 1;
end
always@(posedge clk_1k)
begin
	if(cnt==3) 
	   cnt<=0;
	else 
	   cnt <= cnt + 1;
end
always@(posedge clk_1k)
begin 
		case(cnt)
		0:begin smg_en<=4'b0001; Q<=Data_in[15:12];h<=0; end
		1:begin smg_en<=4'b0010; Q<=Data_in[11:8]; h<=0; end
	    2:begin smg_en<=4'b0100; Q<=Data_in[7:4];  h<=1; end
		3:begin smg_en<=4'b1000; Q<=Data_in[3:0];  h<=0; end
		endcase
end 
endmodule
  •  仿真分析
  1.  计数模块:

         在计数模块中tsq为频率计数值,duty为占空比计数值,并非占空比值。

         计算公式tsq=50_000_000/fre  duty=fre*占空比

用quartus自带仿真,仿高频信号,由于测周法实用于测低频,如果高频信号也能满足,则低频信号也能满足。

  1. 测量100Khz频率占空比为50%的信号。

设置Em为100Khz,En为Em的二倍频200Khz,clk为标准50Mhz,clr为En信号延时80ns信号(即4个标准信号周期)。

理论测得tsq=500,duty=250。

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

图 6计数器模块第一组数据仿真图

  1. Em设置为168Khz,占空比为46%的信号,En设置为336Khz占空比为50%,clr为En延时80ns。

理论测得tsq=298(297.6四舍五入),duty=137(136.9四舍五入)

实际仿真测得tsq=294,duty=137,tsq补4后符合理论结果,如图 7所示。

图 7计数器模块第二组数据仿真图

  1.  数据处理模块:

              Nh为占空比计数值,Ns为频率计数值,Read为读信号,switch为占空比频率输出转换开关,Duty_data为占空比值*10,Fre_data为频率值*10(因为测量精度为小数点后一位),

Data_out为输出数据。

              A、为了随机性,随机选择一个低频信号,596Hz,占空比为55%的信号。

根据公式Ns=50_000_000/频率,Nh=Ns*占空比。将Ns设为83893,Nh为46141。

理论测得Duty_data=550,fre_data=5960

 实际仿真测得Duty_data=550,fre_data=5959频率与理论测量值相差1,但误差满足设计要求。

由于在仿真与实际测试中发现,Duty_data在低频范围内测量均存在与实际值少1的误差,索性在data_out的最后一位+1,优化测量误差,但这只是一个不严谨的方法,只是在题目要求中可以满足。如图 8。

图 8数据处理模块第一组仿真图

              B、随机选择452hz、占空比29%的信号,将Ns设为110619,Nh设为32080。

              理论测得Duty_data=290,Fre_data=4520。

              实际仿真测得Duty_data=290,Fre_data=4519。频率与理论值相差1,误差符合设计要求。

图 9数据处理模块第二组仿真图

  1.  总体仿真:

              总体仿真电路图如图 10所示,随机选取了856Hz占空比为50%的信号测试,仿真结果如下图所示。频率仿真得到fre_data=8650,占空比为499,dout补1后输出得500符合题目设计要求。

图 10总体仿真电路图

测试文件设置如图 11

单位1ns,精度1ns。

图 11测试文件图

图 12总体仿真测试图(错误版)

Switch为1时输出频率值8560,为0时输出低电平049a即500。如上图 12所示。

此仿真为错误,原因是为了弥补误差,我在数据处理模块中dout[3:0]处+1,所以dout[3:0]本为9时,+1后变成了a,由于数码管译码只能译0—9,所以在数码管上无显示a,在实测中最后一位就无法显示。

图 13总体仿真测试图(修正版)

   发现错误后,将Duty_data+1后再分配给dout,将错误改正。如上图 13所示。

  •  实测展示
  1.  最终版

最终版本,测量630hz,占空比20%信号。

图 14信号发生器界面

 图 15占空比测量                                            图 16频率测量

  1.  初版

初次测试中出现的问题如图 17:在1~1000hz范围内占空比总是少0.1。

图 17三组初版设计实际测量结果

   将设计改良后,测试时扭动信号发生器旋钮改变被测信号频率发现,频率测量实际值与信号发生器一致,扭动信号发生器改变被测信号占空比发现,占空比测量实际值也与信号发生器均一致。(扭动频率旋钮步进为10hz,扭动占空比旋钮步进0.1%与1%)。

最后

以上就是高兴小蘑菇为你收集整理的基于FPGA低频方波测量-频率与占空比的全部内容,希望文章能够帮你解决基于FPGA低频方波测量-频率与占空比所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部