【CDC跨时钟域】多bit_DMUX

保持coding,不定期整理思路

CDC跨时钟域处理–DMUX

快到慢–多bit数据跨时钟域:
快时钟域clk_a,慢时钟域clk_b
DMUX
代码:

module dmux(
	input clk_a,
	input clk_b,
	input rst_n,
	input [3:0] data_in,
	input data_en,

	output [3:0] data_out
	);

reg [3:0] data_in_reg;
reg data_en_reg;
reg [1:0] data_en_b_reg;

//暂存clk_a时钟域信号
always @(posedge clk_a or negedge rst_n) begin
	if (!rst_n) begin
		data_in_reg <= 'd0;
		data_en_reg <= 'd0;		
	end
	else begin
		data_in_reg <= data_in;
		data_en_reg <= data_en;		
	end
end

//同步clk_a时钟域使能信号至clk_b时钟域
always @(posedge clk_b or negedge rst_n) begin
	if (!rst_n)
		data_en_b_reg <= 'd0;
	else
		data_en_b_reg <= {data_en_b_reg[0],data_en_reg};
end

//同步clk_a时钟域数据信号至clk_b时钟域
always @(posedge clk_b or negedge rst_n) begin
	if (!rst_n)
		data_out <= 'd0;
	else
		data_out <= data_en_b_reg[1] ? data_in_reg : data_out;
end

endmodule

其实这里还可以进行改进,即当数据跨时钟传输时,输出flag标志位
只需要增加 判断mux的sel信号何时从0变为1 的条件 即可,即需要对data_en_b_reg信号再多打一拍产生data_en_b_reg[2],注意此时data_en_b_reg的定义是3bit的数据

always @(posedge clk_b or negedge rst_n) begin
	if (!rst_n)
		flag <= 'd0;
	else
		flag <= ( (~data_en_b_reg[2]) && (data_en_b_reg[1]) );
end
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值