FPGA等精度测频

2023-11-04

频率测量在电子设计和测量领域中经常用到,因此对频率测量方法的研究在实际工程应用中具有重要意义。常用的频率测量方法有两种:频率测量法周期测量法。频率测量法是在时间t内对被测信号的脉冲数N进行计数,然后求出单位时间内的脉冲数,即为被测信号的频率。周期测量法是先测量出被测信号的周期T,然后根据频率f=1/T求出被测信号的频率。但是上述两种方法都会产生±1个被测脉冲的误差,在实际应用中有一定的局限性。根据测量原理,很容易发现频率测量法适合于高频信号测量,周期测量法适合于低频信号测量,但二者都不能兼顾高低频率同样精度的测量要求。
1 等精度测量原理
等精度测量的一个最大特点是测量的实际门控时间不是一个固定值,而是一个与被测信号有关的值,刚好是被测信号的整数倍。在计数允许时间内,同时对标准信号和被测信号进行计数,再通过数学公式推导得到被测信号的频率。由于门控信号是被测信号的整数倍,就消除了对被测信号产生的±l周期误差,但是会产生对标准信号±1周期的误差。等精度测量原理如图1所示。
在这里插入图片描述
从以上叙述的等精度的测量原理可以很容易得出如下结论:首先,被测信号频率fx的相对误差与被测信号的频率无关;其次,增大测量时间段“软件闸门”或提高“标频”f0,可以减小相对误差,提高测量精度;最后,由于一般提供标准频率f0的石英晶振稳定性很高,所以标准信号的相对误差很小,可忽略。假设标准信号的频率为100 MHz,只要实际闸门时间大于或等于1s,就可使测量的最大相对误差小于或等于10-8,即精度达到1/100 MHz。
2等精度测量实现
等精度测频的原理图如图2所示。图中,预置软件闸门信号GATE是由FPGA的定时模块产生,GATE的时间宽度对测频精度的影响较少,故可以在较大的范围内选择。这里选择预置闸门信号的长度为1s。图中的CNT1和CNT2是2个可控的32位高速计数器,CNT1_ENA和CNT2_ENA分别是其计数使能端,基准频率信号f0从CNT1_CLK输入,待测信号fx从CNT2的时钟输入端CONT2_CLK输入,并将fx接到D触发器的clk端。测量时,由FPGA的定时模块产生预置的GATE信号,在GATE为高电平,并且fx的上升沿时,启动2个计数器,分别对被测信号和基准信号计数,关闭计数闸门必须满足,GATE为低电平,且在fx的上升沿。若在一次实际闸门时间Tx中,计数器对被测信号的计数值为Nx,对标准信号的计数值为N0,而标准信号的频率为f0,则被测信号的频率为fx,则fx=(N0/Ns)f0。图2中的所有功能都在FPGA端实现。
在这里插入图片描述

module cymometer 
    (   
        input                 clk_fs ,    
        input                 rst_n  ,            
        input                 clk_fx ,//		待测信息
		
        output   reg [63:0]   data_fx   //输出频率   
);
 
localparam	 CLK_FS	   = 26'd50_000_000;           
localparam   GATE_TIME = 16'd100;    //门控时间,越大误差越小,但测量时间也会变长    
 
//reg define
reg                	gate        ;           
reg                	gate_fs     ;           
reg                	gate_fs_r   ;          
reg                	gate_fs_d0  ;          
reg                	gate_fs_d1  ;           
reg                	gate_fx_d0  ;          
reg                	gate_fx_d1  ;           
reg    [15:0]   	gate_cnt    ;          
reg    [31:0]   	fs_cnt      ;           
reg    [31:0]   	fs_cnt_temp ;           
reg    [31:0]   	fx_cnt      ;           
reg    [31:0]   	fx_cnt_temp ;           
 
//wire define
wire               neg_gate_fs;            
wire               neg_gate_fx;            
 
assign neg_gate_fs = gate_fs_d1 & (~gate_fs_d0);
assign neg_gate_fx = gate_fx_d1 & (~gate_fx_d0);
 
 
always @(posedge clk_fx or negedge rst_n) begin
    if(!rst_n)
        gate_cnt <= 16'd0; 
    else if(gate_cnt == GATE_TIME + 5)
        gate_cnt <= 16'd0;
    else
        gate_cnt <= gate_cnt + 1'b1;
end
 
 
always @(posedge clk_fx or negedge rst_n) begin
    if(!rst_n)
        gate <= 1'b0;
    else if(gate_cnt < 5)
        gate <= 1'b0;     
    else if(gate_cnt < GATE_TIME + 5)
        gate <= 1'b1;
    else if(gate_cnt <= GATE_TIME + 5)
        gate <= 1'b0;
    else 
        gate <= 1'b0;
end
 
 
always @(posedge clk_fs or negedge rst_n) begin
    if(!rst_n) begin
        gate_fs_r <= 1'b0;
        gate_fs   <= 1'b0;
    end
    else begin
        gate_fs_r <= gate;
        gate_fs   <= gate_fs_r;
    end
end
 
 
always @(posedge clk_fx or negedge rst_n) begin
    if(!rst_n) begin
        gate_fx_d0 <= 1'b0;
        gate_fx_d1 <= 1'b0;
    end
    else begin
        gate_fx_d0 <= gate;
        gate_fx_d1 <= gate_fx_d0;
    end
end
 
 
always @(posedge clk_fs or negedge rst_n) begin
    if(!rst_n) begin
        gate_fs_d0 <= 1'b0;
        gate_fs_d1 <= 1'b0;
    end
    else begin
        gate_fs_d0 <= gate_fs;
        gate_fs_d1 <= gate_fs_d0;
    end
end
 
 
always @(posedge clk_fx or negedge rst_n) begin
    if(!rst_n) begin
        fx_cnt_temp <= 0;
        fx_cnt <= 0;
    end
    else if(gate)
        fx_cnt_temp <= fx_cnt_temp + 1'b1;
    else if(neg_gate_fx) begin
        fx_cnt_temp <= 0;
        fx_cnt   <= fx_cnt_temp;
    end
end
 
 
always @(posedge clk_fs or negedge rst_n) begin
    if(!rst_n) begin
        fs_cnt_temp <= 0;
        fs_cnt <= 0;
    end
    else if(gate_fs)
        fs_cnt_temp <= fs_cnt_temp + 1'b1;
    else if(neg_gate_fs) begin
        fs_cnt_temp <= 0;
        fs_cnt <= fs_cnt_temp;
    end
end
 
 
always @(posedge clk_fs or negedge rst_n) begin
    if(!rst_n) begin
        data_fx <= 0;
    end
    else if(gate_fs == 1'b0)
        data_fx <= (CLK_FS * fx_cnt ) / fs_cnt;
end
 
endmodule 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FPGA等精度测频 的相关文章

  • 2022芯原芯片设计 笔试题分析和讨论

    2022芯原设计笔试题分析和讨论 以下仅为个人理解和分析 不保证正确 欢迎大家发表自己的想法 讨论出正确答案 企业知识题 1 1 D 芯原的主要经营模式为芯片设计平台即服务 Silicon Platform as a Service SiP
  • FPGA实战--等精度频率测量

    首先放置效果图 本次试验中采用的是等精度测频率 等精度测频的原理是产生一个1s的高电平 在高电平中对被测方波进行计数 所测得数字即该波形频率 具体等精度测量原理请参考 http www elecfans com d 591858 html
  • Xilinx 7系列芯片选型手册的资源量怎么看

    推荐阅读AMD官方文档 该文档介绍了各种资源的具体含义 链接 7 Series FPGAs Configurable Logic Block User Guide UG474 以XC7A35T为例 Logic Cells 逻辑单元 对于7系
  • FPGA(3)验证数字逻辑(与门、与非门、二选一数据选择器、2-4译码器、半加器、全加器)

    目录 一 验证与门 二 验证与非门 三 验证二选一数据选择器 四 验证2 4译码器 五 验证半加器 六 验证全加器 0 初始化定义 1 第一个半加器 2 第二个半加器 3 得到最终进位Co 代码 0决定与 1决定或 一 验证与门 只要有一个
  • IQ调制的过程

    正交调制 IQ modulation IQ调制器的相移器原理 正交调制数学表达和图形化过程i显示 关键元素都在里面 普通调制的过程 PAM调制的原理 IQ modulators are versatile building blocks f
  • Verilog之assign

    Verilog中的关键词assign主要用于如下两个地方 数据流建模 用于数据流建模的显示连续赋值语句语法格式如下
  • win10下安装vivado 2018.3之后ise14.7 的impact 无法使用

    软件版本号 操作系统win10 ise14 7 vivado 2018 3 ise14 7 在win10里面问题总结 1 ise14 7 闪退问题 比较好解决 论坛上比较多的解决方法 2 ise 14 7 windows 10 版本的ise
  • 采用Vivado 配置xilinx GTX的SATA设计

    从Vivado开始 配置GTX的时候 多了一个SATA协议支持 但有些小地方还需要自己另外设置 整理了一下 分享给大家 首先打开Transceivers wizard 打开页签 线速率和参考时钟选择 在协议里面选择SATA2或者SATA3
  • verilog 基本语法 {}大括号的使用

    的基本使用是两个 一个是拼接 一个是复制 下面列举了几种常见用法 基本用法 表示拼接 第一位 第二位 表示复制 4 a 等同于 a a a a 所以 13 1 b1 就表示将13个1拼接起来 即13 b1111111111111 拼接语法详
  • C++ 信号处理

    信号是由操作系统传给进程的中断 会提早终止一个程序 在 UNIX LINUX Mac OS X 或 Windows 系统上 可以通过按 Ctrl C 产生中断 有些信号不能被程序捕获 但是下表所列信号可以在程序中捕获 并可以基于信号采取适当
  • 【PIPE】流水线设计中的基本模块

    大概分成以下几节 1 概述及协议 2 valid forward valid超前 3 bubble collapse 消除气爆 4 input output skid 不知中文怎么说 5 pipe halt 流水停顿 6 idle pres
  • pandas学习笔记--增加行或列

    一 增加行 1 loc 想增加一行 行名称为 5 内容为 16 17 18 19 df loc 5 16 17 18 19 后面的序列是Iterable就行 2 at df at 5 16 17 18 19 3 set value df s
  • Verilog、FPGA、统一寄存器的使用

    我有一个问题 关于我正在开发的 AGC SPI 控制器在我看来奇怪的行为 它是用 Verilog 完成的 针对的是 Xilinx Spartan 3e FPGA 该控制器是一个依赖外部输入来启动的 FSM FSM的状态存储在状态寄存器它没有
  • 异步FIFO设计之格雷码

    目录 二进制转格雷码 格雷码转二进制 相邻的格雷码只有1bit的差异 因此格雷码常常用于异步fifo设计中 保证afifo的读地址 或写地址 被写时钟 或读时钟 采样时最多只有1bit发生跳变 在不考虑路径延时的情况下 因为源数据 读写地址
  • 用于 Verilog 或 SystemVerilog 的 TAP(测试任何协议)模块

    是否有 TAP 测试任何协议 http testanything org Verilog 的实现 那就太好了 因为这样我就可以使用证明来自动检查我的结果 更新 10 9 09 有人问为什么不使用断言 部分 TAP 为我提供了一些很好的报告
  • VHDL - PhysDesignRules:367

    当我尝试从 VHDL 代码合成 实现和生成程序文件时 我收到警告 当我尝试合成时出现此错误 WARNING Xst 647 Input
  • PyOpenCL 中的时间测量

    我正在 FPGA 和 GPU 中使用 PyOpenCL 运行内核 为了测量执行所需的时间 我使用 t1 time event mykernel queue c width c height block size block size d c
  • EMD+包络谱故障诊断

    EMD是一种信号处理方法 用于将信号分解成多个本征模态函数 Intrinsic Mode Functions IMF 每个IMF代表信号中的一个固有振动模式 VMD在处理非平稳信号和非线性信号方面具有较好的性能 包络谱峭度是一种用于描述信号
  • UIO 设备上的 mmap EINVAL 错误

    在尝试使用 UIO 而不是直接映射后 我在 Xilinx Zynq 上映射物理内存时遇到问题 dev mem 虽然计划是以普通用户身份运行应用程序 而不是root这仍在运行root 显然 第一个映射成功 其余映射到同一个文件描述符12 de
  • 从 OpenCV 代码到 FPGA 代码的转换是否比 Matlab 代码更容易? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想做一个关于图像处理的项目 我想知道如果我想在FPGA上实现这个项目 我应该在第一阶段选择Matla

随机推荐

  • 用循环语句while或for循环编写一个验证登陆的小程序

    要求 当用户名与密码全部正确时提示登陆成功 否则 提示登陆失败 三次验证失败退出系统 while循环 代码如下 import java util Scanner author Administrator public class Text6
  • Springboot中使用ModelMapper对outputdto转entity的坑

    今天在使用ModelMapper对outputdto转entity的时候发现转出来的entity是null的 在用inputdto转entity的时候没出现过这样的问题呢 对比了下inputdto和outputdto并没有什么不一样 可以说
  • 常用的ASCII码值

    常用的ASCII码值 1 什么是ASCII码 ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符 标准ASCII 码也叫基础ASCII码 使用7 位二进制数 剩下的1位二进制为0 来表示所有的大写和小写字
  • 目标检测小白入门(一)——背景、指标、数据集

    一 背景介绍 计算机视觉领域有四大主要任务 分别是图像分类 目标检测 目标跟踪 图像分割 图像分类的目标是将给定的图像进行分类 给图片或视频分配一个类别标签 比如图像中大部分都是气球 还有其他物体 要给这个图片或者视频提供气球的标签 目标检
  • C语言实现GB2312和UTF8之间的编码转换

    C语言实现GB2312和UTF8之间的编码转换 GB2312 GB2312编码适用于汉字处理 汉字通信等系统之间的信息交换 基本集共收入汉字6763个和非汉字图形字符682个 GB2312中对所收汉字进行了 分区 处理 字符集分成94个区
  • CocosCreator3.8研究笔记(十五)CocosCreator 资源管理Asset Bundle

    在资源管理模块中有一个很重要的功能 Asset Bundle 那什么是Asset Bundle 有什么作用 怎么使用 Asset Bundle呢 一 什么是Asset Bundle 有什么作用 在日常游戏开发过程中 为了减少游戏启动时 资源
  • 2020年必学的devops流行工具,你学会了吗?

    2020年必学的devops流行工具 1 Git 2 Docker 3 Selenium 4 Jenkins 5 Ansible 6 puppet 7 Nagios 8 Chef DevOps Development和Operations的
  • 第14.12节 Python中使用BeautifulSoup解析http报文:使用select方法快速定位内容

    一 引言 在 第14 10节 Python中使用BeautifulSoup解析http报文 html标签相关属性的访问 和 第14 11节 Python中使用BeautifulSoup解析http报文 使用查找方法快速定位内容 介绍了通过属
  • Python实现文本词频统计算法及完整代码

    Python实现文本词频统计算法及完整代码 Python是一种高级编程语言 广泛应用于数据科学 机器学习等领域 在文本处理方面 Python也有着得天独厚的优势 不仅提供了多种字符串操作函数 而且还可以使用各种开源库来处理文本 本文将介绍一
  • hdu 1043/poj 1077八数码问题 BFS+康托展开求解

    hdu poj include
  • JedisCommands

    import java util List import java util Map import java util Set Common interface for sharded and non sharded Jedis publi
  • 10天学会flutter DAY6 flutter 玩转异步加载

    玩转异步加载 异步支持 1 处理 Future 2 声明异步函数 3 async await 4 处理 Stream 5 isolate机制 6 生成器 7 元数据 异步支持 Dart 代码库中有大量返回 Future 或 Stream 对
  • 用 Pyqt5 制作一个动态水波进度条

    最近做了一个小项目 里面有一个需求需要添加一个动态进度条 进度条的样式就类似于水波来回起伏的那种形状 下面就是最初的展示效果 有一点区别 这里我加了一个进度自动增加的功能 end imag11252323 gif 下面先说一下这个效果的制作
  • OpenGL ES SL 3.0规范中以前的attribute改成了in varying改成了out

    有几个学习图形学不久的同学都问到这个问题 做一阐述 1 关键字的小修改大概由如下两点决定 第一 先考虑一个成本原则 一个关键字的定义是否修改 是由熟练程序员在使用该关键字时的思维成本来决定的 当然 还有一个原则 是由初学者的学习成本来决定的
  • BUUCTF [GWCTF 2019] 我有一个数据库

    BUUCTF GWCTF 2019 我有一个数据库 考点 目录扫描 phpmyadmin 4 8 1 远程文件包含漏洞 CVE 2018 12613 启动环境 应该是为乱码 结合题目名 应该与数据库有关 寻找提示无果 使用dirsearch
  • JavaBean的详细及引用

    1 JavaBean实际是具有统一接口格式的java类 2 JavaBean的组成 属性 Properties 方法 Method 事件 Events 3 一个JavaBean的例子 该例子是用的Simple属性 lt 属性在以后说 gt
  • (数据库-MySQL) Date 函数

    下面的表格列出了 MySQL 中最重要的内建日期函数 函数 描述 NOW 返回当前的日期和时间 CURDATE 返回当前的日期 CURTIME 返回当前的时间 DATE 提取日期或日期 时间表达式的日期部分 EXTRACT 返回日期 时间按
  • 设计模式(单例模式)

    设计模式第二弹 一 应用 1 1 概念 1 2 应用场景 二 实现 2 1 Python实现 一 应用 1 1 概念 单例模式是一种创建型的设计模式 这种设计模式主要的目的是为了让一个类只保留一个实例 1 2 应用场景 如果你需要创建一个数
  • 用微博图片反查上传者信息

    其实微博每一种图片都包含了上传者的信息 只是大家平时都不会去观察或者不知道罢了 我们经常会看见别的网站会有微博的外链缩略图 那么如何通过微博图片查找到其上传者呢 首先第一种方法 使用网站查询只要一张微博图片就可以帮你 查找出上传这张图的主人
  • FPGA等精度测频

    频率测量在电子设计和测量领域中经常用到 因此对频率测量方法的研究在实际工程应用中具有重要意义 常用的频率测量方法有两种 频率测量法 和周期测量法 频率测量法是在时间t内对被测信号的脉冲数N进行计数 然后求出单位时间内的脉冲数 即为被测信号的