数字频率计的设计

249 篇文章 418 订阅

在电子技术中,频率是最基本的参数之一,并且与许多电参量的测量方案、测量结果都有十分密切的关系,因此频率的测量就显得更为重要。在传统的控制系统中,通常将单片机作为控制核心并辅以相应的元器件构成一个整体。但这种方法硬件连线复杂、可靠性差,且在实际应用中往往需要外加扩展芯片,这无疑会增大控制系统的体积,还会增加引入干扰的可能性。对一些体积小的控制系统,要求以尽可能小的器件体积实现尽可能复杂的控制功能,直接应用单片机及其扩展芯片就难以达到所期望的效果。

随着数字电子技术的发展,频率测量成为一项越来越普遍的工作,因此测频计常受到人们的青睐。目前许多高精度的数字频率计都采用单片机加上外部的高速计数器来实现,然而单片机的时钟频率不高导致测频速度比较慢,并且在这种设计中,由于PCB版的集成度不高,导致PCB板走线长,因此难以提高计数器的工作频率。为了克服这种缺点,大大提高测量精度和速度,我们可以设计一种可编程逻辑器件来实现数字频率计。EDA技术是以大规模可编程逻辑器件为设计载体,以硬件语言为系统逻辑描述的主要方式,以计算机、大规模可编程逻辑器件的开发软件及实验开发系统为设计工具,通过有关的开发软件,自动完成用软件设计的电子系统到硬件系统的设计,最终形成集成电子系统或专用集成芯片的一门新技术。其设计的灵活性使得EDA技术得以快速发展和广泛应用。

以Max+PlusⅡ软件为设计平台,采用VHDL语言实现数字频率计的整体设计。伴随着集成电路(IC)技术的发展,电子设计自动化(EDA)逐渐成为重要的设计手段,已经广泛应用于模拟与数字电路系统等许多领域。电子设计自动化是一种实现电子系统或电子产品自动化设计的技术,它与电子技术,微电子技术的发展密切相关,它吸收了计算机科学领域的大多数最新研究成果,以高性能的计算机作为工作平台,促进了工程发展。EDA的一个重要特征就是使用硬件描述语言(HDL)来完成的设计文件,VHDL语言是经IEEE确认的标准硬件语言,在电子设计领域受到了广泛的接受。

·测频法

测频法的基本思想是让计数器在闸门信号的控制下计数1秒时间,计数结果是1秒内被测信号的周期数,即被测信号的频率。若被测信号不是矩形脉冲,则应先变换成同频率的矩形脉冲。测频法的原理框图如图3-1所示。

图中,秒脉冲作为闸门信号,当其为高电平时,计数器计数;低电平时,计数器停止计数。显然,在同样的闸门信号作用下,被测信号的频率越高,测量误差越小。当被测频率一定时,闸门信号高电平的时间越长,测量误差越小。但是闸门信号周期越长,测量的响应时间也越长。例如,闸门信号高电平时间为1秒,被测信号频率的真值为2Hz,如图3-2所示。

在闸门信号相同时,测频法的相对误差与被测信号的频率成反比。因此测频法适合于测量频率较高的信号。

·测周法

当被测信号频率较低时,为保证测量精度,常采用测周法。即先测出被测信号的周期,再换算成频率。测周法的实质是把被测信号作为闸门信号,在它的高电平的时间内,用一个标准频率的信号源作为计数器的时钟脉冲。若计数结果为N,标准信号频率为f1,则被测信号的周期为

               T = T1·N

被测信号的频率为

                  f = 1/T1·N = f1/N

利用测周法所产生的最大绝对误差,显然也等于±1个标准信号周期。如果被测信号周期的真值为T真= T1·N,则T测= T1·(N±1)

               σmax= (f测-f真)/ f真= T真/T测 – 1=±1/(N±1)

由上式可知,对于一定的被测信号,标准信号的频率越高,则N的值越大,因而相对误差越小。

·控制信号模块

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY TESTCTL  IS

PORT(CLKK: IN STD_LOGIC;

     CNT_EN,RST_CNT,LOAD:OUT STD_LOGIC);

END TESTCTL;

ARCHITECTURE BEHAVIOR OF TESTCTL IS

SIGNAL div2clk:STD_LOGIC;

BEGIN

  PROCESS(CLKK)

   BEGIN

    IF CLKK'EVENT AND CLKK='1' THEN

       div2clk<=NOT div2clk;

    END IF;

  END PROCESS;

PROCESS(CLKK,div2clk)

  BEGIN

IF (CLKK='0' AND div2clk='0') THEN

        RST_CNT<='1';

     ELSE RST_CNT<='0';

    END IF;

END PROCESS;

LOAD<=NOT div2clk;CNT_EN<=div2clk;

END BEHAVIOR;

其仿真波形如下所示:

图5-3 控制模块信号仿真

·计数器模块

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY CNT10 IS

   PORT(CLK,RST,ENA:IN STD_LOGIC;

             OUTY:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);

             COUT:OUT STD_LOGIC);

END CNT10;

ARCHITECTURE JISHU OF CNT10 IS

    SIGNAL CQI:STD_LOGIC_VECTOR(3 DOWNTO 0);

  BEGIN

    PROCESS(CLK,RST,ENA)

       BEGIN

         IF(RST='1') THEN

            CQI<=(OTHERS=>'0');

         ELSIF(CLK'EVENT AND CLK='1') THEN

              IF(ENA='1') THEN

                IF(CQI="1001") THEN

                    CQI<="0000";

                    COUT<='1';

                ELSE

                    CQI<=CQI+1;

                    COUT<='0';

                END IF;

              END IF;

          END IF;

    END PROCESS;

        OUTY<=CQI;

END JISHU;

其仿真如下所示:

图5-4 计数器仿真模块

·锁存器模块设计

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY REG4B IS

  PORT(LOAD:IN STD_LOGIC;

       DIN:IN STD_LOGIC_VECTOR(3 DOWNTO 0);

       DOUT:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));

END REG4B;

ARCHITECTURE XIANSHI OF REG4B IS

  BEGIN

    PROCESS(LOAD,DIN)

      BEGIN

        IF(LOAD'EVENT AND LOAD='1') THEN

            DOUT<=DIN;

        END IF;

     END PROCESS;

END XIANSHI;

其仿真波形如下所示:

图5-5 锁存器仿真

    本系统,我们将利用原理图的方式完成系统顶层设计。我们对每个模块生产原理图,如下所示:

    

图5-6 系统原理图

下面我们对几个模块进行搭建。可以得到如下的结果。

图5-7 系统总体原理框图

5.3 系统仿真

图5-8 1hz信号

图5-9 10hz信号

图5-9 1Khz信号

 

 

 

 

  • 3
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
数字频率计是一种常见的电子测量仪器,用于测量信号的频率。在Verilog中设计数字频率计可以使用计数器和时钟信号来实现。以下是一个基本的Verilog数字频率计设计: ``` module freq_counter( input wire clk, // 时钟信号输入 input wire reset, //复位信号输入 input wire signal, //待测频率信号输入 output reg [31:0] count //输出计数器值 ); reg [31:0] count_reg; // 内部计数器寄存器 always @(posedge clk or posedge reset) begin if (reset) begin // 复位计数器 count_reg <= 0; end else begin count_reg <= count_reg + 1; // 计数器加1 end end reg [31:0] count_temp; // 存放计数器值的临时寄存器 reg [31:0] count_old; // 存放上一次计数器值的寄存器 reg [31:0] frequency; // 存放频率值的寄存器 always @(posedge clk) begin if (signal && !count_temp) begin count_old <= count_reg; end count_temp <= signal; end always @(posedge clk) begin if (count_temp && !signal) begin frequency <= $div(count_reg - count_old, 2); // 计算频率 end end assign count = count_reg; // 输出计数器值 endmodule ``` 这个数字频率计设计需要一个时钟信号作为输入,一个复位信号用于复位计数器,一个信号输入来测量频率。计数器每当时钟信号上升沿到达时,就会加1。当信号输入为高电平时,上一次计数器值将被存储在另一个寄存器中,并且计数器值将被存储在一个临时寄存器中。当信号输入为低电平时,频率将被计算并存储在另一个寄存器中。最后,输出是一个32位寄存器,用于存储计数器的值。 这只是一个基本的Verilog数字频率计设计示例。具体的实现取决于您的需求和所使用的硬件平台。您可以根据需要进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值