基于FPGA的频率计

2023-11-02

好久没更了,百忙之中写一篇so easy的代码——基于FPGA的频率计设计。

一、简介

废话不多说,下面是百度搜索关于频率计的简洁概念。

数字频率计是一种基本的测量仪器,被广泛应用于航天、电子、测控等领域。基于传统测频原理的频率计的测量精度将随被测信号频率的下降而降低,在使用中有较大的局限性,而等精度频率计不但具有较高的测量精度,而且在整个频率区域能保持恒定的测试精度。

二、设计方案

对于频率计的设计,常用的方法有三种:测周法、测频法以及等精度测量法。

(1)测周法

测周法的测量对象一般是频率较低的被测信号,一般是选择取被测时钟的一个周期的上升沿或者下降沿都是可以的,下图是选择被测时钟一个周期的上升沿。

 由波形图中可以很快速的写出测周法的代码:

module cymometer
   #(parameter    SYS_CLK = 32'd100_000_000) // 基准时钟频率值
    (   //system clock
        input                 sys_clk ,     // 基准时钟信号
        input                 rst_n  ,     // 复位信号

        //cymometer interface
        input                 in_signal ,     // 被测时钟信号

       // output wire [31:0] fs_cnt_t/* synthesis syn_keep=1 */,
        output  reg  [31:0]   fre      // 被测时钟频率输出
);

//测周法(低频)
	
reg [31:0]	signal_cnt;						//对被测信号高电平进行计数的计数器


//在测信号高电平期间进行计数
always @(posedge sys_clk or negedge rst_n)begin	
	if(!rst_n)
		signal_cnt <= 0;
	else if(low_flag)
		signal_cnt <= signal_cnt + 1;
	else if(low_flag == 1'b0)
		signal_cnt <= signal_cnt;
end

reg [31:0] low_cnt;
reg low_flag;

always @(negedge in_signal or negedge rst_n )begin	
	if(!rst_n) begin
        low_cnt <= 4'd0;
        low_flag <= 1'b0;
    end
    else if(low_cnt < 4'd3) begin
        low_cnt <= low_cnt + 1'b1;
        low_flag <= 1'b0;
    end
    else if(low_cnt == 4'd3) begin
        low_cnt <= low_cnt + 1'b1;
        low_flag <= 1'b1;
    end
    else if(low_cnt == 4'd4) begin
        low_cnt <= low_cnt;
        low_flag <= 1'b0;
    end
end
            

//低频除法器
//在测信号低电平期输出测量数据
always @(negedge low_flag or negedge rst_n )begin	
	if(!rst_n)
		fre <= 0;
	else	
		fre <= SYS_CLK / signal_cnt;
end

一直比较忙,所以仿真图暂时不更新了,之前验证过了没啥问题,如果有问题需要的小伙伴可以自己调试哦。

(2)测频法

一般是使用比被测信号高得多的标准信号,基准时钟可以取一个固定值(如1S),然后被测时钟以上升沿或者下降沿计数,计数就为该被测时钟的频率,波形图如下。

 代码如下:

parameter CNT_2S = 32'd199_999_999;

//高频
reg [31:0] cnt_high;
reg    flag_1s;

always @(posedge sys_clk or negedge rst_n) begin
    if(!rst_n) begin
        cnt_high <= 32'd0;
        flag_1s <= 1'd0;
    end
    else if(cnt_high < 32'd10) begin
        cnt_high <= cnt_high + 32'd1;
        flag_1s <= 1'd0;
    end
    else if(cnt_high == 32'd10) begin
        cnt_high <= cnt_high + 32'd1;
        flag_1s <= 1'd1;
    end
    else if(cnt_high < 32'd10 + SYS_CLK) begin
        cnt_high <= cnt_high + 32'd1;
        flag_1s <= 1'd1;
    end
    else if(cnt_high == 32'd10 + SYS_CLK) begin
        cnt_high <= cnt_high + 32'd1;
        flag_1s <= 1'd0;
    end
    else if(cnt_high == 32'd10 + SYS_CLK + CNT_2S) begin
        cnt_high <= 32'd0;
        flag_1s <= 1'd0;
    end
end

reg [31:0] fre_high;

always @(posedge in_signal or negedge rst_n) begin
    if(!rst_n)
        fre_high <= 32'd0;
    else if(flag_1s == 1'b1)
        fre_high <= fre_high + 1'd1;
    else if(flag_1s == 1'b0)
        fre_high <= fre_high;
end

always@(negedge flag_1s or negedge rst_n) begin
    if(!rst_n)
        fre <= 32'd0;
    else
        fre <= fre_high;
end

(3)等精度测量法:

        等精度测量法与前两种方式不同,其最大的特点是,测量的实际门控时间不是一个固
定值,它与被测时钟信号相关,是被测时钟信号周期的整数倍。在实际门控信号下,同时
对标准时钟和被测时钟信号的时钟周期进行计数,再通过公式计算得到被测信号的时钟频
率。

        等精度测量法与前两种方式不同,其最大的特点是,测量的实际门控时间不是一个固
定值,它与被测时钟信号相关,是被测时钟信号周期的整数倍。在实际门控信号下,同时
对标准时钟和被测时钟信号的时钟周期进行计数,再通过公式计算得到被测信号的时钟频
率。

        结合等精度测量原理和原理示意图可得:被测时钟信号的时钟频率 fx 的相对误差与被测时钟信号无关;增大“软件闸门”的有效范围或者提高“标准时钟信号”的时钟频率fs,可以减小误差,提高测量精度。
        了解了等精度测量原理之后,我们来说明一下被测时钟信号的计算方法。首先我们先分别对实际闸门下被测时钟信号和标准时钟信号的时钟周期进行计数。

        我们设实际闸门被测时钟的计数为x,被测信号时钟周期为Tfx,他的时钟频率fx=1/Tfx,由此可以得公式:X * Tfx = X / fx = Tx(实际闸门)。
        实际闸门下标准时钟信号周期数为 Y,设被测信号时钟周期为 Tfs,它的时钟频率 fs =1/Tfs,由此可得等式: Y * Tfs = Y / fs = Tx(实际闸门)。

        其次,将两等式结合得到只包含各自时钟周期计数和时钟频率的等式: X / fx = Y / fs =Tx(实际闸门),等式变换, 得到被测时钟信号时钟频率计算公式: fx = X * fs / Y。最后,将已知量标准时钟信号时钟频率 fs 和测量量 X、 Y 带入计算公式, 得到被测时钟信号时钟频率 fx。

        根据上面的分析,我们可以设计一个等精度的频率计模块。首先是进行波形图的绘制:

 

module frequency(
	input				sys_clk		,
	input				sys_rst_n	,
	input				clk_test	,
	input               clk_100M    ,
    
	output	reg	[33:0]	freq
);

parameter   CLK = 100_000_000;

parameter	CNT_X	=	28'd12_499_999,
			CNT_5X	=	28'd62_499_999,
			CNT_6X	= 	28'd74_999_999;


wire			gate_fx_neg;		//被测闸门下降沿
wire			gate_fs_neg;		//基准闸门下降沿
wire            locked;

assign locked = 1'b1;

reg		[27:0]	cnt;				//
reg				gate_soft;          //软件闸门
reg				gate_a	 ;			//实际闸门
reg				gate_fx_reg;          //被测闸门
reg				gate_fs_reg;          //基准闸门
reg		[31:0]	cnt_gate_fx;		//被测闸门计数器
reg		[31:0]	cnt_gate_fs;		//基准时钟闸门计数器
reg     [31:0]  fx_cnt     ;        //被测频率计数
reg     [31:0]  fs_cnt     ;        //标准频率计数
reg             cala_flag  ;        //计算标志位
reg     [63:0]  fre_cnt    ;        //频率计数器
reg             cala_flag_reg  ;    //计算标志寄存器

always@(posedge sys_clk	or negedge sys_rst_n)
	if(!sys_rst_n)
		cnt <= 28'd0;
	else if(cnt == CNT_6X)
		cnt <= 28'd0;
	else
		cnt <= cnt + 28'd1;
		
//软件闸门
always@(posedge sys_clk	or negedge sys_rst_n)
	if(!sys_rst_n)
		gate_soft <= 1'b0;
	else if(cnt <= CNT_X || cnt > CNT_5X)
		gate_soft <= 1'b0;
	else
		gate_soft <= 1'b1;
		
//实际闸门
always@(posedge sys_clk	or negedge sys_rst_n)
	if(!sys_rst_n)
		gate_a <= 1'b0;
	else
		gate_a <= gate_soft;
		
//被测闸门		
always@(posedge clk_test or negedge sys_rst_n)
	if(!sys_rst_n)
		gate_fx_reg <= 1'b0;
	else
		gate_fx_reg <= gate_a;

//被测计数器
always@(posedge clk_test or negedge sys_rst_n)
	if(!sys_rst_n)		
		cnt_gate_fx <= 32'd0;
	else if(gate_a == 1'b0)
		cnt_gate_fx <= 32'd0;
	else if(gate_a == 1'b1)
		cnt_gate_fx <= cnt_gate_fx + 32'd1;
		
//取下降沿
assign  gate_fx_neg = gate_fx_reg && ~gate_a; 

//被测计数器
always@(posedge clk_test or negedge sys_rst_n)
	if(!sys_rst_n)		
		fx_cnt <= 32'd0;
    else if(gate_fx_neg == 1'b1)
        fx_cnt <= cnt_gate_fx;

		
//基准闸门		
always@(posedge clk_100M or negedge sys_rst_n)
	if(!sys_rst_n)
		gate_fs_reg <= 1'b0;
	else
		gate_fs_reg <= gate_a;
    
		
//基准闸门计数器		
always@(posedge clk_100M or negedge sys_rst_n)
	if(!sys_rst_n)		
		cnt_gate_fs <= 32'd0;
	else if(gate_a == 1'b0)
		cnt_gate_fs <= 32'd0;
	else if(gate_a == 1'b1)
		cnt_gate_fs <= cnt_gate_fs + 32'd1;
		
//取下降沿	
assign  gate_fs_neg = gate_fs_reg && ~gate_a; 	
	
//标准时钟计数
always@(posedge clk_100M or negedge sys_rst_n)
	if(!sys_rst_n)		
		fs_cnt <= 32'd0;
    else if(gate_fs_neg == 1'b1)
        fs_cnt <= cnt_gate_fs;	


//频率计数器
always@(posedge sys_clk or negedge sys_rst_n)
	if(!sys_rst_n)
		fre_cnt <= 64'd0;
    else if(cala_flag == 1'b1)
        fre_cnt <= CLK*fx_cnt/fs_cnt;
        
//计算标志位
always@(posedge sys_clk or negedge sys_rst_n)
	if(!sys_rst_n) begin
		cala_flag <= 1'b0;
        cala_flag_reg <= 1'b0;
    end
    else if(cnt == CNT_6X) begin
        cala_flag <= 1'b1;
        cala_flag_reg <= cala_flag;
    end
		

always@(posedge sys_clk or negedge sys_rst_n)
	if(!sys_rst_n) 
        freq <= 34'd0;
    else if(cala_flag_reg == 1'b1)
        freq <= fre_cnt;
          
        
endmodule		

仿真代码:

`timescale 1ns / 1ns

module tb_freq();


reg				sys_clk		;
reg				sys_rst_n	;
reg				clk_test	;
	                        
wire	[33:0]	freq        ;

initial begin   
    sys_clk = 1'b1;
    sys_rst_n <= 1'b0;
    clk_test = 1'b1;
    #201
    sys_rst_n <= 1'b1;
end

always #10 sys_clk = ~sys_clk;

always #30  clk_test = ~clk_test;

defparam    frequency_inst.CNT_X = 12_4,
            frequency_inst.CNT_5X = 62_4,
            frequency_inst.CNT_6X = 74_9;


frequency   frequency_inst(
	.sys_clk	(sys_clk    ),
	.sys_rst_n	(sys_rst_n  ),
	.clk_test	(clk_test   ),
	
	.freq       (freq       )
);

endmodule

然后我们看一下仿真波形:

首先是被测时钟的计数波形

 其次是标准时钟计数波形

最后看一下计算的结果

        计算的结果为100_000_000*167/1000=16_700_000,结果是没有问题的,我们再看一下上板验证的结果:

         这里测试时钟设置的频率为34.15926,PLL会保留小数点后三位也就是34.146,然后我们看一下上板之后的结果:

 结果跟我们设置的锁相环结果是一致的,我们再来试一下高频的测试:

 

 

        锁相环输出的结果为109.091,而我们频率计显示的频率为109.09,结果有一丢丢差异,就跟我们前面讲的一样,如果为了计算的精确,可以调节基准时钟频率或软件闸门的保持时间对同一信号进行频率测量。但相对于测频和测周法来说,等精度的精度相度更加灵活和精准。

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于FPGA的频率计 的相关文章

  • Verilog 奇怪的仿真结果综合后

    我面临一个奇怪的问题 该代码适用于简单的 ALU 仅将感兴趣的代码粘贴到此处 always posedge clk or posedge rst begin if rst 1 begin mul valid shr 3 b000 end e
  • EDAplayground 中不显示时钟波形

    当尝试在 EDA Playground 中显示时钟波形时 出现错误 执行中断或达到最大运行时间 如何显示波形 EDA Playground 上的代码 module test reg clk initial begin dumpfile du
  • 为什么这个 verilog 关系语句返回 true?

    我有一条名为 sin hall2 的 9 位签名线 该语句返回 true sin hall2 8 0 gt 9 d1 当我查看模拟时 sin hall2 169 我假设这是 verilog 处理比较负数的方式 但我做错了什么 当我执行 si
  • Verilog 中总是后面跟着 #(...) pound 是什么意思?

    在一个简单的时钟生成器示例中 我看到以下代码 always cycle 2 clk clk 我以前总是见过 但没见过井号 我试图在文档中找到它 但我所能找到的只是一些对 实值端口 的引用 没有进一步的阐述 这是一个延迟操作 它本质上只是读取
  • 使用forever和always语句

    以下两个代码都会生成一个时钟 我需要知道除了时钟生成之外 永远循环是否还有其他用途 我只在时钟一代中遇到过永远 如果只是为了这个目的 那岂不是毫无用处 initial begin clk 0 forever begin 5 clk clk
  • Matlab图像处理系列——图像复原之噪声模型仿真

    微信公众号上线 搜索公众号 小灰灰的FPGA 关注可获取相关源码 定期更新有关FPGA的项目以及开源项目源码 包括但不限于各类检测芯片驱动 低速接口驱动 高速接口驱动 数据信号处理 图像处理以及AXI总线等 本节目录 一 图像复原的模型 二
  • DSCA190V 57310001-PK

    DSCA190V 57310001 PK DSCA190V 57310001 PK 具有两个可编程继电器功能 并安装在坚固的 XP 外壳中 DSCA190V 57310001 PK 即可使用 只需最少的最终用户校准 DSCA190V 573
  • 如何将时钟门映射到技术库单元

    我的设计中有以下时钟门 module my clkgate clko clki ena Clock gating latch triggered on the rising clki edge input clki input ena ou
  • 我们可以在 C 或 SystemVerilog 中使用 ifdef MACROS 中的条件吗?

    我想要那样的东西 ifdef N O gt N I define GREATER 1 else define LESSER 1 endif 但做不到 有什么解决方案或阅读吗 我很努力地想要做到这一点 但是却做不到 Verilog 不提供这样
  • 在 Mac OS X 10.6.8 上用什么来编译和模拟 Verilog 程序?

    作为教学大纲的一部分 我需要模拟 Verilog 程序 但是 我的大学使用 Xilinx ISE 但它不适用于 Mac 因此 请帮助我提供最好的软件以及有关如何安装和使用它们的一些详细步骤 你可以尝试伊卡洛斯 Verilog http iv
  • 为什么 Verilog 不被视为编程语言? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 教授在课堂上说学生不应该说他们学会了用Verilog 编程 他说 Verilog 之类的东西不是用来编程的 而是用来设计的 那么 Verilog
  • 如何在Verilog中将二维数组中的所有位设置为0?

    我构建了一个 8 2bits 数组来表示 Verilog 中的一块内存 reg 1 0 m 0 7 该存储器有一个复位信号 如果复位为1 则该存储器中的所有位都应重置为0 但是我不知道如何以简洁的方式设置m的所有位 因为如果有数百个内存中有
  • Verilog 中的 If 语句和分配连线

    我试图弄清楚基于组合逻辑分配电线的基础知识 I have wire val wire x wire a wire b always begin if val 00 I want to assign x a if val 01 I want
  • 我怎样才能让我的verilog移位器更通用?

    这里我有一个移位器 但现在它最多只能工作 3 位 我一直在寻找 但不知道如何让它工作最多 8 位 module shifter a b out input 7 0 a b output 7 0 out wire 7 0 out1 out2
  • Verilog 按位或 ("|") 单子

    我见过 Verilog 代码 其中使用了按位或运算符 目的是什么 例如 address 15 14 0 or address 15 14 io din ramrd 不能省略 吗在这些情况下 在这种情况下 它充当归约运算符 例如 4 b100
  • 学习 Verilog 的资源 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我是 Verilog 新手 有人可以推荐学习资源 书籍 视频 博客或任何他们有良好个人经验并帮助他们更
  • \add_34/U1_1_6 的 Verilog 命名约定

    有人可以解释一下这个命名约定在下面的 Verilog 行中意味着什么吗 我不知道这是什么 add 34 部分的意思是 ADDHXL add 34 U1 1 6 A n1022 B add 34 carry 6 CO add 34 carry
  • 为什么我们在FGPA / VHDL / VIVADO中使用REG?

    我正在使用 Xilinx 的 vivado 在 verilog 中进行编程 我想知道为什么我们使用某些输出reg 例如reg 3 0 encoder output我们使用它是因为我们的 16 到 4 编码器有 4 个输出 对吧 我假设我们使
  • Verilog 中如何使用函数?

    在我的 FPGA Verilog 课程中 我的教授只是回顾了函数 他说在函数中 你可以按程序编写代码 然后 当您想要调用该函数时 您可以在always块中调用它 即 程序性地 也可以使用分配语句来调用它 对我来说 如何使用过程代码编写函数
  • 修改verilog模式缩进

    我试图让 verilog 模式使用 2 个空格缩进除 decls 和always 之外的所有内容 这是我添加到 emacs 中的内容 define are not indented setq veril

随机推荐

  • 高仿钉钉和小米的日历控件,很实用

    http mp weixin qq com s cWD7ex7WVT8bzQpxFHmCyA ref myread
  • mysql sum 重复计算_mysql join sum时数据重复问题及解决方案

    当我们使用mysql的join功能从多张表中取出数据并使用sum分别对取出的数据求和时 会发现sum出来的值是不对的 往往是正确值的整数倍 为什么会出现这样的情况呢 复现 假设有两张表 user buy 和user sell 分别记录了用户
  • 基于Qt的智能车载系统嵌入式项目(正点原子IMX6ULL开发板)

    基于正点原子的IMX6ULL开发板的智能车载系统 Qt 提示 该项目借鉴了不少大佬的代码 我没有自己造轮子 代码在文章末尾 同时附上参考链接 本人其他项目链接基于linux的智能仓储项目 基于Qt的人脸识别 基于STM32的智能家居 移植人
  • Kali 2 Kali 2018更新源

    这个源指的是软件源 也就是说你用apt get install xxx安装软件时 系统下载软件的地方 一般默认为国外的链接 所以速度比较慢 需要换成国内的源 设置kali的更新源 在终端中打开sources list root kali v
  • 海康威视web插件【浏览器部分兼容& 全兼容】

    更新时间 2020年9月18日 前言 博主自从写了这篇文章到现在 有好多友友来问我问题 以及我自己也在不断的尝试开发 现在我归纳一下从17年到现在我遇到的问题和友友们遇到的问题以及一些资料总结 资料 3 0开发包 https downloa
  • Java中的File与字符流,字节流

    File File类概述和构造方法 File 他是文件和目录路径名的抽象表示 文件和目录是可以通过File封装成对象的 对于FIle而言 其封装的并不是一个真正存在的文件 仅仅是一个路径名而已 它可以是存在的 也可以是不存在的 将来是要通过
  • Java 统计连续签到天数

    说明 签到功能根据业务情况的不同大致分为两种 一种是只要进入系统就会默认签到 另外一种是进入系统之后需要用户手动点击签到按钮进行签到 两种情况最大的区别就是 自动签到连续签到天数肯定至少为1天 而手动签到的情况则需要考虑断签的情况 1 自动
  • 关于list容器(链表)

    list容器基本概念 list优点 list容器的迭代器 以下代码为验证list是否为循环链表 list构造函数 list数据元素插入和删除操作 list大小操作 list赋值操作 list数据的存取 list常用操作 list容器基本概念
  • QGLViewer+VS(MSVC2013)配置

    工具 libQGLViewer 2 7 2 Visual Studio 2013 Uitimate QT5 9 1 MSVC2013 另外在VS中使用QT显示界面需要下载qt vsaddin msvc2013 2 2 0 vsix官网下载
  • STM32的HAL库开发系列 - GPIO中断/外部中断EXTI

    STM32的HAL库开发系列 GPIO中断 外部中断EXTI 中断它可以在GPIO口的电平发生变化时产生中断 从而使得STM32微控制器能够及时响应外部设备的变化 STM32的GPIO中断 外部中断EXTI可以配置为上升沿中断 下降沿中断和
  • c/c++教程 - 2.4.3 this指针作用,链式编程思想,空指针访问成员函数,const修饰成员函数,常函数,常对象

    目录 4 3 C 对象模型和this指针 4 3 1 成员变量和成员函数分开存储 4 3 2 this指针概念 非常重要 4 3 3 空指针访问成员函数 4 3 4 const修饰成员函数 相关教程 4 3 C 对象模型和this指针 4
  • C++基本数据类型

    一 数据类型 C 的数据类型有四类 基本类型 结构类型 指针类型 和空类型 void 二 部分基本数据类型说明 1 整型 1 int 整数就是没有小数点部分的数字 如2 98 100和0 在C 中提供多种整型 按示数范围分为短整数 shor
  • "Mac OS X"想要进行更改。键入管理员的名称和密码以允许执行此操作("Mac OS X"想使用系统钥匙串)...

    不知什么时候开始 每次我在运行xcode在真机上 或者archive打包的时间 都会弹出输入用户名和密码的框 搞的烦死了 解决方法 打开钥匙串访问 双击那些密钥弹出框 改变到允许所有应用程序访问此项目 输入一次密码即可 解决 不用每次输入了
  • Qt Widgets 与 QML/Qt Quick

    Qt Widgets 更老 更成熟 可以做gui界面 适合传统的桌面程序 QML Qt Quick 开发更 现代 的 UI 与高级应用 渲染效果更佳 界面更炫酷 参考 https my oschina net u 4000302 blog
  • Ant Design 常见用法与坑点总结(一)

    前言 Ant Design 是蚂蚁出品的出色优秀的 React 组件库 相信使用 React 进行管理系统开发的小伙伴们或多或少都接触过 Ant Design 很多公司基于 React 开发的管理端系统也都是使用 Ant Design 的组
  • 运动估计与运动补偿

    运动估计与运动补 偿 改正 2010 11 17 10 29 29 运动补偿是通过先前的局部图像来预测 补偿当前的局部图像 它是减少帧序列冗余信息的有效方法 运动估计是从视频序列中抽取运动信息的一整套技术 运动估计与运动补偿技术 MPEG
  • 基于matlab的长短期神经网络LSTM的电力负荷预测

    目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 基于长短期神经网络LSTM的电力负荷预测 MATALB代码 效果图 结果分析 展望 参考论文 背影 电力负荷预测的实质是从已知的电力系统 经济 社会 气象等情况出发 根据历史负荷变化
  • Vue入门基础(环境搭建+软件安装+问题解决)

    如何创建一个vue项目 打开cmd 输入如下指令 因人而异自己电脑上就进入想创建的目录 输入vue init webpack 项目名称 接下来打开vscode找到新建的文件夹 package json经过观察可以发现 现在没有配置Vuex
  • HTMLCanvasElement.toDataURL()

    HTMLCanvasElement toDataURL 方法返回一个包含图片展示的 data URI 可以使用 type 参数其类型 默认为 PNG 格式 图片的分辨率为96dpi 如果画布的高度或宽度是0 那么会返回字符串 data 如果
  • 基于FPGA的频率计

    好久没更了 百忙之中写一篇so easy的代码 基于FPGA的频率计设计 一 简介 废话不多说 下面是百度搜索关于频率计的简洁概念 数字频率计是一种基本的测量仪器 被广泛应用于航天 电子 测控等领域 基于传统测频原理的频率计的测量精度将随被