【Verilog-CBB】开发与验证(2)——单比特信号CDC同步器

news2024/9/24 1:26:41



引言

多时钟域的设计中,CDC处理的场景还是蛮多的。单比特信号在CDC时,为保证信号采样的安全性,降低亚稳态,必须要对信号做同步处理。CDC从时钟的快慢关系来说分为两种case:快到慢、慢到快。对于脉冲型的控制信号,在以上两种case中都需要满足如下条件才能保证控制信号CDC的安全性:

源端控制信号的脉冲宽度>1.5倍目的端时钟周期 (即 ”三时钟沿“ 要求)。

一般建议以上条件中1.5增大为2。

在设计同步器时需要注意,源端控制信号必须为寄存器输出。否则组合逻辑的毛刺可能会影响目的端的采样。

CBB设计源码

这个功能相对来说比较简单,就不扯框图和原理了,直接上代码。

// ==================-------------------------------------------------------=====================
//                                        在路上-正出发
//                                    Common Building Block
// ==================-------------------------------------------------------=====================

//                 ________          ________          ________                                                               
//                |\   ____\        |\   __  \        |\   __  \                                                              
//                \ \  \___|        \ \  \|\ /_       \ \  \|\ /_                                                             
//                 \ \  \            \ \   __  \       \ \   __  \                                                            
//                  \ \  \____        \ \  \|\  \       \ \  \|\  \                                                           
//                   \ \_______\       \ \_______\       \ \_______\                                                          
//                    \|_______|        \|_______|        \|_______|  

// ==================-------------------------------------------------------=====================
//                                        在路上-正出发
//                                    Common Building Block
// ==================-------------------------------------------------------=====================                                                                                                              
                                                                                                                                                                                                                                                                                                         
// CBB Module Name    :CBB_PULSE_SYNCHRONIZER
// CBB Created Date   :2024-08-02
// CBB Module Function:单比特脉冲信号跨时钟域处理
// Usage Limitation   :
// Author             :在路上-正出发
// -----------------------------------------------------------------------------------------------
// -----------------------------------------------------------------------------------------------

`timescale 1ns/1ps


module  CBB_PULSE_SYNCHRONIZER #(
// ---- parameter define
parameter P_EXTEN_EN		= "ENABLE",  //"ENABLE" or "DISABLE"
parameter P_EXTEN_MULT 		= 3,	     //2 or larger
parameter P_SYNC_STAGE 		= 2,	     //2 or larger
parameter P_PULSE_WIDTH     = "CARE-1"   //"CARE-1" or "NOTCARE"
)(
// ---- port define 
input 							i_clk_src,
input 							i_rstn_src,
input 							i_pulse_src,//must be register output(source clk)

input 							i_clk_dst,
input 							i_rstn_dst,
output 							o_pulse_dst

);

reg [P_EXTEN_MULT-2:0] 			r_pluse_src_dly;
reg 				   			r_pulse_exten;
reg [P_SYNC_STAGE-1:0]			r_pulse_sync;

generate
	if(P_EXTEN_EN == "ENABLE")
	begin
		if(P_EXTEN_MULT <= 2)
		begin
			always @(posedge i_clk_src or negedge i_rstn_src) begin : proc_pulse_exten1
				if(~i_rstn_src) begin
					 r_pluse_src_dly <= {(P_EXTEN_MULT-1){1'b0}};
				end else begin
					 r_pluse_src_dly <= {i_pulse_src};
				end
			end
			always @(posedge i_clk_src or negedge i_rstn_src) begin : proc_pulse_exten2
				if(~i_rstn_src) begin
					 r_pulse_exten <= 1'b0;
				end else begin
					 r_pulse_exten <= |{r_pluse_src_dly,i_pulse_src};
				end
			end
			always @(posedge i_clk_dst or negedge i_rstn_dst) begin : proc_pulse_sync
				if(~i_rstn_dst) begin
					 r_pulse_sync <= {(P_SYNC_STAGE){1'b0}};
				end else begin
					 r_pulse_sync <= {r_pulse_sync[P_SYNC_STAGE-2:0],r_pulse_exten};
				end
			end			
	    end
	    else
	    begin
			always @(posedge i_clk_src or negedge i_rstn_src) begin : proc_pulse_exten
				if(~i_rstn_src) begin
					 r_pluse_src_dly <= {(P_EXTEN_MULT-1){1'b0}};
				end else begin
					 r_pluse_src_dly <= {r_pluse_src_dly[P_EXTEN_MULT-3:0],i_pulse_src};
				end
			end
			always @(posedge i_clk_src or negedge i_rstn_src) begin : proc_pulse_exten2
				if(~i_rstn_src) begin
					 r_pulse_exten <= 1'b0;
				end else begin
					 r_pulse_exten <= |{r_pluse_src_dly,i_pulse_src};
				end
			end
			always @(posedge i_clk_dst or negedge i_rstn_dst) begin : proc_pulse_sync
				if(~i_rstn_dst) begin
					 r_pulse_sync <= {(P_SYNC_STAGE){1'b0}};
				end else begin
					 r_pulse_sync <= {r_pulse_sync[P_SYNC_STAGE-2:0],r_pulse_exten};
				end
			end
	    end
	end
	else
	begin
		always @(posedge i_clk_dst or negedge i_rstn_dst) begin : proc_pulse_sync
			if(~i_rstn_dst) begin
				 r_pulse_sync <= {(P_SYNC_STAGE){1'b0}};
			end else begin
				 r_pulse_sync <= {r_pulse_sync[P_SYNC_STAGE-2:0],i_pulse_src};
			end
		end		
	end
endgenerate

generate
	if(P_PULSE_WIDTH == "CARE-1")
	begin
		assign o_pulse_dst = r_pulse_sync[P_SYNC_STAGE-2] & (~r_pulse_sync[P_SYNC_STAGE-1]); 
	end
	else
	begin
		assign o_pulse_dst = r_pulse_sync[P_SYNC_STAGE-1];
	end
endgenerate

endmodule

CBB使用说明

P_EXTEN_EN:需要进行脉冲展宽时,将使能开关打开;

P_EXTEN_MULT:表示脉冲在源时钟域被展宽的倍数,这个倍数需要使用者根据上述1.5或2倍关系折算。

P_SYNC_STAGE:表示目的时钟域打拍的级数。

P_PULSE_WIDTH:"CARE-1"表示,目的侧时钟域输出的脉冲宽度为1个时钟周期;“NOTCARE”则表示目的侧打拍直接输出,不取边沿。

【注意】输入信号i_pulse_src必须为寄存器输出。

CBB验证

CASE1:快—>慢(使能脉冲展宽,3倍)

CASE2:慢—>快(不使能脉冲展宽)

验证代码

// ==================-------------------------------------------------------=====================
//                                        在路上-正出发
//                                    Common Building Block
// ==================-------------------------------------------------------=====================

//                 ________          ________          ________                                                               
//                |\   ____\        |\   __  \        |\   __  \                                                              
//                \ \  \___|        \ \  \|\ /_       \ \  \|\ /_                                                             
//                 \ \  \            \ \   __  \       \ \   __  \                                                            
//                  \ \  \____        \ \  \|\  \       \ \  \|\  \                                                           
//                   \ \_______\       \ \_______\       \ \_______\                                                          
//                    \|_______|        \|_______|        \|_______|  

// ==================-------------------------------------------------------=====================
//                                        在路上-正出发
//                                    Common Building Block
// ==================-------------------------------------------------------=====================                                                                                                              
                                                                                                                                                                                                                                                                                                         
// CBB Module Name    :TB_PULSE_SYNCHRONIZER
// CBB Created Date   :2024-08-03
// CBB Module Function:
// Usage Limitation   :
// Author             :在路上-正出发
// -----------------------------------------------------------------------------------------------
// -----------------------------------------------------------------------------------------------

`timescale 1ns/1ps

// `define TC_FAST_2_LOW
`define TC_LOW_2_FAST

module TB_PULSE_SYNCHRONIZER ();
// ---- parameter define
parameter P_EXTEN_EN		= "DISABLE"; //"ENABLE" or "DISABLE"
parameter P_EXTEN_MULT 		= 3;	    //2 or larger
parameter P_SYNC_STAGE 		= 2;	    //2 or larger
parameter P_PULSE_WIDTH     = "CARE-1"; //"CARE-1" or "NOTCARE"

// ---- port define 
reg 							i_clk_src;
reg 							i_rstn_src;
reg 							i_pulse_src;//must be register output(source clk)

reg  							i_clk_dst;
reg  							i_rstn_dst;
wire 							o_pulse_dst;

// 产生时钟
`ifdef TC_FAST_2_LOW
initial i_clk_src = 1'b0;
always #5 i_clk_src = ~i_clk_src;
initial i_clk_dst = 1'b0;
always #10 i_clk_dst = ~i_clk_dst;
`endif

`ifdef TC_LOW_2_FAST
initial i_clk_src = 1'b0;
always #10 i_clk_src = ~i_clk_src;
initial i_clk_dst = 1'b0;
always #5 i_clk_dst = ~i_clk_dst;
`endif

// 
initial
begin
	i_rstn_src = 1'b0;
	i_rstn_dst = 1'b0;
	i_pulse_src = 1'b0;
	#100;
	i_rstn_dst = 1'b1;
	i_rstn_src = 1'b1;
	#50;
	@(posedge i_clk_src)
	i_pulse_src <= 1'b1;
	@(posedge i_clk_src)
	i_pulse_src <= 1'b0;

	@(negedge o_pulse_dst);
	#200;
	$finish;
end

CBB_PULSE_SYNCHRONIZER #(
		.P_EXTEN_EN(P_EXTEN_EN),
		.P_EXTEN_MULT(P_EXTEN_MULT),
		.P_SYNC_STAGE(P_SYNC_STAGE),
		.P_PULSE_WIDTH(P_PULSE_WIDTH)
	) U_CBB_PULSE_SYNCHRONIZER (
		.i_clk_src   (i_clk_src),
		.i_rstn_src  (i_rstn_src),
		.i_pulse_src (i_pulse_src),
		.i_clk_dst   (i_clk_dst),
		.i_rstn_dst  (i_rstn_dst),
		.o_pulse_dst (o_pulse_dst)
	);



endmodule


CBB电路综合

使能脉冲展宽

源时钟域下,控制信号经多拍延迟,源信号与延迟信号经过或门输出,输出的信号在源时钟域寄存输出,目的测时钟域对展宽的信号做打拍处理,取上升沿输出。

不使能脉冲展宽

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

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

相关文章

『C++实战项目 负载均衡式在线OJ』一、项目介绍与效果展示(持续更新)

文章目录 一、项目介绍二、开发环境三、第三方库四、相关技术五、项目整体框架代码目录框架 代码仓库连接 点击这里✈ 一、项目介绍 本项目是实现一个仿 leetcode 的 OJ (Online-Judge&#xff09;系统。更准确的说应该称之为leetcode 的裁剪版。因为本项目只实现了leetcode中…

‘#‘ is not followed by a macro parameter 关于宏定义的错误

今天在项目代码上想定义一个这样的宏&#xff0c;结果编译错误&#xff0c;这个宏定义类似这样的&#xff1a; #define DELETE_FILE_DPP(key) \ #ifdef PLATFORM_DPP \delete_file(&key); \ #endif 因为有平台之分需要用到编译宏&#xff0c;但不想每个调用的地方都写 #i…

HTML 专业词汇与语法规则

目录 1. 专业词汇 2. 语法规则 1. 专业词汇 标签&#xff08;tag&#xff09;&#xff1a;一堆尖叫号&#xff08;<>&#xff09;&#xff0c; 属性&#xff08;attribute&#xff09;&#xff1a;对标签特征设置的方式&#xff1b; 文本&#xff08;text&#xff0…

【外排序】--- 文件归并排序的实现

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 数据结构 我们之前学习的八大排序&#xff1a;冒泡&#xff0c;快排&#xff0c;插入&#xff0c;堆排等都是内排序&#xff0c;这些排序算法处理的都是…

java对接kimi详细说明,附完整项目

需求&#xff1a; 使用java封装kimi接口为http接口&#xff0c;并把调用kimi时的传参和返回数据&#xff0c;保存到mysql数据库中 自己记录一下&#xff0c;以做备忘。 具体步骤如下&#xff1a; 1.申请apiKey 访问&#xff1a;Moonshot AI - 开放平台使用手机号手机号验证…

SuccBI+低代码文档中心 — 低代码应用(SuccAP)(概论)

概述&#xff1a; 低代码是什么&#xff1f; 低代码就是通过易用的、可视化的操作、加上少量的代码或脚本的方式快速的搭建业务应用。 低代码的优势&#xff1f; 低代码可以提升开发人员的效率&#xff0c;也可以让非开发人员也能进行应用开发。 低代码的分类&#xff1a;…

基于SpringBoot的大学生信息兼职服务网站系统,源码、部署+讲解

目 录 摘 要 Abstract 目 录 绪 论 1 系统分析 1.1可行性分析 1.1.1经济可行性分析 1.1.2技术可行性分析 1.1.3操作可行性分析 1.2需求分析 1.2.1从学生的角度 1.2.2从企业的角度 1.2.3从管理员的角度 1.3用例建模 1.3.1识别参与者用例 1.3.2用…

3.5 菜单资源

菜单分类 窗口的顶层菜单弹出式菜单&#xff08;鼠标右键的那些选项&#xff0c;记事本窗口左上角点击“文件”弹出的这些&#xff09;系统菜单&#xff08;记事本左上角的图标&#xff09; HMENU类型表示菜单&#xff0c;ID表示菜单项 资源相关 资源脚本文件:*.rc文件编译器…

python入门基础篇(一)

基础篇 Python基础安装与配置Python环境理解Python解释器第一个Python程序&#xff1a;"Hello, World!" 基础语法注释与文档字符串变量与数据类型数字类型&#xff1a;整数、浮点数、复数字符串布尔值None值 运算符算术运算符比较运算符逻辑运算符赋值运算符位运算符…

WEB渗透Web突破篇-SSRF

定义 服务端请求伪造 构造一个由服务器发出请求的漏洞 服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制成因 file_get_contents()、fsockopen()、curl_exec()、fopen()、readfile()等函数使用不当会造成SSRF漏洞挖掘 转码服务 在线翻译 获取超链接…

JavaScript入门day6

目录 1.Web API 基本认知 1.1 变量声明 1.2 作用和分类 1.3 什么是DOM 1.4 DOM树 1.5 DOM对象&#xff08;重要&#xff09; 2.获取DOM对象 2.1 获取DOM元素 2.2 操作元素内容 2.3 操作元素属性 2.3.1 操作元素常用属性 2.3.2 操作元素样式属性 2.3.3 操作表单元素…

C Primer Plus 第5章——第一篇

你该逆袭了 第5章:重点摘录 零、章节介绍一、基本运算符1、赋值运算符(1)、数据对象(2)、左值(3)、右值(4)、运算符 2、加法运算符3、减法运算符4、符号运算符&#xff1a;- 和 5、乘法运算符&#xff1a;*1、指数增长 6、除法运算符&#xff1a;/7、运算符优先级8、优先级 和 …

Python实战:wxauto与百度千帆大模型结合快速实现微信智能回复机器人

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

VGA接口驱动设计验证

前言 VGA接口是一个很有历史的接口&#xff0c;全称为Video Graphics Array&#xff08;VGA&#xff09;视频图形阵列&#xff0c;是IBM公司在1987年随着PS/2一起推出的使用模拟信号的一种视频传输标准。时至今日&#xff0c;这个接口依然还在大量使用&#xff0c;因为这个接口…

普乐蛙VR航天科普展厅VR虚拟现实项目激发青少年对太空探索

普乐蛙品牌VR沉浸体验式业态&#xff0c;定位文旅科教领域&#xff0c;助力中国航天发展。普乐蛙VR航天航空主题拥有华夏神舟、天宫一号、华夏月球车、太空飞船、华夏方舟、地震平台、暴风空间等众多科普体验设备和原创优质的航天航空内容&#xff0c;通过沉浸互动式体验&#…

USB 2.0 规范摘录

文章目录 1、USB 体系简介2、USB 数据流模型四种传输类型 3、USB 物理规范和电气规范4、USB 协议层规范事务传输&#xff08;Transaction&#xff09;的流程 5、USB 框架6、USB 主机&#xff1a;硬件和软件7、USB HUB 规范数据的转发唤醒信号的转发USB HUB 的帧同步HUB Repeate…

11087 统计逆序对(优先做)

这个问题可以通过使用分治策略来解决&#xff0c;这种策略是在归并排序的基础上进行的。我们可以将数组分为两部分&#xff0c;然后分别计算两部分的逆序对数量&#xff0c;最后计算跨越两部分的逆序对数量。 以下是使用C的代码实现&#xff1a; #include <iostream> #…

C++初学者指南-5.标准库(第二部分)--更改元素算法

C初学者指南-5.标准库(第二部分)–更改元素算法 文章目录 C初学者指南-5.标准库(第二部分)--更改元素算法填充/覆盖范围fill / fill_ngenerate / generate_n 更改/替换值transformreplace / replace_ifreplace_copy / replace_copy_if 相关内容 不熟悉 C 的标准库算法&…

【数据泄露】最新 FBI 官员数据库泄露事件

前言 近日&#xff0c;一名化名为 “rpk” 的威胁行为者在 breachforums 论坛上声称泄露了包含 22,175 名 FBI 官员数据的数据库。此事件迅速引起了广泛关注&#xff0c;主要因为 FBI 作为美国联邦调查局&#xff0c;不仅是美国司法部的主要调查机构&#xff0c;还是美国情报界…

太离谱!曝 GPT-4o mini 没做安全测试就开庆功会!OpenAI 严重违背政府协议,被立法者犀利追问 12 条

OpenAI又被曝违约了!这次是违反了对白宫的安全承诺。 去年夏天,OpenAI向美国政府承诺,将严格对其前沿的突破性技术进行安全测试,以确保AI不会造成损害,比如教用户制造生化武器或帮助黑客开发新型网络攻击。 然而,为了应对OpenAI领导层设定的GPT-4o mni 5月份的“deadli…