简易数字频率计
原理:数字频率计的原理十分简单,简单的就是一句话和一幅图而已。
一句话:测量被测信号的频率,要清楚频率的定义,一言以蔽之,就是1s中信号的周期数,这不就是周期的倒数吗?
根据频率的定义,我们测量被测信号1s中变化的次数即可,即1s中的周期数。
首先我们设置一个基准时钟信号,频率为1Hz,从第一个上升沿开始计数(被测信号的上升沿数),直到下一个上升沿到达时停止计数,对数据进行锁存,再到达下一个上升沿时,对计数器进行清零,准备下一次的测量。
基准信号的第一个上升沿到达时,计数使能信号有效,计数器开始计数;
第二上升沿到达时,计数结束,锁存使能有效,计数数据开始锁存;
第三个上升沿到达时,清零信号有效,对计数器的输出清零,准备下一次的测量。
一个测量过程需要3 sec(重要)。
verilog HDL程序:

//简易频率计设计  module freDetect(clk_1Hz, fin, rst, d0, d1, d2, d3, d4, d5, d6, d7);  input clk_1Hz;//1Hz基准频率  input fin; //待测信号  input rst; //复位信号  output[3:0] d0, d1, d2, d3, d4, d5, d6, d7; //8位显示测量数据  wire[3:0] q0, q1, q2, q3, q4, q5, q6, q7;   //中间数据  wire[3:0] d0, d1, d2, d3, d4, d5, d6, d7;  //控制模块实例  control u_control(.clk_1Hz(clk_1Hz), .rst(rst), .count_en(count_en),  .latch_en(latch_en), .clear(clear));  //计数器模块实例  counter_10 counter0(.en_in(count_en), .clear(clear), .rst(rst),  .fin(fin), .en_out(en_out0), .q(q0));  counter_10 counter1(.en_in(en_out0), .clear(clear), .rst(rst),  .fin(fin), .en_out(en_out1), .q(q1));  counter_10 counter2(.en_in(en_out1), .clear(clear), .rst(rst),  .fin(fin), .en_out(en_out2), .q(q2));  counter_10 counter3(.en_in(en_out2), .clear(clear), .rst(rst),  .fin(fin), .en_out(en_out3), .q(q3));  counter_10 counter4(.en_in(en_out3), .clear(clear), .rst(rst),  .fin(fin), .en_out(en_out4), .q(q4));  counter_10 counter5(.en_in(en_out4), .clear(clear), .rst(rst),  .fin(fin), .en_out(en_out5), .q(q5));  counter_10 counter6(.en_in(en_out5), .clear(clear), .rst(rst),  .fin(fin), .en_out(en_out6), .q(q6));  counter_10 counter7(.en_in(en_out6), .clear(clear), .rst(rst),  .fin(fin), .en_out(en_out7), .q(q7));  //锁存器模块实例  latch u_latch(.clk_1Hz(clk_1Hz), .rst(rst), .latch_en(latch_en),  .q0(q0), .q1(q1), .q2(q2), .q3(q3), .q4(q4), .q5(q5),  .q6(q6), .q7(q7), .d0(d0), .d1(d1), .d2(d2), .d3(d3),  .d4(d4), .d5(d5), .d6(d6), .d7(d7));  endmodule  //控制模块  //控制模块产生计数使能信号、锁存使能信号和计数器清零信号  module control(clk_1Hz, rst, count_en, latch_en, clear);  input clk_1Hz;  input rst;  output count_en;  output latch_en;  output clear;  reg[1:0] state; //状态信号,用于控制各种使能信号  reg count_en;  reg latch_en;  reg clear;  always @(posedge clk_1Hz or negedge rst)  if(!rst)   //复位信号有效  begin    //各种使能信号清零  state <= 2'd0;  count_en <= 1'b0;  latch_en <=1'b0;  clear <= 1'b0;  end  else    //遇到基准信号的下一个上升沿,状态变化一次,每次变化后状态持续1s  begin  case(state)  2'd0:   begin //第一个上升沿到达,开始计数,计数1个基准信号周期内待测信号的上升沿个数,此个数即为待测信号的频率  count_en <= 1'b1;  //计数使能信号有效  latch_en <=1'b0;  clear <= 1'b0;  state <= 2'd1;  end  2'd1:  begin //第二个上升沿到达,计数完成,锁存使能信号有效,测得频率锁存至锁存器中  count_en <= 1'b0;  latch_en <=1'b1;  clear <= 1'b0;  state <= 2'd2;  end  2'd2:   begin //第三个上升沿到达,清零使能信号有效,计数器清零,为下一次计数做准备  count_en <= 1'b0;  latch_en <=1'b0;  clear <= 1'b1;  state <= 2'd0; //状态清零,进入下一次测量  end  default:  begin  count_en <= 1'b0;  latch_en <=1'b0;  clear <= 1'b0;  state <= 2'd0;  end  endcase  end  endmodule  //计数模块  //模10计数器,当计数使能时计数开始,当计数器到达4'b1001,即9时,输出下一模式计数器的使能信号并将计数器清零  module counter_10(en_in, rst, clear, fin, en_out, q);  input en_in; //输入使能信号  input rst;   //复位信号  input clear; //清零信号  input fin;   //待测信号  output en_out; //输出使能,用于控制下一个计数器的状态,当输出使能有效时,下一个模10计数器计数加1  output[3:0] q; //计数器的输出,4位BCD码输出  reg en_out;  reg[3:0] q;  always@ (posedge fin or negedge rst) //输入待测信号的上升沿作为敏感信号  if(!rst) //复位信号有效,计数器输出清零  begin  en_out <= 1'b0;  q <= 4'b0;  end  else if(en_in) //进位输入使能信号有效  begin  if(q == 4'b1001) //若q = 4'b1001的话,q清零,同时进位输出使能有效,即en_out 赋值为1'b1  begin  q <= 4'b0;  en_out <= 1'b1;  end  else //若q未达到4'b1001时,每到达待测信号的一个上升沿,q加1,同时输出进位清零  begin  q <= q + 1'b1;  en_out <=1'b0;  end  end  else if(clear) //若清零信号有效,计数器清零,主要用于为下一次测量准备  begin  q <= 4'b0;  en_out <= 1'b0;  end  else  begin  q <= q;  en_out <=1'b0;  end   endmodule  //锁存器模块  //当锁存使能时,锁存器将8个模10计数器的输出值锁存并输出  module latch(clk_1Hz, latch_en, rst, q0, q1, q2, q3, q4, q5, q6, q7,  d0, d1, d2, d3, d4, d5, d6, d7);  input clk_1Hz, latch_en, rst;  input[3:0] q0, q1, q2, q3, q4, q5, q6, q7;  output[3:0] d0, d1, d2, d3, d4, d5, d6, d7;  reg[3:0] d0, d1, d2, d3, d4, d5, d6, d7;  always@ (posedge clk_1Hz or negedge rst)  if(!rst) //复位信号有效时输出清零  begin  d0 <= 4'b0; d1 <= 4'b0; d2 <= 4'b0; d3 <= 4'b0; d4 <= 4'b0;  d5 <= 4'b0; d6 <= 4'b0; d7 <= 4'b0;  end  else if(latch_en) //锁存信号有效时,将计数器的输出信号锁存至锁存器  begin  d0 <= q0; d1 <= q1; d2 <= q2; d3 <= q3; d4 <= q4;  d5 <= q5; d6 <= q6; d7 <= q7;  end  else  //上面两种情况均未发生时,输入不变  begin  d0 <= d0; d1 <= d1; d2 <= d2; d3 <= d3; d4 <= d4;  d5 <= d5; d6 <= d6; d7 <= d7;  end  endmodule

测试文件为:

`timescale 1ns/1ps  //测试模块  module freDetect_tb;  parameter CLK_1HZ_DELAY = 5_0000_0000; //1Hz基准信号  parameter FIN_DELAY = 100;             //5MHz待测信号  reg clk_1Hz;  reg fin;  reg rst;  wire[3:0] d0, d1, d2, d3, d4, d5, d6, d7;  initial  begin  rst =1'b0;  #1 rst = 1'b1;  end  initial  begin  fin = 1'b0;  forever  #FIN_DELAY fin = ~fin;  end  initial  begin  clk_1Hz = 1'b0;  forever  #CLK_1HZ_DELAY clk_1Hz = ~clk_1Hz;  end  freDetect freDetect1(.clk_1Hz(clk_1Hz), .rst(rst), .fin(fin),  .d0(d0), .d1(d1), .d2(d2), .d3(d3), .d4(d4), .d5(d5), .d6(d6), .d7(d7));  endmodule  

作者:李锐博恩(Reborn)
来源:CSDN
原文:https://blog.csdn.net/Reborn_Lee/article/details/80377207

少年不被楼层误,余生不羁尽自由。
加油,加油

课程学习——数字频率计的设计相关推荐

  1. 《OFFICE高级应用》课程学习网站的设计与实现

    开发环境:Microsoft Visual Studio 数据库:Microsoft SQL Server 程序语言:asp.NET(C#)语言<OFFICE2010高级应用>课程学习网站 ...

  2. 基于微信的在线付费课程学习平台的设计与实现 毕业设计毕设参考

    功能模块 用户首次登陆系统需要注册一个用户或直接使用微信作为账号,用户在登录平台后,可以进行平台的操作.主要模块包括以下几点: (1)登录功能:注册普通账号登录:也可以直接使用微信登录:登录后可以修改 ...

  3. 基于SSH实现在线课程学习系统

    项目编号:BS-PT-046 运行环境: 开发工具:IDEA / ECLIPSE 数据库:MYSQL5.7 应用服务器:TOMCAT8.5.31 开发技术:Spring+Struts2+Hiberna ...

  4. 基于Android智能手机的微课程学习系统设计与实现 毕业设计源码100909

    摘 要 随着现在网络的快速发展,网络的应用在各行各业当中它很快融入到了许多学校的眼球之中,他们利用网络来做这个微课程学习系统的网站,随之就产生了"智能手机的微课程学习系统 ",这样 ...

  5. (附源码)app智能手机的微课程学习系统 毕业设计 100909

    摘  要 随着现在网络的快速发展,网络的应用在各行各业当中它很快融入到了许多学校的眼球之中,他们利用网络来做这个微课程学习系统的网站,随之就产生了"智能手机的微课程学习系统 ",这 ...

  6. (附源码)springboot智能手机的微课程学习系统 APP 毕业设计 100909

    摘  要 随着现在网络的快速发展,网络的应用在各行各业当中它很快融入到了许多学校的眼球之中,他们利用网络来做这个微课程学习系统的网站,随之就产生了"智能手机的微课程学习系统 ",这 ...

  7. APP+spring boot基于Android智能手机的微课程学习系统设计与实现 毕业设计-附源码100909

    摘  要 随着现在网络的快速发展,网络的应用在各行各业当中它很快融入到了许多学校的眼球之中,他们利用网络来做这个微课程学习系统的网站,随之就产生了"智能手机的微课程学习系统 ",这 ...

  8. (附源码)APP+spring boot基于Android智能手机的微课程学习系统设计与实现 毕业设计100909

    摘  要 随着现在网络的快速发展,网络的应用在各行各业当中它很快融入到了许多学校的眼球之中,他们利用网络来做这个微课程学习系统的网站,随之就产生了"智能手机的微课程学习系统 ",这 ...

  9. APP+spring boot基于Android智能手机的微课程学习系统设计与实现 毕业设计源码100909

    摘  要 随着现在网络的快速发展,网络的应用在各行各业当中它很快融入到了许多学校的眼球之中,他们利用网络来做这个微课程学习系统的网站,随之就产生了"智能手机的微课程学习系统 ",这 ...

最新文章

  1. 原生js中如果有多个onload事件解决方案
  2. Visual C++ 2011-5-27
  3. Create Digital Engagement on Multiple Channels
  4. 抽象泄漏,或如何正确地将Oracle DATE与Hibernate绑定
  5. C++ Socket通信类的封装(还有点小bug)
  6. SQL中的全文检索(转帖)
  7. xshell4 选中复制,右键粘贴
  8. k-means聚类算法原理简析
  9. CC2430基础——串口测试实验
  10. Android6.0权限的处理
  11. python 流水作业调度_动态规划——流水作业调度问题
  12. 解决插件在IE增强保护模式下无法运行的问题
  13. 什么是时间复杂度与空间复杂度
  14. 电脑右下角搜狗拼音输入法图标如何隐藏
  15. python中的元组介绍
  16. 美国 计算机与艺术 专业,美国加州大学圣地亚哥分校计算机与艺术专业.pdf
  17. prometheus remote write for springboot 远程写入<一>
  18. 千锋深圳校区相亲会 双蛋之夕不再孤单
  19. html严格模式和标准模式,怎么触发这两种模式
  20. html导航栏页面切换的js,js实现页面滚动切换导航栏/点击导航栏跳转到指定位置...

热门文章

  1. 【深入理解RabbitMQ原理】RabbitMQ 配置,生产者和消费者
  2. 基本控制结构python跳转结构_一文看懂Python的控制结构:for、while、if…都有了...
  3. VMware-虚拟机-Linux系统
  4. echars 3D地图为区域自定义颜色
  5. eclipse常见问题
  6. c语言输入252则输出应该是20,[转载]计算机C语言二级上级考试套题(一)
  7. 单侧游离端缺失设计图_单侧游离端附着体义齿的应力中断设计及其力学传导分析...
  8. android上层如何默认开启ZSD
  9. android调用系统拍照、相册
  10. echarts 常见的功能点小结