周期法频率计的设计
目录
周期法频率计
分析:
设计过程:
周期法频率计
对于低频信号,应用周期法进行测频。周期法测频的基本原理是:应用标准频率信号统计被测信号两个相邻脉冲之间的脉冲数,然后通过脉冲数计算出被测信号的周期,再根据频率与周期之间的倒数关系计算出频率值。
分析:
(1)10mHz信号的周期为100秒。若应用50MHz晶振信号统计被测信号的周期,则两个相邻脉冲之间需要统计(50×106×100=)5×109个脉冲,因此需要应用33位二进制计数器(233=8588934592>5×109)进行计数。 (2)被测信号的周期以两个相邻脉冲的边沿为基准进行测量。
信号边沿检测的通用方法是:应用同步寄存器来捕获和存储被测频率信号。若应用三级右移寄存器作为同步器,如图所示,当存储数据Q0Q1Q2=x10 时,表示检测到被测信号的上升沿,存储数据Q0Q1Q2=x01时,表示检测到被测信号的下降沿,其中x表示无关位。
描述信号边沿检测电路的Verilog代码参考如下:
module edge_detector (input det_clk, // 时钟,50MHzinput rst_n, // 复位信号,低电平有效input x_signal, // 被测信号output wire rising_edge, // 上升沿标志,高电平有效output wire fall_edge // 下降沿标志,高电平有效);reg [0:2] sync_reg; // 三级同步寄存器定义// 同步移存过程always @( posedge det_clk or negedge rst_n ) if ( !rst_n ) sync_reg <= 3'b000;else sync_reg <= { x_signal, sync_reg[0:1] };// 边沿检测逻辑assign rising_edge = sync_reg[1] & ~sync_reg[2];assign fall_edge = ~sync_reg[1] & sync_reg[2];
endmodule
设计过程:
对于周期法频率计,状态机内部需要定义4个状态:复位(RESET)、空闲(IDLE)、计数(COUNT)和结束(DONE)。 状态转换的基本思路是: (1)复位信号有效时,强制状态机处于RESET状态; (2)复位信号撤销后,状态机转入IDLE状态,等待被测信号的有效沿。 (3)检测到第一个有效沿时,状态机转入COUNT状态,开始进行计数; (4)检测到第二个有效沿时,状态机转入DONE状态,停止计数并输出周期计数值; (5)状态机处于DONE时,下一个时钟脉冲转入IDLE状态。
根据上述状态转换图,描述周期测量状态机的Verilog代码参考如下:
module period_detector (input det_clk, // 检测电路时钟,50MHzinput rst_n, // 复位信号,低电平有效input x_signal, // 被测频率信号output reg [32:0] period_value // 周期测量值);// 状态定义及编码localparam RESET = 4'b0001;localparam IDLE = 4'b0010;localparam COUNT = 4'b0100;localparam DONE = 4'b1000;// 内部线网和变量定义reg [0:2] sync_reg; // 移位寄存变量(* synthesis,probe_port,keep *) wire fall_edge; // 下降沿标志reg [3:0] current_state,next_state; // 现态与次态(* synthesis,probe_port,keep *) wire cnt_en; // 计数允许信号(* synthesis,probe_port,keep *) reg [32:0] period_cnt; // 周期计数值// 下降沿检测逻辑assign fall_edge = ~sync_reg[1] & sync_reg[2];// 计数允许逻辑assign cnt_en = ( current_state == COUNT );// 同步移存过程always @( posedge det_clk or negedge rst_n ) if ( !rst_n ) sync_reg <= 3'b000;else sync_reg [0:2] <= { x_signal, sync_reg[0:1] }; // 状态机转换过程always @( posedge det_clk or negedge rst_n )if ( !rst_n ) current_state <= RESET; else current_state <= next_state;// 次态逻辑描述always @ ( current_state )case ( current_state )RESET: next_state <= IDLE;IDLE: if ( fall_edge ) next_state <= COUNT;else next_state <= IDLE;COUNT: if ( fall_edge ) next_state <= DONE;else next_state <= COUNT;DONE: next_state <= IDLE;default: next_state <= RESET;endcase// 周期计数过程always @( posedge det_clk ) if ( current_state == IDLE )period_cnt <= {33{1'b0}};else if ( cnt_en )period_cnt <= period_cnt + 1'b1;// 计数锁存过程always @ ( current_state )if ( current_state == DONE )period_value <= period_cnt;
endmodule
上述状态机代码的仿真波形如图所示。从图中可以看出,状态机时序正确。
应用状态机统计到被测信号周期的计数值period_value后,还需要将计数值转换为周期值,然后再换算为频率值。 由于状态机的时钟为50MHz,所以标准信号的周期 Tdet_clk=20ns,因此被测信号的周期值Tx为 Tx = period_value × Tdet_clk = period_value × 20 (ns) 因此,被测信号的频率值为 fx = 1/Tx = 109/ (period_value × 20) = 5×107/ period_value (Hz) 由上式可以看出,需要应用除法器来计算被测信号的频率值。
测量10mHz~10kHz低频信号的频率,定义被测信号的频率大于等于1Hz时,频率值以“4位整数+4位小数”的格式显示,被测信号的频率小于1Hz时,频率值以“8位小数”的格式显示。
设fx=qqq...qqqq.rrrr rrrr...r。为处理方便,先将计算得到的频率值fx扩大108倍,因此,当频率小于1Hz时除法的商即为实际的频率值,以“8位小数”格式显示。当频率大于小于1Hz时,再缩小104倍(相当于将fx只扩大104倍),则以“4位整数+4位小数”加上小数点显示时,即为实际的频率值。 由于被除数5×1015需要用53位二进制数(252<5×1015<253)表示,而除数period_value为33位二进制数,因此需要定制53位二进制数除以33位二进制数的除法器。
在“DIVIDER_for_freqor_inst.v”前打√,表示生成例化模板文件,以便可以应用例化语句调用定制的除法器。
根据上述处理思路,将周期计数值转换为频率的Verilog描述代码参考如下:
module period2freq (input [32:0] period_value, // 33位周期计数值output wire [27:0] freq_value, // 频率值,需要应用BIN28toBCD转换为8个BCD码output wire DP_flag // 小数点标志);// 内部线网定义wire [52:0] div_quotient; // 53位除法商数wire [32:0] div_remain; // 33位除法余数wire [52:0] freq_temp; // 商数÷10000// 除法器IP例化 DIVIDER_for_freqor DIVIDER_for_freqor_inst (.denom ( period_value ), // 分母,周期计数值.numer ( 53'd5000000000000000 ), // 分子,常数5×1015.quotient ( div_quotient ), // 除法商数,53位.remain ( div_remain ) // 除法余数,33位);// 频率显示值和小数点标志输出assign freq_temp = div_quotient/10000; assign freq_value = (div_quotient<100000000)? // 小于108?div_quotient[27:0] : // 小于1Hz,以“8位小数”显示freq_temp[27:0]; // 大于等于1Hz,以“4位整数+4位小数”显示assign DP_flag = ( div_quotient<100000000 )? 0 : 1; endmodule
20路分频式信号源,输出信号频率为:0.01~6103Hz,由4.5节中模块fx32.v简化而来。
module fx20 ( input clk50, // 时钟,50MHzinput [4:0] fsel, // 频率选择output reg fpout // 信号源输出);// 内部变量定义reg [31:0] q; // 计数变量// 计数逻辑描述always @(posedge clk50 ) q <= q + 1'b1;// 输出选择过程 always @(fsel,q) case (fsel) // 根据fsel分频输出5'b01100: fpout = q[12]; // 6103.515625Hz5'b01101: fpout = q[13]; // 3051.7578125Hz 5'b01110: fpout = q[14]; // 1525.87890625Hz 5'b01111: fpout = q[15]; // 762.939453125Hz5'b10000: fpout = q[16]; // 381.4697265625Hz 5'b10001: fpout = q[17]; // 190.7348631825Hz5'b10010: fpout = q[18]; // 95.367431640625Hz5'b10011: fpout = q[19]; // 47.6837158203125Hz5'b10100: fpout = q[20]; // 23.84185791015625Hz5'b10101: fpout = q[21]; // 11.920928955078125Hz5'b10110: fpout = q[22]; // 5.9604644775390625Hz5'b10111: fpout = q[23]; // 2.9802322876953125Hz5'b11000: fpout = q[24]; // 1.490116119384765625Hz5'b11001: fpout = q[25]; // 0.7450580596923828125Hz5'b11010: fpout = q[26]; // 0.37252902984619140625Hz5'b11011: fpout = q[27]; // 0.186264514923095703125Hz5'b11100: fpout = q[28]; // 0.0931322574615478515625Hz5'b11101: fpout = q[29]; // 0.04656612873077392578125Hz5'b11110: fpout = q[30]; // 0.023283064365386962890625Hz5'b11111: fpout = q[31]; // 0.0116415321826934814453125Hzdefault: fpout = q[14]; // 1525.87890625Hzendcaseendmodule
相关文章:

周期法频率计的设计
目录 周期法频率计 分析: 设计过程: 周期法频率计 对于低频信号,应用周期法进行测频。周期法测频的基本原理是:应用标准频率信号统计被测信号两个相邻脉冲之间的脉冲数,然后通过脉冲数计算出被测信号的周期ÿ…...
【Linux】drop cache与reclaim的区别
前言 在 Linux 内核中,drop cache和reclaim是两种不同的内存管理机制,它们的目的和实现方式有所不同。 Drop Cache 定义 drop cache 是一种手动操作,允许用户通过向 /proc/sys/vm/drop_caches 写入特定的值,直接清除系统中的缓…...

【Linux课程学习】:命令行参数,环境变量
🎁个人主页:我们的五年 🔍系列专栏:Linux课程学习 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 命令行参数: 用命令行参数实现不同…...

HTB:WifineticTwo[WriteUP]
目录 连接至HTB服务器并启动靶机 信息搜集 使用rustscan对靶机TCP端口进行开放扫描 使用nmap对靶机开放端口进行脚本、服务扫描 使用curl访问靶机8080端口 使用浏览器直接访问/login路径 漏洞利用 使用searchsploit搜索该WebAPP漏洞 Payload USER_FLAG:bb…...

mac安装Pytest、Allure、brew
安装环境 安装pytest 命令 pip3 install pytest 安装allure 命令:brew install allure 好吧 那我们在安装allure之前 我们先安装brew 安装brew 去了官网复制了命令 还是无法下载 如果你们也和我一样可以用这个方法哦 使用国内的代码仓库来执行brew的安装脚本…...

关于相机选型的一些参数说明
上一篇:关于相机的一些参数计算(靶面、视野等) 目录 1.卷帘快门和全局快门1.1 卷帘快门1.2 全局快门PS:视觉伺服与快门选择 2.黑白和彩色3.CCD和CMOS3.1 CCD3.2 CMOSCCD VS CMOS 4.面阵和线扫4.1 面阵4.2 线扫4.3 面阵 VS 线扫 5.…...
深入解析 Cron 表达式高级用法:Spring 与 Linux Crontab 的全面对比与实践20241120
深入解析 Cron 表达式高级用法:Spring 与 Linux Crontab 的全面对比与实践 任务调度是后台服务中的重要组成部分,无论是定期数据备份、日志归档还是周期性报表生成,Cron 表达式始终是描述这些任务规则的核心工具。本文将聚焦 Spring Cron 表…...
24软专 数据结构
1、A[n],k,将数组向右循环移动k位。要求时间复杂度O(n),空间O(1)。 思路:采用三次反转数组的操作,可以实现时间复杂度为O(n),空间复杂度为O(1)的算法。 void moveElem(int array[],int k,int length){//a…...

洛谷 P1616 疯狂的采药 C语言 记忆化搜索
题目: https://www.luogu.com.cn/problem/P1616?contestId215526 完全背包问题,最后一个超出空间了。完全背包和就是无限次的拿,公式跟01背包差不多。 但是,只有当前能拿和拿不下,换下一个。注意要处理好边界条件。…...

#渗透测试#红蓝攻防#HW#SRC漏洞挖掘01之静态页面渗透
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…...
element-plus入门教程:Button
一、Button组件概述 Element Plus的Button组件是一个常用的操作按钮,提供了多种类型、尺寸、状态等配置选项,以满足不同的交互需求。 二、安装Element Plus 在Vue 3项目中,可以通过npm或yarn来安装Element Plus。 npm install element-pl…...

oneplus6线刷、trwp、magisk(apatch)、LSPosed、Shamiko、Hide My Applist
oneplus6线刷android10.0.1 oneplus6线刷包(官方android10.0.1)下载、线刷教程: OnePlus6-brick-enchilada_22_K_52_210716_repack-HOS-10_0_11-zip 启用开发者模式 设置 / 连续点击6次版本号 : 启用开发者模式设置/开发者模式/{打开 usb调试, 打开 网络adb调试,…...

flux的版本
1.flux1-dev.safetensors https://huggingface.co/black-forest-labs/FLUX.1-devhttps://huggingface.co/black-forest-labs/FLUX.1-dev原生的23.8G的模型。原生12B的模型,float16的。需要配合ae.safetensors,flux1-dev.safetensors以及clip-l和T5的权重使用,注意ae.sft和f…...
Kafka 数据倾斜:原因、影响与解决方案
Kafka:分布式消息系统的核心原理与安装部署-CSDN博客 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例-CSDN博客 Kafka 生产者全面解析:从基础原理到高级实践-CSDN博客 Kafka 生产者优化与数据处理经验-CSDN博客 Kafka 工作流程解析:…...

【从零开始的LeetCode-算法】3297. 统计重新排列后包含另一个字符串的子字符串数目 I
给你两个字符串 word1 和 word2 。 如果一个字符串 x 重新排列后,word2 是重排字符串的 前缀,那么我们称字符串 x 是 合法的 。 请你返回 word1 中 合法 子字符串的数目。 示例 1: 输入:word1 "bcca", word2 "…...

【2024APMCM亚太赛A题】完整参考论文与代码分享
A题 一、问题重述二、问题分析问题一:水下图像分类问题二:退化原因建模问题三:针对单一退化的图像增强方法问题四:复杂场景的综合增强模型问题五:针对性增强与综合增强的比较 三、问题假设退化特征独立性假设物理模型普…...

Excel求和如何过滤错误值
一、问题的提出 平时,我们在使用Excel时,最常用的功能就是求和了,一说到求和你可能想到用sum函数,但是如果sum的求和区域有#value #Div等错误值怎么办?如下图,记算C列中工资的总和。 直接用肯定会报错&…...

Android 常用命令和工具解析之GPU相关
目录 1、GPU基本信息 1.1 获取GPU基本信息 1.2 伪造GPU基本信息 2、GPU内存信息 3、经典案例 案例1:GPU伪造信息方案 案例2:GPU内存统计算法 GPU 指的是 Graphics Processing Unit,即图形处理单元。GPU 是一种专门用于处理图形和图像相…...

刷题——【模板】二维前缀和
前缀和 题目题目链接题解方法一方法二 题目 描述 给你一个 n 行 m 列的矩阵 A ,下标从1开始。 接下来有 q 次查询,每次查询输入 4 个参数 x1 , y1 , x2 , y2 请输出以 (x1, y1) 为左上角 , (x2,y2) 为右下角的子矩阵的和, 输入描述&#x…...

Xilinx 7 系列 FPGA的各引脚外围电路接法
Xilinx 7系列FPGA的外围电路接法涉及到多个方面,包括电源引脚、时钟输入引脚、FPGA配置引脚、JTAG调试引脚,以及其他辅助引脚。 本文参考资料: ds180 - 7 Series FPGAs Data Sheet - Overview ds181 - Artix 7 FPGAs Data Sheet - DC and AC…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...

3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...