打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Verilog上机实验题目1:8位数字显示的简易频率计

转载自https://blog.csdn.net/Reborn_Lee/article/details/80377207

简易数字频率计

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

                             
本图是简易频率计的工作时序图,从图中 可以看出:
基准信号的第一个上升沿到达时,计数使能信号有效,计数器开始计数;
第二上升沿到达时,计数结束,锁存使能有效,计数数据开始锁存;
第三个上升沿到达时,清零信号有效,对计数器的输出清零,准备下一次的测量。

一个测量过程需要3 sec(重要)。

下面是数字频率计的原理图:
                 
由此原理图可以清晰的理解下面的verilog HDL程序:
  1. //简易频率计设计  

  2. module freDetect(clk_1Hz, fin, rst, d0, d1, d2, d3, d4, d5, d6, d7);  

  3.   input clk_1Hz;//1Hz基准频率  

  4.   input fin; //待测信号  

  5.   input rst; //复位信号  

  6.   output[3:0] d0, d1, d2, d3, d4, d5, d6, d7; //8位显示测量数据  

  7.   wire[3:0] q0, q1, q2, q3, q4, q5, q6, q7;   //中间数据  

  8.   wire[3:0] d0, d1, d2, d3, d4, d5, d6, d7;  

  9.   //控制模块实例  

  10.   control u_control(.clk_1Hz(clk_1Hz), .rst(rst), .count_en(count_en),  

  11.                     .latch_en(latch_en), .clear(clear));  

  12.   //计数器模块实例  

  13.   counter_10 counter0(.en_in(count_en), .clear(clear), .rst(rst),  

  14.                       .fin(fin), .en_out(en_out0), .q(q0));  

  15.   counter_10 counter1(.en_in(en_out0), .clear(clear), .rst(rst),  

  16.                       .fin(fin), .en_out(en_out1), .q(q1));  

  17.   counter_10 counter2(.en_in(en_out1), .clear(clear), .rst(rst),  

  18.                       .fin(fin), .en_out(en_out2), .q(q2));  

  19.   counter_10 counter3(.en_in(en_out2), .clear(clear), .rst(rst),  

  20.                       .fin(fin), .en_out(en_out3), .q(q3));  

  21.   counter_10 counter4(.en_in(en_out3), .clear(clear), .rst(rst),  

  22.                       .fin(fin), .en_out(en_out4), .q(q4));  

  23.   counter_10 counter5(.en_in(en_out4), .clear(clear), .rst(rst),  

  24.                       .fin(fin), .en_out(en_out5), .q(q5));  

  25.   counter_10 counter6(.en_in(en_out5), .clear(clear), .rst(rst),  

  26.                       .fin(fin), .en_out(en_out6), .q(q6));  

  27.   counter_10 counter7(.en_in(en_out6), .clear(clear), .rst(rst),  

  28.                       .fin(fin), .en_out(en_out7), .q(q7));  

  29.   //锁存器模块实例  

  30.   latch u_latch(.clk_1Hz(clk_1Hz), .rst(rst), .latch_en(latch_en),  

  31.                 .q0(q0), .q1(q1), .q2(q2), .q3(q3), .q4(q4), .q5(q5),  

  32.                 .q6(q6), .q7(q7), .d0(d0), .d1(d1), .d2(d2), .d3(d3),  

  33.                 .d4(d4), .d5(d5), .d6(d6), .d7(d7));  

  34. endmodule  

  35. //控制模块  

  36. //控制模块产生计数使能信号、锁存使能信号和计数器清零信号  

  37. module control(clk_1Hz, rst, count_en, latch_en, clear);  

  38.   input clk_1Hz;  

  39.   input rst;  

  40.   output count_en;  

  41.   output latch_en;  

  42.   output clear;  

  43.   reg[1:0] state; //状态信号,用于控制各种使能信号  

  44.   reg count_en;  

  45.   reg latch_en;  

  46.   reg clear;  

  47.   always @(posedge clk_1Hz or negedge rst)  

  48.   if(!rst)   //复位信号有效  

  49.     begin    //各种使能信号清零  

  50.       state <= 2’d0;  

  51.       count_en <= 1’b0;  

  52.       latch_en <=1’b0;  

  53.       clear <= 1’b0;  

  54.     end  

  55.      else    //遇到基准信号的下一个上升沿,状态变化一次,每次变化后状态持续1s  

  56.     begin  

  57.       case(state)  

  58.             2’d0:   

  59.             begin //第一个上升沿到达,开始计数,计数1个基准信号周期内待测信号的上升沿个数,此个数即为待测信号的频率  

  60.             count_en <= 1’b1;  //计数使能信号有效  

  61.             latch_en <=1’b0;  

  62.             clear <= 1’b0;  

  63.             state <= 2’d1;  

  64.           end  

  65.         2’d1:  

  66.           begin //第二个上升沿到达,计数完成,锁存使能信号有效,测得频率锁存至锁存器中  

  67.             count_en <= 1’b0;  

  68.             latch_en <=1’b1;  

  69.             clear <= 1’b0;  

  70.             state <= 2’d2;  

  71.           end  

  72.         2’d2:   

  73.           begin //第三个上升沿到达,清零使能信号有效,计数器清零,为下一次计数做准备  

  74.             count_en <= 1’b0;  

  75.             latch_en <=1’b0;  

  76.             clear <= 1’b1;  

  77.             state <= 2’d0; //状态清零,进入下一次测量  

  78.           end  

  79.         default:  

  80.           begin  

  81.             count_en <= 1’b0;  

  82.             latch_en <=1’b0;  

  83.             clear <= 1’b0;  

  84.             state <= 2’d0;  

  85.           end  

  86.       endcase  

  87.     end  

  88. endmodule  

  89. //计数模块  

  90. //模10计数器,当计数使能时计数开始,当计数器到达4’b1001,即9时,输出下一模式计数器的使能信号并将计数器清零  

  91. module counter_10(en_in, rst, clear, fin, en_out, q);  

  92.   input en_in; //输入使能信号  

  93.   input rst;   //复位信号  

  94.   input clear; //清零信号  

  95.   input fin;   //待测信号  

  96.   output en_out; //输出使能,用于控制下一个计数器的状态,当输出使能有效时,下一个模10计数器计数加1  

  97.   output[3:0] q; //计数器的输出,4位BCD码输出  

  98.   reg en_out;  

  99.   reg[3:0] q;  

  100.   always@ (posedge fin or negedge rst) //输入待测信号的上升沿作为敏感信号  

  101.   if(!rst) //复位信号有效,计数器输出清零  

  102.       begin  

  103.         en_out <= 1’b0;  

  104.         q <= 4’b0;  

  105.       end  

  106.     else if(en_in) //进位输入使能信号有效  

  107.       begin  

  108.         if(q == 4’b1001) //若q = 4’b1001的话,q清零,同时进位输出使能有效,即en_out 赋值为1’b1  

  109.           begin  

  110.             q <= 4’b0;  

  111.             en_out <= 1’b1;  

  112.           end  

  113.              else //若q未达到4’b1001时,每到达待测信号的一个上升沿,q加1,同时输出进位清零  

  114.           begin  

  115.             q <= q + 1’b1;  

  116.             en_out <=1’b0;  

  117.           end  

  118.       end  

  119.     else if(clear) //若清零信号有效,计数器清零,主要用于为下一次测量准备  

  120.       begin  

  121.         q <= 4’b0;  

  122.         en_out <= 1’b0;  

  123.       end  

  124.     else  

  125.     begin  

  126.     q <= q;  

  127.     en_out <=1’b0;  

  128.     end   

  129. endmodule  

  130. //锁存器模块  

  131. //当锁存使能时,锁存器将8个模10计数器的输出值锁存并输出  

  132. module latch(clk_1Hz, latch_en, rst, q0, q1, q2, q3, q4, q5, q6, q7,  

  133.             d0, d1, d2, d3, d4, d5, d6, d7);  

  134.   input clk_1Hz, latch_en, rst;  

  135.   input[3:0] q0, q1, q2, q3, q4, q5, q6, q7;  

  136.   output[3:0] d0, d1, d2, d3, d4, d5, d6, d7;  

  137.   reg[3:0] d0, d1, d2, d3, d4, d5, d6, d7;  

  138.   always@ (posedge clk_1Hz or negedge rst)  

  139.   if(!rst) //复位信号有效时输出清零  

  140.     begin  

  141.       d0 <= 4’b0; d1 <= 4’b0; d2 <= 4’b0; d3 <= 4’b0; d4 <= 4’b0;  

  142.       d5 <= 4’b0; d6 <= 4’b0; d7 <= 4’b0;  

  143.     end  

  144.   else if(latch_en) //锁存信号有效时,将计数器的输出信号锁存至锁存器  

  145.     begin  

  146.       d0 <= q0; d1 <= q1; d2 <= q2; d3 <= q3; d4 <= q4;  

  147.       d5 <= q5; d6 <= q6; d7 <= q7;  

  148.     end  

  149.      else  //上面两种情况均未发生时,输入不变  

  150.     begin  

  151.       d0 <= d0; d1 <= d1; d2 <= d2; d3 <= d3; d4 <= d4;  

  152.       d5 <= d5; d6 <= d6; d7 <= d7;  

  153.     end  

  154. endmodule  

测试文件为:

  1. `timescale 1ns/1ps  

  2. //测试模块  

  3. module freDetect_tb;  

  4.   parameter CLK_1HZ_DELAY = 5_0000_0000; //1Hz基准信号  

  5.   parameter FIN_DELAY = 100;             //5MHz待测信号  

  6.   reg clk_1Hz;  

  7.   reg fin;  

  8.   reg rst;  

  9.   wire[3:0] d0, d1, d2, d3, d4, d5, d6, d7;  

  10.   initial  

  11.     begin  

  12.       rst =1’b0;  

  13.       #1 rst = 1’b1;  

  14.     end  

  15.   initial  

  16.     begin  

  17.       fin = 1’b0;  

  18.       forever  

  19.       #FIN_DELAY fin = ~fin;  

  20.     end  

  21.   initial  

  22.     begin  

  23.       clk_1Hz = 1’b0;  

  24.       forever  

  25.       #CLK_1HZ_DELAY clk_1Hz = ~clk_1Hz;  

  26.     end  

  27.     freDetect freDetect1(.clk_1Hz(clk_1Hz), .rst(rst), .fin(fin),  

  28.     .d0(d0), .d1(d1), .d2(d2), .d3(d3), .d4(d4), .d5(d5), .d6(d6), .d7(d7));  

  29. endmodule  

在Modelsim中仿真得到的波形图为:


看不清,再截一张:

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
常见的硬件笔试面试题目3
Power 介绍——power optimization之clock gating(2)
systemverilog新增的always_comb,always_ff,和always_latch语句
Verilog的135个经典设计实例
今日电子--ADPCM语音编解码电路设计及FPGA实现(图)
一天一个设计实例-3万字讲解UART和实例
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服