当前位置:   article > 正文

跨时钟域传输数据——单bit和多bit信号(总结)_多bit跨时钟域

多bit跨时钟域


前言

2023.4.6 小雨

电平/边沿检测/脉冲同步器
FIFO


一、慢时钟域到快时钟域

快时钟域会多次采样,目标时钟频率必须是源时钟频率的1.5倍及以上,才能满足 “三时钟沿” 要求。如果目标时钟频率只是快一点,还是用握手机制。

1、单bit信号

在这里插入图片描述

2、多bit信号

延迟采样法:引入使能信号,先缓存使能信号(三级缓存,前两级缓存,后一级上升沿检测),等输入使能信号有效时再缓存数据

module delay_sample(
	input clk1,
	input clk2,
	inout rst_n,
	input [31:0] din,
	input din_en,
	output dout_en,
	output [31:0] dout
);
	reg [2:0] din_en_r;
	//缓存使能信号
	always@(posedge clk2 or negedge rst_n)begin  //注意这里是clk2
		if(!rst_n)
			din_en_r <= 0;
		else
			din_en_r <= {din_en_r[1:0], din_en};
	end
	
	wire din_en_pos = din_en_r[1] & !din_en_r[2];
	reg [31:0] dout_r;
	reg dout_r;
	
	//输入数据缓存
	always@(posedge clk2 or negedge rst_n)begin 
		if(!rst_n)
			dout_r <= 0;
		else if(din_en_pos)
			dout_r <= din;
	end
	
	//输出使能信号
	always@(posedge clk2 or negedge rst_n)begin 
		if(!rst_n)
			dout_en_r <= 0;
		else
			dout_en_r <= din_en_pos;
	end	
	
	assign dout = dout_r;
	assign dout_en = dout_en_r;
endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

二、快时钟域到慢时钟域

慢时钟域可能采样不到信号
三时钟沿要求:快时钟域信号宽度必须大于慢时钟域周期的1.5倍以上,也就是持续3个时钟沿以上(包括上升沿和下降沿)

1、单bit信号

  • 脉冲同步器/结绳法

2、多bit信号

  • 握手机制

三、多bit信号跨时钟域传输

1、多个信号合并

把多个信号合并为1bit信号再跨时钟域传输
在这里插入图片描述

2、多周期路径 Multi-cycle Path/MCP

不同步多位数据,只同步一位控制信号

3、使用格雷码

  • 如果多bit信号是简单递增或者递减,可以转化为格雷码,再打两拍到目标时钟域,再解码
  • 如果多bit信号没有规律,可以转化为独热码,再打两拍到目标时钟域,再解码,适合于从慢到快

4、使用异步FIFO

详细介绍:同步FIFO、异步FIFO详细介绍、verilog代码实现、FIFO最小深度计算、简答题

5、使用DMUX电路结构

适用:带有数据标志位的多bit信号跨时钟域传输(和延迟采样法差不多),适合于慢时钟域到快时钟域传播。
如果是快时钟域到慢时钟域,就把红色框内的两级同步器换成脉冲同步器。
adata_valid_rr再打一拍是为了和bdata的数据同步输出。
在这里插入图片描述

module mux_synchronizer(
	input aclk, 
	input bclk,
	input data_valid,
	input rst_n,
	input [7:0] data,
	output reg [7:0] data_b,
	output reg bdata_valid
);
	reg data_valid_r, data_valid_rr, data_valid_a;
	reg [7:0] data_a;
	always@(posedge aclk or negedge rst_n)begin
		if(!rst_n)begin
			data_valid_a <= 0;
			data_a <= 0;
		end
		else begin
			data_valid_a <= data_valid;
			data_a <= data;
		end
	end

	always@(posedge bclk or negedge rst_n)begin
		if(!rst_n)begin
			data_valid_r <= 0;
			data_valid_rr <= 0;
		end
		else begin
			data_valid_r <= data_valid;
			data_valid_rr <= data_valid_r ;
		end
	end
	
	always@(posedge bclk or negedge rst_n)begin
		if(!rst_n)begin
			data_valid_b <= 0;
		end
		else begin
			data_valid_b <= data_valid_rr;
		end
	end
	
	always@(posedge bclk or negedge rst_n)begin
		if(!rst_n)begin
			data_b<= 0;
		end
		else begin
			data_b <= (data_valid_rr) ? data_a : data_b;
		end
	end
endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

6、握手信号传输


四、简答题

1、跨时钟域传输的三种方法

打两拍、异步FIFO、握手信号

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/387539
推荐阅读
相关标签
  

闽ICP备14008679号