题解 | #多bit MUX同步器#

多bit MUX同步器

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

主要是异步时钟的同步。

需要使能信号在clk_a下打一拍;在clk_b下再打两拍;

问题一:

这里我一直有一个疑惑:为什么要再alk_a下先打一拍?在异步FIFO种时钟同步的时候也有这一拍。

看到下面这个一个解释。“在原时钟a下进行一拍寄存,对于输入进行寄存是很常见的方法,主要是去除毛刺等,做一个本时钟域的同步,”感觉有道理。

https://blog.nowcoder.net/n/781da206e2114e358eabb1bb301d21ac?f=comment

问题二:

在clk_b下再打两拍;我明白这个是为了同步到clk_b时钟下。但是这个为什么是需要打两拍?(刚开始学习,,只知道这样用,,,但是还不知到具体原理。。。)

`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
);

	reg			[3:0]	data_reg;
	reg					data_en_a, data_en_b1, data_en_b2;

	always@(posedge clk_a or negedge arstn)begin
		if(~arstn)begin
			data_reg <= 0;
			data_en_a <= 0;
		end
		else begin
			data_reg <= data_in;
			data_en_a <= data_en;
		end
	end

	always@(posedge clk_b or negedge brstn)begin
		if(~brstn)begin
			data_en_b1 <= 0;
			data_en_b2 <=0;
		end
		else begin
			data_en_b1 <= data_en_a;
			data_en_b2 <= data_en_b1;
		end
	end

	always@(posedge clk_b or negedge brstn)begin
		if(~arstn)
			dataout <= 0;
		else
			dataout <= data_en_b2 ? data_reg: dataout;
	end 



endmodule

全部评论

相关推荐

点赞 评论 收藏
分享
评论
5
收藏
分享
牛客网
牛客企业服务