题解 | #多bit MUX同步器#(跨时钟域处理总结)

多bit MUX同步器

https://www.nowcoder.com/practice/30e355a04a454e16811112cb82af591e

`timescale 1ns/1ns

module mux(
	input 				clk_a	, 
	input 				clk_b	,   
	input 				arstn	,
	input				brstn   ,
	input		[3:0]	data_in	,
	input               data_en ,

	output reg  [3:0] 	dataout
);
//MUX同步器 用于 多bit跨时钟域的处理  
//关键在于当使能信号稳定的时候进行数据的传输
//步骤:将使能信号在本域打一拍 稳定信号
//然后在异域打两拍 减少亚稳态。 
//然后再用一个二选一数据选择器 进行信号的选通。
reg data_en_a ;
always@(posedge clk_a or negedge arstn)begin
    if(!arstn)
	    data_en_a <= 1'b0   ;
	else 
	    data_en_a <= data_en ;   
	    
end

reg data_en_b   ;
reg data_en_b_r ;
always@(posedge clk_b or negedge brstn)begin
	if(!brstn)begin
	    data_en_b   <= 1'b0 ;
		data_en_b_r <= 1'b0 ;
	end
	else begin
		data_en_b   <= data_en_a ;
		data_en_b_r <= data_en_b ;
	end
end

always@(posedge clk_b or negedge brstn)begin
	if(!brstn)
	     dataout <= 'd0       ;
	else if(data_en_b_r == 1'b1)
	     dataout <=  data_in  ; 
    else 
	     dataout <= dataout   ;

end
endmodule

跨时钟域处理有多重处理方式:

1.单bit跨时钟域处理:

(1)慢时钟域转快时钟域 : 直接两级DFF打拍即可

(2)快时钟域转慢时钟域: 可能出现漏采 所以需要对快时钟域的脉冲进行拓宽。(握手机制)

处理流程: 将clk_fast 下的脉冲 在本域下进行拉高,生成data_a信号 将data_a信号进行跨时钟域处理(在clk_slow时钟域下打两拍) ,生成 data_b ,data_b_r信号 。data_b_r 信号为高代表慢时钟域已经接受到了这个脉冲。所以将data_b_r信号再跨时钟域处理(在clk_fast时钟域下再打两拍),生成data_a_r ,data_a_rr信号。使用data_a_rr ==1'b1 作为拓宽脉冲的拉低使能信号。

慢时钟域这边对data_b_r 打一拍 生成data_b_rr 信号 做上边沿检测 生成脉冲信号。

2.多bit跨时钟域处理:

(1)异步FIFO+格雷码

(2)握手协议

(3)DMUX选择器:在快时钟域转慢时钟域时 仍然需要对使能信号进行脉冲扩宽。

全部评论

相关推荐

Twilight_m...:表格简历有点难绷。说说个人看法: 1.个人基本情况里好多无意义信息,什么婚姻状况、健康状况、兴趣爱好、户口所在地、身份证号码、邮政编码,不知道的以为你填什么申请表呢。 2.校内实践个人认为对找工作几乎没帮助,建议换成和测开有关的项目,实在没得写留着也行。 3.工作经历完全看不出来是干什么的,起码看着和计算机没啥关系,建议加强描述,写点你在工作期间的实际产出、解决了什么问题。 4.个人简述大而空,看着像AI生成,感觉问题最大。“Python,C,C++成为我打造高效稳定服务的得力工具”、“我渴望凭借自身技术知识与创新能力,推动人工智能技术的应用发展,助力社会实现智能化转型”有种小学作文的美感。而且你确定你个人简述里写的你都会嘛?你AI这块写的什么“深入研究”,发几篇顶会的硕博生都不一定敢这么写。而且你AI这块的能力和软测也完全无关啊。个人简述建议写你对哪些技术栈、哪些语言、哪些生产工具的掌握,写的有条理些,而且最好是和测开强相关的。
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
2
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务