目录
前言
这篇博客大概是2017年写的,目前已经是2020年8月不到,今天维护了一下但是并未保存,很受伤,不得不重新在维护一次。
最近看到很多评论,说程序有问题,于是我就对这个程序进行一次测试。
并更新博文程序与其他部分内容。
简易数字频率计原理
原理:数字频率计的原理十分简单,简单的就是一句话和一幅图而已。
一句话:测量被测信号的频率,要清楚频率的定义,一言以蔽之,就是1s中信号的周期数。
根据频率的定义,我们测量被测信号1s中变化的次数即可,即1s中的周期数。
首先我们设置一个基准时钟信号,频率为1Hz,从第一个上升沿开始计数(被测信号的上升沿数),直到下一个上升沿到达时停止计数,对数据进行锁存,再到达下一个上升沿时,对计数器进行清零,准备下一次的测量。
根据以上描述,得到相关信号的关系:
一幅图:
我尝试使用wavedrom画了这个图:
本图是简易频率计的工作时序图,从图中 可以看出:
基准信号的第一个上升沿到达时,计数使能信号有效,计数器开始计数;
第二上升沿到达时,计数结束,锁存使能有效,计数数据开始锁存;
第三个上升沿到达时,清零信号有效,对计数器的输出清零,准备下一次的测量。
一个测量过程需要3 sec(重要)。
下面是数字频率计的原理图:
由此原理图可以清晰的理解下面的verilog HDL程序:
程序可以分为四个部分,一个顶层模块,三个子模块:
顶层:
`timescale 1ns / 1ps
//
// blog: https://blog.csdn.net/Reborn_Lee
// Engineer: 李锐博恩
// Design Name: frequency detect
// Module Name: freDetect
//
//
module freDetect(
input wire clk_1Hz, //1Hz基准频率,周期1s;
input wire fin, //输入待测信号
input wire rst, //复位信号
output wire [3:0] d0,
output wire [3:0] d1,
output wire [3:0] d2,
output wire [3:0] d3,
output wire [3:0] d4,
output wire [3:0] d5,
output wire [3:0] d6,
output wire [3:0] d7
);
wire [3:0] q0, q1, q2, q3, q4, q5, q6, q7; //中间数据
//控制模块实例
control control_inst(.clk_1Hz(clk_1Hz),
.rst(rst),
.count_en(count_en),
.latch_en(latch_en