时钟周期检测标志信号

在某些情况下需要对系统时钟分频后的时钟进行周期检测,引出周期标志信号以便在后续其他情况的使用。虽然在大多数情况下我们能够知道分频后的时钟是系统时钟的几倍分频,但为增强在分频时钟改变情况下周期标志信号的复用性或对未知时钟的周期检测,可以考虑以下方法或思想,以延申到类似情况下使用。

文章目录

  • 检测方法
    • 方法一:上升沿判断
    • 方法二:时钟移位判断
  • 实现与仿真
    • Verilog实现
    • 仿真测试

检测方法

方法一:上升沿判断

将时钟打一拍后取clk&(~clk_reg),上升沿时该值会拉高一个时钟周期。

也可以用下降沿进行判断方法类似。

方法二:时钟移位判断

对时钟左移判断移位后的值,移位后dived_clk_buf==2'd1即为上升沿到来,dived_clk_buf==2'd2即为下降沿到来。

reg  [1:0]      dived_clk_buf    ;always  @(posedge  clk or negedge rst_n)
beginif(rst_n == 1'b0)dived_clk_buf <= 2'd3;else dived_clk_buf <= {dived_clk_buf[0],dived_clk};//移位时钟以判断周期
endalways  @(posedge  clk or negedge rst_n)
beginif(rst_n == 1'b0)XX;else if(dived_clk_buf==2'd1)XXX;else XXXX;
end

实现与仿真

Verilog实现

由两部分组成:产生分频时钟模块+周期检测标志模块;改变分频时钟模块的分频周期可在仿真测试文件中例化时进行参数修改。

产生分频时钟模块:

//========================================================================
// 	Author			:YprgDay
//========================================================================
module dived_clk
#(parameter 				DIV_FREQUENCY		=	4				,//分频数(只允许偶分频),dived_clk周期为DIV_FREQUENCY*clk的周期parameter 				PERIOD_WIDTH_MAX	=	2				,//(DIV_FREQUENCY-1)对应的二进制位宽parameter 				CNT_PERIOD_MAX		=	DIV_FREQUENCY-1	,parameter 				CNT_HALF_PERIOD_MAX	=	CNT_PERIOD_MAX >> 1//计数分频中值
)
(input 	wire rst_n 	,input 	wire clk 	,output  reg  dived_clk
);reg [PERIOD_WIDTH_MAX-1:0] 		cnt_period			;//时钟分频计数//分频时钟always @(posedge clk or negedge rst_n)beginif(rst_n == 1'b0)begindived_clk <= 0;endelse if(cnt_period == CNT_PERIOD_MAX)begindived_clk <= 0;endelse if(cnt_period == CNT_HALF_PERIOD_MAX)begindived_clk <= 1;endelse begindived_clk <= dived_clk;endend//分频计数器always @(posedge clk or negedge rst_n)beginif(rst_n == 1'b0)begincnt_period <= 0;endelse if(cnt_period == CNT_PERIOD_MAX)begincnt_period <= 0;endelse begincnt_period <= cnt_period + 1'b1;endend	
endmodule

周期检测标志模块:

//========================================================================
// 	Author			:YprgDay
//========================================================================
module clk_period(input 	wire 	rst_n 		,input 	wire 	clk 		,input 	wire 	dived_clk	,output 	wire 	clk_flag1	,output 	wire 	clk_flag2
);reg 		dived_clk_reg		;reg  [1:0]  dived_clk_buf  		;//==========================< 方法一 >============================always @(posedge clk or negedge rst_n)beginif(rst_n == 1'b0)begindived_clk_reg <= 0;endelse begindived_clk_reg <= dived_clk;endend	assign clk_flag1 = dived_clk&(~dived_clk_reg);//==========================< 方法二 >============================always  @(posedge  clk or negedge rst_n)beginif(rst_n == 1'b0)dived_clk_buf <= 2'd3;else dived_clk_buf <= {dived_clk_buf[0],dived_clk};//左移endassign clk_flag2 = (dived_clk_buf==2'd1);
endmodule

仿真测试

仿真产生系统时钟与复位信号。

//========================================================================
// 	Author			:YprgDay
//========================================================================
`timescale 1ns/1ns
module tb_clk_period();parameter 				CLK_PERIOD		=	10		    ;//设置时钟信号周期parameter 				HALF_CLK_PERIOD	=	CLK_PERIOD/2;//生成时钟信号半周期reg                     i_rst_n							;reg                     i_clk							;wire					dived_clk						;wire					clk_flag1						;wire					clk_flag2                       ;//==========================< Clock block >============================always 	  	#HALF_CLK_PERIOD		i_clk = ~i_clk;//==========================< i_rst_n block >============================initial begini_clk 	  = 	1'b1	;i_rst_n  <= 	1'b0	;#40i_rst_n  <= 	1'b1	;enddived_clk #(.DIV_FREQUENCY	  (8),//分频数(只允许偶分频),dived_clk周期为DIV_FREQUENCY*clk的周期.PERIOD_WIDTH_MAX (3)//(DIV_FREQUENCY-1)对应的二进制位宽)u_dived_clk(.rst_n		(i_rst_n	),.clk 		(i_clk		),.dived_clk  (dived_clk	));clk_period u_clk_period(.rst_n 		(i_rst_n 	),.clk 		(i_clk 		),.dived_clk	(dived_clk  ),.clk_flag1	(clk_flag1	),.clk_flag2  (clk_flag2	)
);
endmodule

仿真效果如下:

可以看出方法一的时钟标志信号在时钟上升沿后拉高;方法二的时钟标志信号在时钟上升沿后下一拍拉高。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/811857.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FFmpeg: 简易ijkplayer播放器实现--06封装打开和关闭stream

文章目录 流程图stream openstream close 流程图 stream open 初始化SDL以允许⾳频输出&#xff1b;初始化帧Frame队列初始化包Packet队列初始化时钟Clock初始化音量创建解复用读取线程read_thread创建视频刷新线程video_refresh_thread int FFPlayer::stream_open(const cha…

如何解决Uniapp更新数据不重新渲染组件

办法就是在修改数据的函数里面&#xff0c;用let thatthis&#xff0c;再给that用赋值。 原因是给数据赋值的函数没用箭头函数&#xff0c;this是函数自己的this。比如success&#xff08;res&#xff09;{} 或者用箭头函数&#xff0c;比如success&#xff08;res&#xff0…

在Ubuntu服务器上快速安装一个redis并提供远程服务

一、快速安装一个Redis 第一步&#xff1a;更新apt源 sudo apt update第二步&#xff1a;下载Redis sudo apt install redis第三步&#xff1a;查看Redis是否已自启动 systemctl status redis二、配置Redis提供远程服务 第一步&#xff1a;先确保6379端口正常开放 如果是…

STM32F427+RTthread——USB虚拟串口

书接上回说到&#xff0c;RT-Thread完整版移植完毕&#xff0c;接下来做USB虚拟串口的功能 打开MX工程文件&#xff0c;配置USB CDC 先在ENV上选好USB CDC选项 在CubeMX_Config文件夹下就有生成的usb相关文件&#xff0c;添加到Project工程里 然后引入驱动drv_usbd.c&#xff…

【Android Surface】从Activity的创建到Surface的创建,源码分析1

文章目录 activity的创建performLaunchActivityhandleResumeActivitysetContentViewmInstrumentation.newActivitynew出phonewindowWindowManager的创建 回到setContextViewfindViewById addViewViewRootAndroid在哪里“画画” 我们知道Android绘制图形依靠的是surface和surfac…

PostgreSQL数据库基础--简易版

数据库 其中runoobdb为数据库名 查看已经存在的数据库 \l进入数据库 \c runoobdb创建数据库 CREATE DATABASE runoobdb;删除数据库 DROP DATABASE runoobdb;表 其中COMPANY为表名 创建表格 CREATE TABLE COMPANY(ID INT PRIMARY KEY NOT NULL,NAME TEXT…

Harmony鸿蒙南向驱动开发-UART接口使用

功能简介 UART指异步收发传输器&#xff08;Universal Asynchronous Receiver/Transmitter&#xff09;&#xff0c;是通用串行数据总线&#xff0c;用于异步通信。该总线双向通信&#xff0c;可以实现全双工传输。 两个UART设备的连接示意图如下&#xff0c;UART与其他模块一…

外观模式:简化复杂系统的统一接口

在面向对象的软件开发中&#xff0c;外观模式是一种常用的结构型设计模式&#xff0c;旨在为复杂的系统提供一个简化的接口。通过创建一个统一的高级接口&#xff0c;这个模式帮助客户端通过一个简单的方式与复杂的子系统交互。本文将详细介绍外观模式的定义、实现、应用场景以…

【Hadoop大数据技术】——Flume日志采集系统(学习笔记)

&#x1f4d6; 前言&#xff1a;在大数据系统的开发中&#xff0c;数据收集工作无疑是开发者首要解决的一个难题&#xff0c;但由于生产数据的源头丰富多样&#xff0c;其中包含网站日志数据、后台监控数据、用户浏览网页数据等&#xff0c;数据工程师要想将它们分门别类的采集…

什么是RMVB视频?如何把视频转成RMVB格式?视频格式转换的方法

一&#xff0c;什么是RMVB视频格式 RMVB是一种视频文件格式&#xff0c;它基于RealNetworks公司开发的RealMedia编解码器&#xff0c;被广泛应用于互联网上的视频流媒体传输和下载。RMVB文件通常具有较小的文件大小&#xff0c;同时保持较高的视频质量&#xff0c;因此在网络传…

python之堆的实现

堆本质是一个完全二叉树&#xff0c;分为大根堆和小根堆&#xff0c;大根堆每个结点的值都大于它的孩子的值&#xff0c;小根堆相反&#xff0c;每个结点的值都小于它的孩子的值 heapq是python的标准库&#xff0c;用于维护堆&#xff0c;非常方便 heapq库常用的几个函数 he…

React添加到现有项目

1.检查现有项目的根目录下是否有package.json文件 如果没有&#xff0c;则在项目的根目录下初始化一个package.json配置文件 2.在根目录下安装react和react-dom依赖 npm install --save react react-dom react-scripts安装成功后&#xff0c;react、react-dom以及react-scr…

上位机图像处理和嵌入式模块部署(qmacvisual缺失的光源控制)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 有些场景下面&#xff0c;是不需要光源和光源控制的&#xff0c;比如说利用摄像头识别对应区域的库位&#xff0c;这部分直接利用红外光采集对应的…

Nuttx系统在 imx6ul 开发板上的移植(一、环境准备和交叉编译)

Nuttx应该是一个不错的系统&#xff0c;有瓜可挖。小米的澎湃os底层内核使用的就是它。 翻出之前别人送我的imax6ul开发板&#xff0c;在那安安静静的吃灰&#xff0c;有了想动一动的冲动。于是想到给自己定一个小目标&#xff0c;逐步实现Nuttx内核系统在imax6ul的开发板上移植…

十五届web模拟题整理

模拟赛一期 1.动态的Tab栏 请在 style.css 文件中补全代码。 当用户向下滚动的高度没有超过标题栏&#xff08;即 .heading 元素&#xff09;的高度时&#xff0c;保持 Tab 栏在其原有的位置。当滚动高度超过标题栏的高度时&#xff0c;固定显示 Tab 栏在网页顶部。 /* TODO…

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题2

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题2 信息安全管理与评估 网络系统管理 网络搭建与应用 云计算 软件测试 移动应用开发 任务书&#xff0c;赛题&#xff0c;解析等资料&#xff0c;知识点培训服务 添加博主wx&#xff1a;liuliu548…

Python人工智能教学之掌握机器学习深度学习并提升实战能力(共72个视频教学+课程资料)云盘下载

人工智能是未来的发展方向&#xff0c;掌握了人工智能&#xff0c;就掌握了钱图。。。 Python人工智能教学之掌握机器学习深度学习并提升实战能力&#xff08;共72个视频教学课程资料&#xff09; 下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1ryJd5PNx1tLD…

私有化即时通讯软件,WorkPlus提供的私有化、安全通讯解决方案

在当今信息化快速发展的时代&#xff0c;安全问题已经成为各行各业关注的焦点。特别是在金融、政府单位和芯片等关键行业&#xff0c;信息安全的重要性不言而喻。这些行业涉及到大量的敏感数据和关键信息&#xff0c;一旦发生泄露&#xff0c;可能会对国家安全、企业利益甚至个…

DC-2渗透测试复现

DC-2渗透测试复现 目的&#xff1a; 获取最高权限以及5个flag 过程&#xff1a; 信息打点-ssh连接-git提权 环境&#xff1a; 攻击机&#xff1a;kali(192.168.85.136) 靶机&#xff1a;DC_2(192.168.85.132) 复现&#xff1a; 一.信息收集 nmap -sP 192.168.85.0/24 …

如何用个人电脑搭建一台本地服务器,并部署项目到服务器详细教程

服务器是一种高性能计算机&#xff0c;作为网络的节点&#xff0c;它存储、处理网络上80%的数据、信息&#xff0c;因此也被称为网络的灵魂。与普通计算机相比&#xff0c;服务器具有高速CPU运算能力、长时间可靠运行、强大I/O外部数据吞吐能力以及更好的扩展性。 服务器的主要…