首页 > 编程语言 >【频率计】基于ISE+VHDL编程的多功能数字频率计

【频率计】基于ISE+VHDL编程的多功能数字频率计

时间:2022-10-10 15:39:26浏览次数:48  
标签:TSTEN CNT CNT10 dout VHDL wire 频率计 信号 ISE


1.软件版本

ISE14.7
2.本算法理论知识

1 数字频率计的基本原理

频率测量的方法常用的有测频法和测周法两种。

·测频法

测频法的基本思想是让计数器在闸门信号的控制下计数1秒时间,计数结果是1秒内被测信号的周期数,即被测信号的频率。若被测信号不是矩形脉冲,则应先变换成同频率的矩形脉冲。测频法的原理框图如图3-1所示。

图中,秒脉冲作为闸门信号,当其为高电平时,计数器计数;低电平时,计数器停止计数。显然,在同样的闸门信号作用下,被测信号的频率越高,测量误差越小。当被测频率一定时,闸门信号高电平的时间越长,测量误差越小。但是闸门信号周期越长,测量的响应时间也越长。例如,闸门信号高电平时间为1秒,被测信号频率的真值为2Hz,如图3-2所示。

【频率计】基于ISE+VHDL编程的多功能数字频率计_多功能数字频率计

图4-1频率测量原理框图

可知,无论被测信号的频率是多少,测量时可能产生的最大绝对误差均为±1Hz,即

                   f测-f真=±1Hz

所以,最大相对误差为:σmax= (f测-f真)/ f真=±1/ f真

由上式可知,在闸门信号相同时,测频法的相对误差与被测信号的频率成反比。因此测频法适合于测量频率较高的信号。

【频率计】基于ISE+VHDL编程的多功能数字频率计_多功能数字频率计_02

图4-2 测频法的误差

·测周法

当被测信号频率较低时,为保证测量精度,常采用测周法。即先测出被测信号的周期,再换算成频率。测周法的实质是把被测信号作为闸门信号,在它的高电平的时间内,用一个标准频率的信号源作为计数器的时钟脉冲。若计数结果为N,标准信号频率为f1,则被测信号的周期为

               T = T1·N

被测信号的频率为

                  f = 1/T1·N = f1/N

利用测周法所产生的最大绝对误差,显然也等于±1个标准信号周期。如果被测信号周期的真值为T真= T1·N,则T测= T1·(N±1)

               σmax= (f测-f真)/ f真= T真/T测 – 1=±1/(N±1)

由上式可知,对于一定的被测信号,标准信号的频率越高,则N的值越大,因而相对误差越小。

 2 数字频率计的基本设计方案

频率信号易于传输,抗干扰性强,可以获得较好的测量精度。因此,频率检测是电子测量领域最基本的测量之一。本文的数字频率计是按照计算每秒内待测信号的脉冲个数的基本原理来设计,此时取闸门时间为1秒。

数字频率计的关键组成部分包括一个测频控制信号发生器、一个计数器和一个锁存器,另外包含信号整形电路、脉冲发生器、译码驱动电路和显示电路,其原理框图如图1所示。

【频率计】基于ISE+VHDL编程的多功能数字频率计_数码管_03

图4-1 数字频率计原理框图

工作过程:系统正常工作时,脉冲信号发生器输入1Hz的标准信号,经过测频控制信号发生器的处理,2分频后即可产生一个脉宽为1秒的时钟信号,以此作为计数闸门信号。测量信号时,将被测信号通过信号整形电路,产生同频率的矩形波,输入计数器作为时钟。当计数闸门信号高电平有效时,计数器开始计数,并将计数结果送入锁存器中。设置锁存器的好处是显示的数据稳定,不会由于周期性的清零信号而不断闪烁。最后将锁存的数值由外部的七段译码器译码并在数码管上显示。

3.核心代码

module REG32B(
load,
din,
dout
);
input load;
input[39:0]din;
output[39:0]dout;
reg[39:0]dout;
always @(load or din)
begin
if(load==1'b1)
dout<=din;
end
endmodule
•系统总体设计
module FREQ(
fsin,
clk,
dout2
);
input fsin;
input clk;
output[39:0]dout2;
wire TSTEN;
wire CLR_CNT;
wire LOAD;
TESTCTL TESTCTL_u(
.CLK (clk),
.TSTEN (TSTEN),
.CLR_CNT (CLR_CNT),
.LOAD (LOAD)
);
wire[39:0]dout;
wire s1;
wire s2;
wire s3;
wire s4;
wire s5;
wire s6;
wire s7;
wire s8;
wire s9;
wire s10;
CNT10 CNT10_u1(
.clk (fsin),
.rst (CLR_CNT),
.en (TSTEN),
.cq (dout[3:0]),
.carry_out (s1)
);

CNT10 CNT10_u2(
.clk (s1),
.rst (CLR_CNT),
.en (TSTEN),
.cq (dout[7:4]),
.carry_out (s2)
);
CNT10 CNT10_u3(
.clk (s2),
.rst (CLR_CNT),
.en (TSTEN),
.cq (dout[11:8]),
.carry_out (s3)
);
CNT10 CNT10_u4(
.clk (s3),
.rst (CLR_CNT),
.en (TSTEN),
.cq (dout[15:12]),
.carry_out (s4)
);
CNT10 CNT10_u5(
.clk (s4),
.rst (CLR_CNT),
.en (TSTEN),
.cq (dout[19:16]),
.carry_out (s5)
);
CNT10 CNT10_u6(
.clk (s5),
.rst (CLR_CNT),
.en (TSTEN),
.cq (dout[23:20]),
.carry_out (s6)
);

CNT10 CNT10_u7(
.clk (s6),
.rst (CLR_CNT),
.en (TSTEN),
.cq (dout[27:24]),
.carry_out (s7)
);
CNT10 CNT10_u8(
.clk (s7),
.rst (CLR_CNT),
.en (TSTEN),
.cq (dout[31:28]),
.carry_out (s8)
);
CNT10 CNT10_u9(
.clk (s8),
.rst (CLR_CNT),
.en (TSTEN),
.cq (dout[35:32]),
.carry_out (s9)
);
CNT10 CNT10_u10(
.clk (s9),
.rst (CLR_CNT),
.en (TSTEN),
.cq (dout[39:36]),
.carry_out (s10)
);
REG32B REG32B_u(
.load (LOAD),
.din (dout),
.dout (dout2)
);
endmodule

4.操作步骤与仿真结论

     一般对于系统的仿真,我们均采用Modelsim进行,我们在建立工程的时候,将仿真设置为Modelsim,如下图所示:

【频率计】基于ISE+VHDL编程的多功能数字频率计_基于ISE_04

图4 modelsim仿真设置

下面我们将对系统进行详细的仿真测试,由于系统要求精度为10e-1到10e8,我们将对10个数量级的频率分别进行测试。

·0.1HZ

【频率计】基于ISE+VHDL编程的多功能数字频率计_数码管_05

图5 0.1HZ仿真效果

·1HZ

【频率计】基于ISE+VHDL编程的多功能数字频率计_多功能数字频率计_06

图6 1HZ仿真效果

·10HZ

【频率计】基于ISE+VHDL编程的多功能数字频率计_多功能数字频率计_07

图7 10HZ仿真效果

·100HZ

【频率计】基于ISE+VHDL编程的多功能数字频率计_基于ISE_08

图8 100HZ仿真效果

·1KHZ

【频率计】基于ISE+VHDL编程的多功能数字频率计_多功能数字频率计_09

图9 1kHZ仿真效果

·10KHZ

【频率计】基于ISE+VHDL编程的多功能数字频率计_基于ISE_10

图10 10KHZ仿真效果

5.参考文献

[1]凌振宝, 叶剑峰, 孙正光. 多功能数字频率计的设计与研究[J]. 吉林大学学报:信息科学版, 2011, 29(4):7.

A37-3

6.完整源码获得方式

方式1:微信或者QQ联系博主

方式2:​​订阅MATLAB/FPGA教程,免费获得教程案例以及任意2份完整源码​

标签:TSTEN,CNT,CNT10,dout,VHDL,wire,频率计,信号,ISE
From: https://blog.51cto.com/u_15815923/5743781

相关文章

  • C++入门到理解set/multiset容器、pair对组
    一:基本概念在插入元素的时候会自动排好序,比如插入的是1,3,4,2,打印是1,2,3,4.底层是通过二叉树结构实现的,set容器不允许有重复的元素,但是multiset允许有元素重复。二:构造,遍历,赋值#i......
  • js promise resolve()的用法
    Promise对象代表一个异步操作,有三种状态:Pending(进行中)、Resolved(已完成,又称Fulfilled)和Rejected(已失败)。resolve(data)将这个promise标记为resolved,然后进行下一步then((......
  • Js的Promise、Generator,Async/await 区别
    我们知道JavaScript是单线程语言,如果没有异步编程非得卡死。以前,异步编程的方法有下面四种回调函数事件监听发布/订阅Promise对象现在据说异步编程终极解决方案是—......
  • 使用Git+TortoiseGit+Github进行代码管理
    前言除了在公司的时候会使用Git进行代码管理,个人代码几乎都是频繁复制来进行版本管理。现在个人代码混乱到无法管理,还是得使用Git来进行版本管理。一、软件下载1、Git(分......
  • javascript中的糖衣语法--Promise对象
    一、Promise的诞生1、回调地狱最初javascript的异步实现就是使用回调函数。回调地狱就是:一个函数需要等它的回调函数(或者回调和回调的回调...)执行完毕之后再执行。简单......
  • Noise2Noise去高斯噪声、去文本噪声
    基础信息​​非常好的一篇论文讲解​​​​官方实现​​​​非官方实现​​我这里跑的代码是​​非官方实现​​环境搭建(Cuda9.1):cuda9.1GTX108011Gsourceactivaten......
  • Red Hat Enterprise Linux release 8.0 (Ootpa)-使用fdisk管理分区
    一、Linux磁盘设备的命名规则    Linux中的一切都是文件,硬件设备也不例外。既然是文件,就必须有文件名称。     Udev设备管理器在引导时动态创建或删除......
  • Red Hat Enterprise Linux release 8.0 (Ootpa)-性能调优工具Tuned
    一、Tuned简介    Tuned是RedHatLinux操作系统自带的性能调优工具,通过针对特定应用场景提供配置来改善系统性能,自RedHatEnterpriseLinux/CentOS的6.3版本开......
  • 【STL】关联式容器 - Set和Multiset
    Set和MultisetSTL提供的vector,list和deque属于序列式容器即可序群集,每个元素均有固定的位置,取决于插入时机和地点,和元素值无关。如果以追加的方式对一个群集置入六个元素......
  • Red Hat Enterprise Linux release 8.0 (Ootpa)-添加交换分区swap
    添加交换分区:向您的系统添加一个额外的交换分区567MiB.交换分区应在系统启动时自动加载。不要删除或以任何方式改动系统上的任何现有分换分区。   1、fdisk-l查看......