简易频率计课程设计(Verilog)——学习笔记

这篇文章主要介绍的是利用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
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值