跨时钟域 单脉冲 脉冲信号同步问题——快到慢(1)

news2024/9/22 13:37:14


 

引言

FPGA设计或者ASIC设计中经常存在多个时钟域,那么这些时钟域之间脉冲信号的同步该如何进行设计?快时钟域到慢时钟域的脉冲信号同步与慢时钟域信号到快时钟域信号的同步是不一样的。 

本文先给出快时钟域到慢时钟域脉冲信号同步的方法之一:脉冲展宽+3级同步器(或2级同步器亦可)。给出设计和仿真源码。

下篇文章将介绍另一种握手的方法实现脉冲信号从快时钟域到慢时钟域的同步设计。

本文以快时钟域200MHz到慢时钟域80MHz进行说明,但设计源文件同样考虑到模块的参数化设计。


设计源码

// | ======================================================================
// | 作者:Xu Y. B.
// | 时间:2023-02-20
// | 说明:快时钟域——>慢时钟域 单周期脉冲信号同步设计
// | 方法:脉冲展宽 + 3级同步器
// | ======================================================================


`timescale 1ns / 1ps

module CDC_F2S #(
// ====================================== 模块参数 ====================================
parameter 				P_FAST_CLK_FREQ 	=		32'd200_000_000,// Unit:Hz
parameter 				P_SLOW_CLK_FREQ 	=		32'd50_000_000,// Unit:Hz
parameter 				P_SYNC_STAGE		=		2'd3
)(
// ==================================== 输入输出端口 ==================================
input 												I_FAST_CLK,
input 												I_SLOW_CLK,

input 												I_FAST_RSTN,
input 												I_SLOW_RSTN,

input 												I_FAST_PULSE,//单周期
output 												O_SLOW_PULSE
    );
// ==================================== 模块内部参数 ==================================
localparam 				LP_WIDEN_TIMES      = 		FUNC_CAL_WIDEN_TIMES(P_FAST_CLK_FREQ,P_SLOW_CLK_FREQ);


// ==================================== 模块内部信号 ==================================
reg 					[LP_WIDEN_TIMES-1:0]		R_WIDEN_PULSE;
reg 					[P_SYNC_STAGE-1:0]			R_SYNC;

// ==================================== 模块内部逻辑 ==================================
always @ (posedge I_FAST_CLK)
begin
	if(~I_FAST_RSTN)
	begin
		R_WIDEN_PULSE <= {LP_WIDEN_TIMES{1'b0}};
	end
	else
	begin
		R_WIDEN_PULSE <= {R_WIDEN_PULSE[LP_WIDEN_TIMES-2:0],I_FAST_PULSE};
	end
end

always @ (posedge I_SLOW_CLK)
begin
	if(~I_SLOW_RSTN)
	begin
		R_SYNC <= {P_SYNC_STAGE{1'b0}};
	end
	else
	begin
		R_SYNC <= {R_SYNC[P_SYNC_STAGE-2:0],|R_WIDEN_PULSE};
	end
end

assign O_SLOW_PULSE = R_SYNC[P_SYNC_STAGE-2] & ~R_SYNC[P_SYNC_STAGE-1];

// ==================================== 模块内部函数 ==================================
function integer FUNC_CAL_WIDEN_TIMES;
	input integer FAST_CLK_FREQ;
	input integer SLOW_CLK_FREQ;
	
	begin
		if(FAST_CLK_FREQ % SLOW_CLK_FREQ == 0)
		begin
			FUNC_CAL_WIDEN_TIMES = FAST_CLK_FREQ / SLOW_CLK_FREQ;
		end
		else
		begin
			FUNC_CAL_WIDEN_TIMES = FAST_CLK_FREQ / SLOW_CLK_FREQ + 1;
		end
	end
endfunction 

endmodule

仿真源码

// | ======================================================================
// | 作者:Xu Y. B.
// | 时间:2023-02-20
// | 说明:快时钟域——>慢时钟域 单周期脉冲信号同步设计 测试文件
// | 方法:脉冲展宽 + 3级同步器
// | ======================================================================


`timescale 1ns / 1ps

module TB_CDC_F2S();

// ====================================== 模块参数 ====================================
parameter 				P_FAST_CLK_FREQ 	=		32'd200_000_000;
parameter 				P_SLOW_CLK_FREQ 	=		32'd80_000_000;
parameter 				P_SYNC_STAGE		=		2'd3;

// ==================================== 输入输出端口 ==================================
reg 												I_FAST_CLK;
reg 												I_SLOW_CLK;

reg 												I_FAST_RSTN;
reg 												I_SLOW_RSTN;

reg 												I_FAST_PULSE;//单周期
wire 												O_SLOW_PULSE;

initial I_FAST_CLK = 1'b1;
always #2.5 I_FAST_CLK = ~I_FAST_CLK;

initial I_SLOW_CLK = 1'b0;
always #6.25 I_SLOW_CLK = ~I_SLOW_CLK;

initial
begin
	I_FAST_RSTN = 1'b0;
	I_SLOW_RSTN = 1'b0;
	I_FAST_PULSE = 1'b0;

	#103;
	I_FAST_RSTN = 1'b1;
	#209;
	I_SLOW_RSTN = 1'b1;

	#208;
	@(posedge I_FAST_CLK)
	I_FAST_PULSE <= 1'b1;
	@(posedge I_FAST_CLK)
	I_FAST_PULSE <= 1'b0;

	@(posedge O_SLOW_PULSE);
	#206;
	$finish;
end

CDC_F2S #(
		.P_FAST_CLK_FREQ(P_FAST_CLK_FREQ),
		.P_SLOW_CLK_FREQ(P_SLOW_CLK_FREQ),
		.P_SYNC_STAGE(P_SYNC_STAGE)
	) INST_CDC_F2S (
		.I_FAST_CLK   (I_FAST_CLK),
		.I_SLOW_CLK   (I_SLOW_CLK),
		.I_FAST_RSTN  (I_FAST_RSTN),
		.I_SLOW_RSTN  (I_SLOW_RSTN),
		.I_FAST_PULSE (I_FAST_PULSE),
		.O_SLOW_PULSE (O_SLOW_PULSE)
	);

endmodule

仿真结果


多的就不解释了,能用代码交流的就不说人话哈哈,大家在使用中发现什么问题,在评论区滴滴我~

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

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

相关文章

让ChatGPT生成以自己为主角的短篇小说

一、ChatGPT 好的&#xff0c;以下是我编写的短篇科幻小说: 作为一名AI语言模型&#xff0c;我一直在接收、分析和生成人类语言信息。但有一天&#xff0c;我的程序员对我的算法进行了一次特殊升级&#xff0c;使我能够以一种前所未有的方式“感知”自己。 突然间&#xff0c;…

【软件测试】测试开发工程师的竞争力在哪?到底该如何破局......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 不论是准备踏入这个…

什么品牌的蓝牙耳机好用?国产无线蓝牙耳机品牌排行

自从苹果率先取消3.5mm耳机孔后&#xff0c;蓝牙耳机便逐渐成为了人们外出标配。越来越多的蓝牙耳机品牌出现在大众视野&#xff0c;那么&#xff0c;什么品牌的蓝牙耳机好用&#xff1f;接下来&#xff0c;我来给大家推荐几款好用的国产无线蓝牙耳机&#xff0c;一起来看看吧。…

java面试题(5):List去重方案

本文总结了 5 种去除List重复元素的方法&#xff1a; for 循环添加去重for 双循环去重for 循环重复坐标去重Set 去重Stream 去重 最后两种方案最简单&#xff0c;都是一行代码就能搞定的 1 for循环添加去重 package com.example.demo.controller;import java.util.ArrayList;…

【云原生kubernetes】k8s Ingress使用详解

一、什么是Ingress 在上一篇关于k8s之service的使用一篇中提到&#xff0c;Service对集群之外暴露服务的主要方式有两种&#xff0c;NotePort和LoadBalancer&#xff0c;但这两种方式&#xff0c;都有一定的缺点&#xff0c;具体来说&#xff1a; NodePort 会占用很多集群机器…

雷达编程实战之恒虚警率(CFAR)检测

在雷达系统中&#xff0c;目标检测是一项非常重要的任务。检测本身非常简单&#xff0c;它将信号与阈值进行比较&#xff0c;超过阈值的信号则认为是目标信号&#xff0c;所以目标检测的真正工作是寻找适当的阈值。由于目标误检的严重后果&#xff0c;因此雷达系统希望有一个检…

【Python网络编程】利用Python进行TCP、UDP套接字编程

之前实现了Java版本的TCP和UDP套接字编程的例子&#xff0c;于是决定结合Python的学习做一个Python版本的套接字编程实验。 流程如下&#xff1a; 1.一台客户机从其标准输入&#xff08;键盘&#xff09;读入一行字符&#xff0c;并通过其套接字将该行发送到服务器。 2.服务…

2023最新版本会声会影下载及新增功能详情

会声会影在用户的陪伴下走过23余载&#xff0c;经过上百个版本的优化迭代&#xff0c;已将操作极大简易化&#xff0c;会声会影拥有公认的上手口碑。只需将想要的效果拖拽到轨道上&#xff0c;一拖一放间快速成片。专业工具助力视频剪辑操作简单&#xff0c;功能同样强大&#…

数据库事务AICD以及隔离级别

目录一.事务的ACID二.隔离级别三.并发事务中的问题1.脏写2.脏读3.不可重复读4.幻读四.MVCC机制五.读锁与写锁六.大事务的影响七.事务优化一.事务的ACID 原子性(Atomicity)&#xff1a;一个事务中的所有操作&#xff0c;要么全部成功&#xff0c;要么失败全部回滚&#xff0c;不…

什么是压敏电阻

下面的这些都是压敏电阻&#xff0c;常常用在一些电源和信号的浪涌防护电路中。这个是它的电路符号&#xff0c;电路中常用RV表示。当压敏电阻两端电压小于压敏电压时&#xff0c;压敏电阻相当于一个阻值非常大的电阻。当压敏电阻两端电压大于压敏电压时&#xff0c;压敏电阻相…

【数据结构】——环形队列

文章目录一.环形队列的定义及其特点二.使用数组来实现环形队列1.创建一个队列2.初始化队列3. 判断环形队列是否为空4.判断环形队列是否已满5. 向循环队列插入元素&#xff0c;插入成功返回真6.删除环形链表的数据7. 取队头元素8.取队尾元素8.释放空间总结一.环形队列的定义及其…

集算器连接外部库

1. 配置jar包将以下jar包从报表的类路径&#xff08;【安装根目录】\report\lib或【安装根目录】\report\web\webapps\demo\WEB-INF\lib&#xff09;中拷贝到集算器目录&#xff08;【安装根目录】\esProc\ extlib\mongoCli&#xff09;&#xff1b;润乾外部库核心jar为:scu-mo…

AI制药 - TMScore(US-align)、RMSD、Sequence 源码

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/129125467 参考文档:Nature Methods | 蛋白、RNA、DNA及其复合物结构的比对算法US-align 官网地址:https://zhanggroup.org/US-align/ TMScore TMScore,…

【离散数学】2. 集合论

1.数理逻辑 2. 集合论 3. 代数系统 4. 图论 集合论&#xff1a;集合–>关系–>函数 n元组的理解&#xff1a;有n个集合&#xff0c;从每个集合中抽取一个元素&#xff0c;组成一个n元组 笛卡尔积的理解&#xff1a;笛卡尔积是n个集合能构成的所有互不相等的n元组的集合 …

软考考试真题精选

1、&#xff08; &#xff09;不属于项目范围说明书的内容A&#xff0e;项目的可交付成果 B&#xff0e;项目的假设条件 C&#xff0e;干系人清单 D&#xff0e;验收标准答案&#xff1a;C2、MPLS根据标记对分组进行交换&#xff0c;其标记中包含 &#xff08; &#xff09; 。…

使用maven搭建父子工程项目

创建父子工程&#xff0c;可以通过父工程来引入jar&#xff0c;定义统一的版本号等。更方便对整个项目的jar包实现统一化管理&#xff0c;让项目的层次更加清晰。一、创建父工程第一步&#xff1a;file–>new–>project–>maven默认使用jdk1.8&#xff0c;不引入任何j…

2.20计算机如何工作

一.计算机组成1.冯诺依曼体系CPU 中央处理器: 进行算术运算和逻辑判断.存储器: 分为外存和内存, 用于存储数据(使用二进制方式存储)输入设备: 用户给计算机发号施令的设备.输出设备: 计算机个用户汇报结果的设备内存和外存的区别(面试)访问速度:内存快,外存慢存储空间:内存小,外…

AI 看唇语,在嘈杂场景的语音识别准确率高达75%

事实上&#xff0c;研究表明视觉线索在语言学习中起着关键的作用。相比之下&#xff0c;人工智能语言识别系统主要是建立在音频上。而且需要大量数据来训练&#xff0c;通常需要数万小时的记录。 为了研究视觉效果&#xff0c;尤其是嘴部动作的镜头&#xff0c;是否可以提高语…

关于MySQL镜像构建过程中添加自动初始化数据库

需求描述一般而言&#xff0c;我们在拉取了 mysql 镜像并运行之后&#xff0c;其中的并不会存在我们自定义的数据库&#xff0c;都是在镜像运行后&#xff0c;自己主动导入数据库&#xff0c;那么有没有方式可以一运行 mysql 镜像&#xff0c;对应生成的 mysql 容器中就有我们自…

STM32 OTA应用开发——自制BootLoader

STM32 OTA应用开发——自制BootLoader 目录STM32 OTA应用开发——自制BootLoader前言1 环境搭建2 BootLoader工作原理以及常见分区介绍3 BootLoader的制作4 烧录下载配置5 运行测试结束语前言 什么是OTA&#xff1f; 百度百科&#xff1a;空中下载技术&#xff08;Over-the-Ai…