这篇文章主要介绍的是利用FPGA开发板设计一款简易的频率测量仪器,采用的开发板仍旧是小梅哥AC620V2的开发板。
首先我们要了解建议频率计设计的基本原理:设计频率计的思路也是很简单的,我们的目的就是为了测出待测脉冲的频率(这里测量的主要是PWM方波),f=1/T,所以待测信号在一秒钟内的周期数就是待测信号的频率。首先我们需要一个时间控制信号,也就是一秒的计数时间,然后我们需要一个计数器,这里我采用的是四位BCD计数器,并且让他满10置零并产生进位,从而实现10进制计数的效果,之后需要将在一秒内计数所得到的值进行锁存,最后传给译码显示部分。
所以我们所需要的底层模块已经很清晰了:
RTL视图
控制信号模块:利用系统时钟(sys_clk=50MHz)来产生计数开始和结束的标志(使能信号En)和计数结果稳定进行锁存的锁存信号(Load)还有计数复位信号(RST)。
四位BCD计数模块:对待测信号一秒内的周期(上升沿)进行技术并将结果转化成10进制,因为有8个数码管,所以我们要对四位计数器例化8次。
锁存模块:这个就很简单了,但也是很重要的一部分,主要功能就是在锁存信号到来时,将计数所得到的值进行一个锁存。
数码管显示模块:这个就比较熟悉了,在上篇文章我们也有讲到三线数码管显示的实现,主要是译码部分和74HC595芯片驱动部分。
下面是各个部分的代码
首先是控制信号产生模块代码
module HZ (clk,rst_n,clk_1hz,en_cnt,load,rst_cnt);
input clk;
input rst_n;
output reg clk_1hz;
output reg en_cnt;
output reg load;
output rst_cnt;
reg [24:0]cnt;
//计数器
always@(posedge clk,negedge rst_n)
if(!rst_n)
cnt <= 25'd0;
else if(cnt == 25'd24_999_999)
cnt <= 25'd0;
else
cnt <= cnt + 1'b1;
//1hz
always@(posedge clk,negedge rst_n)
if(!rst_n)
clk_1hz <= 1'b0;
else if(cnt == 25'd24_999_999)
clk_1hz <= ~clk_1hz;
else
clk_1hz <= clk_1hz;
//en_cnt使能
always@(posedge clk_1hz,negedge rst_n)
if(!rst_n)
en_cnt <= 1'b0;
else
en_cnt <= ~en_cnt;
always@(*)
load <= ~en_cnt;
//产生rst_load信号
assign rst_cnt = (clk_1hz || en_cnt);
endmodule
然后是四位计数器的代码,这个地方分成了两个部分,一个是四位BCD计数器代码,另一个是计数器的顶层模块,来实现八位数码管十进制显示功能。
四位BCD计数器
module BCD(clk,rst_n,en,cin,cout,q);
input clk; //待测信号
input rst_n; //复位信号
input en; //使能信号
input cin; //进位输入
output reg cou