数字频率计_数字频率计课程设计心得体会 - CSDN
数字频率计 订阅
数字频率计是采用数字电路制做成的能实现对周期性变化信号频率测量的仪器。频率计主要用于测量正弦波、矩形波、三角波和尖脉冲等周期信号的频率值。其扩展功能可以测量信号的周期和脉冲宽度。通常说的,数字频率计是指电子计数式频率计。 展开全文
数字频率计是采用数字电路制做成的能实现对周期性变化信号频率测量的仪器。频率计主要用于测量正弦波、矩形波、三角波和尖脉冲等周期信号的频率值。其扩展功能可以测量信号的周期和脉冲宽度。通常说的,数字频率计是指电子计数式频率计。
信息
优    点
测量迅速,精度高,显示直观
外文名
digital frequency meter
别    称
电子计数式频率计
用    途
测量正弦波等周期信号的频率值
中文名
数字频率计
数字频率计基本原理
测量频率的方法有很多,按照其工作原理分为无源测量法、比较法、示波器法和计数法等。计数法在实质上属于比较法,其中最常用的方法是电子计数器法。电子计数器是一种最常见、最基本的数字化测量仪器。数字计数式频率计能直接计数单位时间内被测信号的脉冲数,然后以数字形式显示频率值。这种方法测量精确度高、快速,适合不同频率、不同精确度测频的需要。电子计数器测频有两种方式:一是直接测频法,即在一定闸门时间内测量被测信号的脉冲个数;二是间接测频法,如周期测频法。由于数字电路的飞速发展和集成电路的普及,计数器的应用十分广泛。利用电子计数器测量频率具有精度高,显示醒目直观,测量迅速,以及便于实现测量过程自动化等一系列突出优点,所以该方法是最好的。 [1] 
收起全文
精华内容
参与话题
  • 数字频率计设计

    千次阅读 2019-02-16 16:14:17
    一、数字频率计功能 (1)设计一个4位数字显示的十进制频率计,其测量范围为1MHz。 (2)测量值通过4个数码管显示以8421BCD码形式输出; (3)采用记忆显示方式,即计数过程中不显示数据,待计数过程结束后,显示...

    一、数字频率计功能

    (1)设计一个4位数字显示的十进制频率计,其测量范围为1MHz。
    (2)测量值通过4个数码管显示以8421BCD码形式输出;
    (3)采用记忆显示方式,即计数过程中不显示数据,待计数过程结束后,显示计数结果,并将此显示结果保持到下一次计数结束。显示时间应不小于1s。
    (4)可通过开关实现量程控制,量程分10kHz、100kHz、1MHz三档(最大读数分别为9.999kHz、99.99kHz、999.9kHz);
    当输入信号的频率大于相应量程时,有溢出显示。

    二、所用设备

    SE-5M型EDA实验系统资源( EPF10K10LC84-4)。SE-5M型实验箱通用编程模块,开关按键模块,LED显示模块,数码管显示模块。

    三、基本设计原理

    在这里插入图片描述

    数字频率计的原理框图如图所示。他主要由4个模块组成,分别是:控制模块、计数模块电路、锁存器、译码显示模块。 当系统正常工作时,脉冲发生器提供的1 Hz的输入信号,经过控制模块进行信号的变换,产生计数信号,被测信号送入计数模块,计数模块对输入的矩形波进行计数,将计数结果送入锁存器中,保证系统可以稳定显示数据,显示译码驱动电路将二进制表示的计数结果转换成相应的能够在七段数码显示管上可以显示的十进制结果。在数码显示管上可以看到计数结果。

    四、设计实现
    **1、**系统方框图的划分和结构设计
    根据数字频率计的系统原理框图(图1),设计系统的顶层电路图如图2所示。
    在这里插入图片描述
    Control模块将系统时钟转换为计数时钟。
    suocun为锁存器。在信号lock的上升沿时,立即对模块的输入口的数据锁存到suocun块的内部,输出端输出送扫描显示译码模块可以译码输出。在这里使用了锁存器,好处是可以稳定显示数据,不会由于周期性的清零信号而不断闪烁。
    counter计数模块,内部由3个计数器组成,分别为10进制、100进制和9999进制,有一时钟使能en输入,当高电平时允许计数,低电平时禁止计数。
    show为扫描显示译码电路,可以将频率计数的结果译成能在数码管上显示相对应的阿拉伯数字,便于读取测量的结果。
    为了实现系统功能,各个模块存在一个工作时序的问题,设计时需要综合考虑。
    图3给出了系统的工作时序。图3中CLK是由图1中脉冲发生器产生的频率为1 Hz的标准时钟信号,当计数模块的en端为高电平时允许计数、低电平时停止计数,在停止计数期间,控制模块的lock端产生一个上升沿,将计数器在前1 s的计数值保存在锁存器中,并由5个7段译码器将计数结果译出稳定显示。锁存信号之后经过半个CLK周期,控制模块的clr端产生一个上升沿,对计数器进行清零。为下1 s的计数操作做准备。
    为了产生这个时序图,首先有一个D触发器构成二分频器,在每次时钟CLK的上升沿到来使其值翻转。D触发器的输出高电平正好是1 s,因此可以作为计数模块的en端,用来控制计数。而lock信号正好是en端信号的翻转。在计数结束后半个CLK周期,CLK与en都为低电平,这时CLR产生一个上升沿作为清零信号。
    在这里插入图片描述
    2、各模块的VHDL源程序及仿真
    A、control模块

    library ieee;
    use ieee.std_logic_1164.all;
    entity control is
       port(clk:in std_logic; --系统时钟
            start:in std_logic;
            en,clr,lock : out std_logic);
    end control;
    architecture a of control is
    begin
    p1: process(clk)
    variable clr1:std_logic;
    variable en1,clk1:std_logic;
    begin
      if clk'event and clk='1' then
         if start='1'then
            en1:=not en1;  
         else
            en1:='0';
            clk1:='0';
         end if;   
      end if;
    en<=en1;
    lock<=not en1;
    clk1:=clk or en1;
    clr<=clk1;
    end process p1;   
    end a;
    

    仿真图形如图3所示。

    B、counter模块

    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.std_logic_unsigned.all;
    entity counter is
      port(sig,en,clr,lch,start:in std_logic;--sig :待测信号  lch :量程控制 clr:清0信号
           overflow:out std_logic;--溢出信号
           counter1:out std_logic_vector(3 downto 0);
           counter2:out std_logic_vector(3 downto 0);
           counter3:out std_logic_vector(3 downto 0);
           counter4:out std_logic_vector(3 downto 0);
           dang: out std_logic_vector(1 downto 0));--档位输出
    end counter;
    architecture aa of counter is
    signal dw :std_logic_vector(1 downto 0);  --档位
    signal clk1:std_logic;--驱动计数器脉冲
    begin
    p1:process(lch)
    variable count :std_logic_vector(1 downto 0);
    begin
      if lch'event and lch='1'then
         if count="10" then
            count:="00";
         else
            count:=count+1;
         end if;
      end if;
    case count is
       when "00"=>dang<="01";
       when "01"=>dang<="10";
       when "10"=>dang<="11";
       when others=>null;
    end case;
    dw<=count;
    end process p1;
    p2: process(sig)
    variable clk2:std_logic;
    variable counter:std_logic_vector(3 downto 0);--10 进制计数器 
    variable ccounter:std_logic_vector(6 downto 0);--100 进制计数器
    begin
    if dw="00"then
          clk2:=sig;--1档直接输出 
    elsif sig'event and sig='1' then
       if dw="01"then
          if counter="1001" then
             counter:=counter+"0111";
             clk2:='1';
          else
             counter:=counter+1;
             clk2:='0';
          end if;--2 档没10 个输出一个
       elsif dw="10" then
          if ccounter="1100011" then
             ccounter:="0000000";
             clk2:='1';
          else
             ccounter:=ccounter+1;
             clk2:='0';
          end if;--3 档100个待测输出一个计数脉冲
       end if;
    end if;
    clk1<=clk2;
    end process p2;
    p3:process(clk1,clr)
    variable counter:std_logic_vector(15 downto 0);
    variable over :std_logic;--溢出信号
    begin
       if clr='0'then
          counter:=(others=>'0');
          over:='0';
       elsif clk1'event and clk1='1' then
          if (start='1'and over='0')then        
             if en='1'then
                counter:=counter+1;
             end if;
             if counter(3 downto 0)="1010"then
                counter:=counter+"0110";
             end if;
             if counter(7 downto 4)="1010"then
                counter:=counter+"01100000";
             end if;
             if counter(11 downto 8)="1010"then
                counter:=counter+"011000000000";
             end if;
             if counter(15 downto 12)>"1001"then
                over:='1';
             else
                over:='0';          
             end if;
          else
             counter:=(others=>'0');
          end if;
       end if;
    if over='0'then
       counter4<=counter(3 downto 0);
       counter3<=counter(7 downto 4);
       counter2<=counter(11 downto 8);
       counter1<=counter(15 downto 12);
    else
       counter4<="0000";
       counter3<="0000";
       counter2<="0000";
       counter1<="0000";
    end if;
    overflow<=over;            
    end process p3;
    end aa;
    

    仿真波形图4所示:
    在这里插入图片描述
    C、suocun模块

    library ieee;
    use ieee.std_logic_1164.all;
    entity suocun is
        port(lock    :in std_logic;--所存信号
             overflow:in std_logic;--溢出信号
             counter1:in std_logic_vector(3 downto 0);
             counter2:in std_logic_vector(3 downto 0);
             counter3:in std_logic_vector(3 downto 0);
             counter4:in std_logic_vector(3 downto 0);
             dang    :in std_logic_vector(1 downto 0);
             overxian:out std_logic;--yi chu xian shi xin hao
             data1   :out std_logic_vector(3 downto 0);
             data2   :out std_logic_vector(3 downto 0);
             data3   :out std_logic_vector(3 downto 0);
             data4   :out std_logic_vector(3 downto 0);
             dangwei    :out std_logic_vector(1 downto 0));--档位显示
    end suocun;
    architecture aa of suocun is
    begin
    process(lock)
    variable t4,t3,t2,t1,t0:std_logic_vector(3 downto 0);
    variable over :std_logic;
    variable dw   :std_logic_vector(1 downto 0);
    begin
       if lock'event and lock='1'then
          t4:=counter4;
          t3:=counter3;
          t2:=counter2;
          t1:=counter1;
          over:=overflow;
          dw:=dang;
        end if;
          data4<=t4;
          data3<=t3;
          data2<=t2;
          data1<=t1;
          overxian<=over;
          dangwei<=dw;
        end process;
     end aa;
    

    仿真波形图5所示
    在这里插入图片描述
    D、show模块

    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.std_logic_unsigned.all;
    entity show is
    	port(
    		scp	    : in	std_logic;--sao miao shi zhong 32hz
    	    data1	: in	std_logic_vector(3 downto 0);
    		data2   : in	std_logic_vector(3 downto 0);
    		data3	: in	std_logic_vector(3 downto 0);
    		data4	: in	std_logic_vector(3 downto 0);
    		dangwei : in	std_logic_vector(1 downto 0);
            overxian: in    std_logic;
            overflow: out   std_logic;
    		choice	: out	std_logic_vector(4 downto 0);--显示数码管选择
    		dataout	: out	std_logic_vector(7 downto 0));--当前数码管数值
    end show;
    architecture a of show is
    	signal count : std_logic_vector(2 downto 0);--扫描周期计数
    	signal temp : std_logic_vector(3 downto 0);
    	signal datain	: std_logic_vector(7 downto 0);
        signal choicein : std_logic_vector(4 downto 0);
    begin
    clk1_label: process (scp)
    begin
    if scp'event and scp='1' then –计数周期5即扫描周期
       if count="100"then
          count<="000"; 
       else
          count<=count+1;
       end if;
    end if;
    end process clk1_label;
    clk2_label: process (scp)
    begin
    if scp'event and scp='0' then
       choice<=choicein;
       overflow<=overxian;
       dataout(7 downto 1)<=datain(7 downto 1);
    case dangwei is
      when "01"=>
         if count="011" then 
            dataout(0)<= '1'; 
         else 
            dataout(0)<='0';
         end if;
      when "10"=>
         if count="010" then
            dataout(0)<= '1'; 
         else 
            dataout(0)<='0';
         end if;
      when "11"=>
         if count="001"then
            dataout(0)<= '1'; 
         else 
            dataout(0)<='0'; 
         end if;
      when others=>null;
    end case; --当前小数点的显示位置dataout(0)
    end if;
    end process clk2_label;
    choicein<="00001" when count="000" else—显示位置的切换
    		  "00010" when count="001" else
    		  "00100" when count="010" else
    		  "01000" when count="011" else
    		  "10000" when count="100" ;
    		  
    temp<=	data4 when count="000" else  --显示数值的 选择
    		data3 when count="001" else
    		data2 when count="010" else
    		data1 when count="011" else
    	    "00"& dangwei when count="100";
    with temp select
    	datain<= "00000000" when "0000",  --转换成相应的数码显示信号
    			 "00000110" when "0001",
                 "11011010" when "0010",
                 "11001110" when "0011",
                 "10100110" when "0100",
                 "11101100" when "0101",
                 "11111100" when "0110",
                 "01000110" when "0111",
                 "11111110" when "1000",
                 "11101110" when "1001",
                 "11111110" when others;
    end a;
    

    仿真波形如图6所示
    在这里插入图片描述
    从各个部分的仿真波形来看各模块是正确的,下面再对顶层设计进行仿真,图7所示:

    各个仿真时序设置都相同,从仿真波形上看测量的结果是准确的。最后通过编程电缆,将所设计的内容下载到实验箱中,进行实物仿真。

    附:管脚锁定对应表
    信号名 管脚号 对应器件名称
    Scp 43 扫描时钟CP1 128Hz
    Clk 1 系统时钟CP2 1Hz
    Start 28 起始开关K1
    Signal 待测信号
    Dang 29 量程档位调节
    Overflow 51 LED溢出指示
    Choice[4] 80 数码管位选信号M2A
    Choice[3] 79 数码管位选信号M1D
    Choice[2] 78 数码管位选信号M1C
    Choice[1] 73 数码管位选信号M1B
    Choice[0] 72 数码管位选信号M1A
    Data[7] 6 数码管显示信号M3B
    Data[6] 7 数码管显示信号M3C
    Data[5] 8 数码管显示信号M3D
    Data[4] 9 数码管显示信号M4A
    Data[3] 10 数码管显示信号M4B
    Data[2] 11 数码管显示信号M4C
    Data[1] 16 数码管显示信号M4D
    Data[0] 5 数码管显示信号M3A

    展开全文
  • 简易数字频率计(verilog HDL设计)(2020维护版本)

    万次阅读 多人点赞 2020-07-26 23:31:46
    测量被测信号的频率,要清楚频率的定义,一言以蔽之,就是1s中信号的周期数,这不就是周期的倒数吗? 根据频率的定义,我们测量被测信号1s中变化的次数即可,即1s中的周期数。

    目录

     

    前言

    简易数字频率计原理

    结语


    前言

    这篇博客大概是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),
        .clear(clear)
        );  
     
        
     
      //计数器模块实例  
     
      counter_10 counter_inst0(.en_in(count_en),.clear(clear),.rst(rst),  
     
                          .fin(fin),.en_out(en_out0),.q(q0));  
     
      counter_10 counter_inst1(.en_in(en_out0),.clear(clear),.rst(rst),  
     
                          .fin(fin),.en_out(en_out1),.q(q1));  
     
      counter_10 counter_inst2(.en_in(en_out1),.clear(clear),.rst(rst),  
     
                          .fin(fin),.en_out(en_out2),.q(q2));  
     
      counter_10 counter_inst3(.en_in(en_out2),.clear(clear),.rst(rst),  
     
                          .fin(fin),.en_out(en_out3),.q(q3));  
     
      counter_10 counter_inst4(.en_in(en_out3),.clear(clear),.rst(rst),  
     
                          .fin(fin),.en_out(en_out4),.q(q4));  
     
      counter_10 counter_inst5(.en_in(en_out4),.clear(clear),.rst(rst),  
     
                          .fin(fin),.en_out(en_out5),.q(q5));  
     
      counter_10 counter_inst6(.en_in(en_out5),.clear(clear),.rst(rst),  
     
                          .fin(fin),.en_out(en_out6),.q(q6));  
     
      counter_10 counter_inst7(.en_in(en_out6),.clear(clear),.rst(rst),  
     
                          .fin(fin),.en_out(en_out7),.q(q7));  
     
        
     
      //锁存器模块实例  
     
      latch_freq latch_freq_inst(.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
    
    

     

    顶层模块例化了各种子模块:

    控制模块:

    `timescale 1ns / 1ps
    //
    // blog: https://blog.csdn.net/Reborn_Lee
    // Engineer: 李锐博恩
    // Design Name: frequency detect
    // Module Name: control
    // 
    //
    
    
    module control(
    	input wire clk_1Hz,
    	input wire rst,
    	output reg count_en,
    	output reg latch_en,
    	output reg clear
    
        );
        
     
      reg[1:0] state; //状态信号,用于控制各种使能信号  
    
     
      always @(posedge clk_1Hz or posedge 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
    

    计数模块:

    
    `timescale 1ns / 1ps
    //
    // blog: https://blog.csdn.net/Reborn_Lee
    // Engineer: 李锐博恩
    // Design Name: frequency detect
    // Module Name: counter_10
    // 
    //
    
    
    
    module counter_10(
    
    	input wire en_in,       //输入使能信号    
    	input wire rst,         //复位信号    
    	input wire clear,       //清零信号    
    	input wire fin,         //待测信号    
    	output reg en_out,      //输出使能,用于控制下一个计数器的状态,当输出使能有效时,下一个模10计数器计数加1    
    	output reg [3:0] q      //计数器的输出,4位BCD码输出  
    
        );
        
        always@  (posedge  fin  or  posedge  rst)      //输入待测信号的上升沿作为敏感信号    
      	if(rst)  begin                          //复位信号有效,计数器输出清零    
                    en_out  <=  1'b0;    
                    q  <=  4'b0;    
            end    
            else  if(en_in)  begin                  //进位输入使能信号有效    
                    if(q  ==  4'b1001)  begin            //若q  =  4'b1001的话,q清零,同时进位输出使能有效,即en_out  赋值为1'b1    
                            q  <=  4'b0;    
                            en_out  <=  1'b1;    
                    end    
    		else  begin                        //若q未达到4'b1001时,每到达待测信号的一个上升沿,q加1,同时输出进位清零  
                            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
    

     

    锁存模块:

     

    `timescale 1ns / 1ps
    //
    // blog: https://blog.csdn.net/Reborn_Lee
    // Engineer: 李锐博恩
    // Design Name: frequency detect
    // Module Name: latch_freq
    // 
    //
    
    module latch_freq(
    	input wire clk_1Hz,
    	input wire latch_en,
    	input wire rst,
    	input wire [3:0] q0,
    	input wire [3:0] q1,
    	input wire [3:0] q2,
    	input wire [3:0] q3,
    	input wire [3:0] q4,
    	input wire [3:0] q5,
    	input wire [3:0] q6,
    	input wire [3:0] q7,
    	
    	output reg [3:0] d0,
    	output reg [3:0] d1,
    	output reg [3:0] d2,
    	output reg [3:0] d3,
    	output reg [3:0] d4,
    	output reg [3:0] d5,
    	output reg [3:0] d6,
    	output reg [3:0] d7
    	
    
    );
    
      always@ (posedge clk_1Hz or posedge 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;  
    
      //为了仿真方便,全部缩小100倍;
      parameter CLK_1HZ_DELAY = 1000_0000; //1Hz基准信号,对应周期为1s=1000_000_000ns
    
      parameter FIN_DELAY = 2;             //5MHz待测信号,对应周期为0.2*1000_000=200ns  
    
      reg clk_1Hz;  
    
      reg fin;  
    
      reg rst;  
    
        
    
      wire[3:0] d0, d1, d2, d3, d4, d5, d6, d7;  
    
        
    
      initial  
    
        begin  
    
          rst =1'b1;  
    
          #1 rst = 1'b0;  
    
        end  
    
          
    
      initial  
    
        begin  
    
          fin = 1'b0;  
    
          forever  
    
          # (FIN_DELAY/2) fin = ~fin;  
    
        end  
    
          
    
      initial  
    
        begin  
    
          clk_1Hz = 1'b0;  
    
          forever  
    
          # (CLK_1HZ_DELAY/2) clk_1Hz = ~clk_1Hz;  
    
        end  
    
          
    
        freDetect freDetect_inst(.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  

     

    本仿真在vivado自带的仿真器进行行为仿真,使用其他仿真软件也可以,例如modelsim,本文使用vivado进行仿真,仿真结果如下:

    我们设定的待测频率也是5Mhz=5000000Hz。

    由于时间紧张,我就不具体展开中间变量了,大家自行分析。

    结语

    由于这篇博客时间有点长,csdn也经过了一些改版,导致早期的程序出现一些奇怪的字符,见博客:

    网上复制代码需谨慎,莫名其妙报错看这里!

    这恐怕也是广大看客直接复制我这篇文章代码所遇到的问题之一,不过现在这个问题解决了,大家可以再次尝试了。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 数电课程设计——数字频率计

    万次阅读 热门讨论 2009-01-09 11:28:00
    查看文章 数电课程设计——数字频率计2008-07-06 12:53数字频率计【摘 要】在电子技术中,频率是最基本的参数之一,并且与许多电参量的测量方案、测量结果都有十分密切的关系,因此频率的测量就显得更为重要。...
     
    
     
    查看文章
     
    数电课程设计——数字频率计
    2008-07-06 12:53

    数字频率计

    【摘   要】在电子技术中,频率是最基本的参数之一,并且与许多电参量的测量方案、测量结果都有十分密切的关系,因此频率的测量就显得更为重要。测量频率的方法有多种,其中电子计数器测量频率具有精度高、使用方便、测量迅速,以及便于实现测量过程自动化等优点,是频率测量的重要手段之一。电子计数器测频有两种方式:一是直接测频法,即在一定闸门时间内测量被测信号的脉冲个数;二是间接测频法,如周期测频法。直接测频法适用于高频信号的频率测量,间接测频法适用于低频信号的频率测量。本文阐述了用数字电路设计了一个简单的数字频率计的过程。

    【关键词】周期;数字频率计;波形仿真;

    一、概述
    1
    )数字频率计的基本原理
       
    频率计的基本原理是用一个频率稳定度高的频率源作为基准时钟,对比测量其他信号的频率。通常情况下计算每秒内待测信号的脉冲个数,此时我们称闸门时间为1秒。闸门时间也可以大于或小于一秒。闸门时间越长,得到的频率值就越准确,但闸门时间越长则没测一次频率的间隔就越长。闸门时间越短,测的频率值刷新就越快,但测得的频率精度就受影响。本文。数字频率计是用数字显示被测信号频率的仪器,被测信号可以是正弦波,方波或其它周期性变化的信号。如配以适当的传感器,可以对多种物理量进行测试,比如机械振动的频率,转速,声音的频率以及产品的计件等等。因此,数字频率计是一种应用很广泛的仪器

    电子系统非常广泛的应用领域内,到处可见到处理离散信息的数字电路。数字电路制造工业的进步,使得系统设计人员能在更小的空间内实现更多的功能,从而提高系统可靠性和速度。
    集成电路的类型很多,从大的方面可以分为模拟电路和数字集成电路2大类。数字集成电路广泛用于计算机、控制与测量系统,以及其它电子设备中。一般说来,数字系统中运行的电信号,其大小往往并不改变,但在实践分布上却有着严格的要求,这是数字电路的一个特点。数字集成电路作为电子技术最重要的基础产品之一,已广泛地深入到各个应用领域

    设计原理:

    本次设计的数字频率计由四部分组成:时基电路、闸门电路、逻辑控制电路以及可控制的计数、译码、显示电路。

    555 定时器,分级分频系统及门控制电路得到具有固定宽度T的方波脉冲做门控制信号,时间基准T称为闸门时间.宽度为T的方波脉冲控制闸门的一个输入端B.被测信号频率为fx,周期Tx.到闸门另一输入端A.当门控制电路的信号到来后,闸门开启,周期为Tx的信号脉冲和周期为T的门控制信号结束时过闸门,于输出端C 产生脉冲信号到计数器,计数器开始工作,直到门控信号结束,闸门关闭.单稳1的暂态送入锁存器的使能端,锁存器将计数结果锁存,计数器停止计数并被单稳2暂态清零. (简单地说就是:在时基电路脉冲的上升沿到来时闸门开启,计数器开始计数,在同一脉冲的下降沿到来时,闸门关闭,计数器停止计数.同时,锁存器产生一个锁存信号输送到锁存器的使能端将结果锁存,并把锁存结果输送到译码器来控制七段显示器,这样就可以得到被测信号的数字显示的频率.而在锁存信号的下降沿到来时逻辑控制电路产生一个清零信号将计数器清零,为下一次测量做准备,实现了可重复使用,避免两次测量结果相加使结果产生错误.) T=1s,计数器显示fx=N(T时间内的通过闸门信号脉冲个数) T=0.1s,通过闸门脉冲个数位N,fx=10N,(闸门时间为0.1s时通过闸门的脉冲个数).也就是说,被测信号的频率计算公式是fx=N/T.由此可见,闸门时间决定量程,可以通过闸门时基选择开关,选择T大一些,测量准确度就高一些,T小一些,则测量准确度就低.根据被测频率选择闸门时间来控制量程.被测信号频率通过计数锁存可直接从

    计数显示器上读出.

    在整个电路中,时基电路是关键,闸门信号脉冲宽度是否精确直接决定了测量结果是否精确.

    因此,可得出数字频率计的原理框图如下:

    求其产生1000Hz的脉冲.振荡器的频率计算公式为:f=1.43/((R1+2*R2)*C),因此,我们可以计算出各个参数通过计算确定了R1430欧姆,R2500欧姆,电容取1uF.这样我们得到了比较稳定的脉冲

    第二部分为分频电路,主要由74LS90组成因为振荡器产生的是1000Hz的脉冲,也就是其周期是0.001s,而时基信号要求为0.1s1s因此,利用10分频的电路比较好.分频后的脉冲宽度计算公式为:tw=T(T为振荡器的周期),而其周期T1=10T,所以一级分频后tw=0.001s,T1=0.01s.依次类推0.1s的脉冲宽度需要三次分频,1s的脉冲宽度需要四次分频.

    分频电路如下:

    其中一级分频后的波形如下:

    (:上面的波形为振荡器产生) 。由此可见,设计的电路是正确的.

    2.   逻辑控制电路

    根据原理框图所示波形,在时基信号 II 结束时产生的负跳变用来产生锁存信号IV,锁存信号IV的负跳变又用来产生清零信号V,脉冲信号IVV可由两个单稳态触发器74LS121产生,它们的脉冲宽度由电路的时间常数决定。设锁存信号IV和清零信号V的脉冲宽度tw相同,根据tw=0.7Rext*Cext可以计算出各个参数。这样当脉冲从A1端输入可以产生锁存信号和清零信号,其要求刚好满足IVV的要求,当手动开关按下时,计数器清零。

    其电路图如下:

    锁存信号波形比较如下:

    注:上面的波形为输入信号

    清零信号调试如下:

    注:上面的波形为输入信号

    由调试波形可以看出设计的电路是正确的

    需要说明的MONOSTAB是单稳态触发器,它有两个负跳沿触发输入和一个可作为禁止输入使用的正跳沿触发输入,它可提供互补的输出脉冲。

    外部元件的接法:外接电容接在CextRext两引脚之间;如用内接定时电阻,需将引脚RintVcc;为了改善脉冲宽度的精度和重复性可在CextRext/Cext之间接一外接电容。并将Rint开路。

    适当选择定时元件。需出脉冲宽度可以变化于40ns28s之间。如不接定时元件(Rint引脚接Vcc,而使CextRext/Cext引脚开路),输出脉冲宽度一般可达30ns35ns,可以作直接耦合触发复位信号使用。输出脉冲宽度可由如下关系式确定:tw=0.7Rt*Cext

    3.译码显示电路

    译码显示电路可由8段发光数码显示器BS201/202和输出高电平有效的译码器74LS48组成。74LS48的内部有升压电阻,因此可以直接与显示器相连接。为了使整数数值最前面的零不显示,将数码管显示器最高位的脉冲消隐输入 接地,并将高位的脉冲消隐输出 与低位的脉冲消隐输入 相连,如图:

                  计数锁存译码显示电路

    5.报警系统

    本电路要求用4位数字显示,最高显示为9999。因此,超过9999就要求报警,即当千位达到9(即1001)时,如果百位上再来一个时钟脉冲(即进位脉冲),就可以利用此来控制

    参考文献:

    1.电子技术基础(数字部分)   康华光     高等教育出版社

    2.电子报     周友谊    电子科技大学出版社

    3.数字电子技术基础实验    马慈伟    云南民族大学物理与电子电气信息工程学院

    4.数字电子技术基础实验   郭三明 雷乃清   于亚萍     河南理工大学电工电子实验中心

    七.心得体会

    在整个课程设计完后,总的感觉是:有收获。以前上课都是上一些最基本的东西而现在却可以将以前学的东西作出有实际价值的东西。在这个过程中,我的确学得到很多在书本上学不到的东西,如:如何利用现有的元件组装得到设计利用计算机来画图等等。但也遇到了不少的挫折,有时遇到了一个错误怎么找也找不到原因所在,找了老半天结果却是接头的方向接错了,有时更是忘接电源了。在学习中的小问题在课堂上不可能犯,在动手的过程中却很有可能犯。特别是在接电路时,一不小心就会犯错,而且很不容易检查出来。但现在回过头来看,还是挺有成就感的。我的动手能力又有了进一步的提高,我感到十分的高兴

    我学到了课本上没有的东西,也学会了如何利用计算机来画电路图,这在以后的学习和生活中会有很大的用处,增强了我的动手能力和实践能力,但是我还有不足,我会在以后的学习中逐步提高,做一个动手能力强的大学生。

    展开全文
  • verilog编写数字频率计

    万次阅读 多人点赞 2014-02-21 18:50:22
    一个简易的数字频率计主要由一个分频器和计数器构成 ,它的本原理就是计算 1 秒钟内被测时钟上升沿的个数即作它的频率值。  1. 分频器的作用是由 fpga 时钟得到我们想要的时钟 ,这里假设 fpga 的晶振为 50Mhz ,...

      一个简易的数字频率计主要由一个分频器和计数器构成 ,它的基本原理就是计算 1 秒钟内被测时钟上升沿的个数即作它的频率值。

       1.   分频器的作用是由fpga时钟得到我们想要的时钟 ,这里假设fpga的晶振为50Mhz,那么为了得到高电平为1秒钟的时钟信号,就需要对输入的clk进行25000000倍分频得到一个频率为2Hz占空比50 %的使能信号记为en。

        2.   计数器的作用就是在使能信号en为高电平的1秒钟内计算被测信号上升沿的个数得到频率值 。想必说到这您已经有了思路了。(另外说明一下这里的计数器就直接定义成一个多位的寄存器count2,但是如果您想要将最终的频率值用数码管做显示输出,则需要定义多个模为10的计数器再把它们级联到一起,并且他们之间是进位关系,或者可以用上一篇文章写到的方法,将最终变量2进制码转换成10进制码做输出。

        下面结合仿真结果来介绍

                    输入                 clk:时钟信号 频率50Mhz                       clk_in: 被测时钟

            输出                 fre:被测时钟频率值                                

            中间变量         count1:分频器计数                                count2:频率值计数 

                                      en:使能信号                                            load:载入信号

                                      clr:清零信号                                            clk_1hz:频率为标准1hz的时钟

       基本思想:    

    使能信号en是由1hz的时钟2分频得到,load为en的反转,en为高电平的时间内count2计入clk_in的上升沿个数,当load 的上升沿来临时1s结束同时计数器count2将频率值赋给输出fre,0.5s之后clr上升沿来临,此时fre和计数器count2全部清零,准备下一次测量。

     在testbench中被测信号clk_in周期为734ns,对应频率值1s/734ns≈1362398 ,与测量结果值fre完全符合。

     

      下面给出代码

     code:









    展开全文
  • 基于51单片机的数字频率计

    千次阅读 多人点赞 2019-01-20 21:37:14
    数字频率计是现代科研生产中不可或缺的测量仪器,它以十进制数显示被测频率,基本功能是测量正弦信号,方波信号,及其它各种单位时间内变化的物理量。   本系统采用AT89C52单片机智能控制,结合外围电子电路,设计...
  • 数字频率计

    2020-07-25 23:31:58
    数字频率计功能 (1)设计一个4位数字显示的十进制频率计,其测量范围为1MHz。 (2)测量值通过4个数码管显示以8421BCD码形式输出; (3)采用记忆显示方式,即计数过程中不显示数据,待计数过程结束后,显示计数...
  • 数字频率计的设计

    千次阅读 2020-10-21 17:07:11
    在电子技术中,频率是最基本的参数之一,并且与许多电参量的测量方案、测量结果都有十分密切的关系,因此频率的测量就显得更为重要。...随着数字电子技术的发展,频率测量成为一项越来越普遍的工作,因
  • 根据全国大学生电子设计竞赛题目《简易数字频率计》的要求设计,测量范围0-1Mhz ,测量精度满足题目中要求, 所用开发板为 xilinx spartan 3ES。具体设计过程可以参考博客 。http://blog.csdn.net/li200503028
  • 基于FPGA的简易频率计设计

    千次阅读 热门讨论 2019-02-06 23:57:55
    基于FPGA的简易频率计设计 假期著 先祝大家新春快乐,新的一年心想事成,万事如意,横财就手. 文章目录基于FPGA的简易频率计设计测频原理直接测量法周期测量法综合测量法测频过程整形电路FPGA整体框架1s定时器测频模块...
  • 基于FPGA的数字频率计(设计全过程)

    万次阅读 多人点赞 2014-04-30 21:09:25
     前几天看历年全国大学生电子设计竞赛历年试题,无意间发现了一道题目《简易数字频率计》,跟之前我用verilog写的一个频率计差不多,于是想尝试做一下,题目具体要求如下图中所示,我所用的开发板为 xilinx spartan...
  • Proteus 8.5 纯数字电路频率计仿真

    千次阅读 2018-04-25 16:05:50
    利用数字集成电路,而不用单片机进行的数字频率计的仿真设计。电路没有设计时钟发生器,有proteus的信号源产生。电路主要有锁存器与数码管组成的显示部分,计数器以及触发器组成(锁存器与数码管)74HC573的LE脚为1...
  • STM32F103_频率计

    千次阅读 2013-11-26 16:39:26
    注意:脉冲波频率检测Capture_Init(u16 arr,u16 psc) 初始化要根据检测脉冲的频率范围设置arr和psc,假设系统时钟72Mhz,arr=2000,psc=(7200-1),即分频器分频后计数频率为1Khz,计数重装值为2000,一个数用1ms...
  • 数字频率计用于测量正弦信号、矩形信号等波形的频率,其概念是单位时间里的脉冲个数,如果用一个定时时间T控制一个闸门电路,时间T内闸门打开,让被测信号通过而进入计数译码,可得到被测信号的频率fx= ,若T=1秒,...
  • 数电课设之频率计(一)

    千次阅读 热门讨论 2020-07-23 08:14:36
    在进行模拟、数字电路设计、安装和调试过程中,经常要用到数字频率计数字频率计实际上就是一个脉冲计数器,即在单位时间里(如1s)所统计的脉冲个数。 通常频率计是由输入整形电路、时钟振荡器、分频器、量程...
  • 基于51单片机的简易数字频率计

    千次阅读 2016-01-25 11:27:10
    要求使用定时/计数器1作定时用,定时1s;定时/计数器0作计数器用,被计数的外部脉冲从P3.4(T0)接入。...===============================================最佳答案:这是个简易频率计,程序如下:;------
  • 8位数码管显示频率计设计(FPGA)

    千次阅读 2018-03-01 11:13:51
    一、工程目的根据频率的定义和频率测量的基本原理。测定信号的频率必须有一个脉宽为1秒的输入信号脉冲计数允许的信号;1秒计数结束后,数值被锁入锁存器,计数器清零,为下一测频计数周期作好准备二、设备及软件...
  • 浅谈采样定理

    万次阅读 2019-02-28 23:28:59
     采样定理,又称香农采样定理,奈奎斯特采样定理,只要采样频率大于或等于有效信号最高频率的两倍,采样值就可以包含原始信号的所有信息,被采样的信号就可以不失真地还原成原始信号。 二、采样定理解释  1、...
  • Verilog频率计设计

    千次阅读 2019-06-13 19:48:36
    数字频率计的基本设计思路是在给定一个time开始测量的时候产生的T的个数,也就是采用一个标准的基准时钟,在单位时间(1秒)里对被测信号的脉冲数进行计数。测频法包括直接测频法、等精度频率测量法、周期法等。 ...
  • 对一阶二阶低通数字滤波器的理解

    万次阅读 2016-10-26 00:43:06
    IIR滤波器是无限冲击响应滤波器, 其优点: 1. 采用模拟原型滤波的标准设计,容易理解。 2. 可以用低阶设计实现,并且可以高速运行 3. 对于相同公差设计方案,其阶数比FIR短。 4. 可以采用闭环设计 ...
  • 基于FPGA的DDS信号源设计

    千次阅读 2008-05-05 12:27:00
    武汉科技学院毕业设计(论文)开题报告 课题名称 基于FPGA的DDS信号源设计 院系名称 武汉科技学院电子系 专 业 通信专业 班 级 04402班 学生姓名 张龙 一、课题的意义直接数字频率合成(DDS)技术,具有频率切换...
1 2 3 4 5 ... 20
收藏数 13,890
精华内容 5,556
关键字:

数字频率计