一个多bit信号的同步常用方法是使用demux方法,先将data数据的valid同步到dstClk,检测到valid_dst之后在采样data就可以了,此时data的多bit认为是已经稳定可采样。
还有一种需要握手的同步 先将src_valid同步到dst_valid,检测到dst_valid 产生dst_ack同步回src_ack,用src_ack清零 src_valid 这种方法常用在apb信号的同步 即只同步psel,penable。
可参考
这里在介绍一种没有相关的valid信号这种情况,代码如下:
module multiBitsync(
src_data,
dst_data,
dst_clk,
dst_rst_n
);
input [3:0] src_data;
input dst_clk;
input dst_rst_n;
output [3:0] dst_data;
reg [3:0] d_s4;
wire [3:0] d_s3;
wire [3:0] q_tmp;
wire unstable_data;
genvar i;
generate for (i=0; i<4; i++) begin: gen_sync_cell
xxx_sync_bit #(
.RST_VAL(0),
.SYNC_DEPTH(3)
) u_xxx_sync_bit(
.q (d_s3[i]),
.rst_n (dst_rst_n),
.clk (dst_clk),
.d (src_data[i])
);
endgenerate
always @(posedge dst_clk or negedge dst_rst_n) begin
if (dst_rst_n == 1'd0) begin
d_s4 <= 4'd0;
end
else begin
d_s4 <= d_s3;
end
end
assign unstable_data = |(d_s3 ^ d_s4);
assign q_tmp = (unstable_data == 1'd1) ? dst_data : d_s4;
always @(posedge dst_clk or negedge dst_rst_n) begin
if (dst_rst_n == 1'd0) begin
dst_data <= 4'd0;
end
else begin
dst_data <= q_tmp;
end
end
//或者用下面的写法 清晰一点,也就是最终输出dst_data在不稳定的时候不采样数据,稳定的时候采样d_s4
//always @(posedge dst_clk or negedge dst_rst_n) begin
// if (dst_rst_n == 1'd0) begin
// dst_data <= 4'd0;
// end
// else begin
// if (unstable_data == 1'd1)
// dst_data <= dst_data;
// else
// dst_data <= d_s4;
// end
end
endmodule