【芯片前端】单比特跨时钟同步器的格雷码测试

前言

在写完上一篇【芯片前端】仿真向/基于静态随机函数的单比特跨时钟同步器之后,我觉得有必要测试一下在多比特格雷码跨异步的场景下,所以我又做了一下格雷码跨异步的测试;

代码

当然,要先准备二进制转格雷码的代码:

module B2G_Conv #(parameter WD = 4)(
    output [WD-1:0] gray,
    input  [WD-1:0] binary
    );

    assign gray = (binary >> 1) ^ binary;

endmodule

以及格雷码转二进制的代码:

module G2B_Conv #(parameter WD = 4)(
    output reg [WD-1:0] binary,
    input [WD-1:0] gray
    );

    integer k;
    always @(gray)
    begin
        for (k = 0; k < WD; k = k + 1)
            binary[k] = ^(gray >> k);
    end

endmodule

这两个代码在很久以前的博客进阶之路——二进制与格雷码的相互转换模块设计有比较详细的说明了,因此直接考过来使用了;

然后是跨异步模块,将上篇博客的单比特同步器上层再疯转一下就可以了,大体就是把二进制转格雷码,然后格雷码跨异步,然后格雷码转二进制,代码中的o_cnt_org为观察信号,即完全不考虑亚稳态影响下的接收端行为;

module cnt_sync_bus#(parameter WD = 4) (
    //output
    output [WD -1:0] o_cnt,

    //input
    input            i_clk,
    input            i_rst_n,
    input  [WD -1:0] i_cnt,

    input            o_clk,
    input            o_rst_n
);

wire [WD -1:0] i_cnt_gray, o_cnt_gray, o_cnt_gray_org, o_cnt_org;
B2G_Conv #(.WD(WD))
u_b2g(.binary(i_cnt), .gray(i_cnt_gray));

genvar i;
generate
    for(i=0; i<WD; i=i+1)begin: GRAY_SYNC
        sync_sim_unit u_sync(
            .o_sync     (o_cnt_gray[i]),
            .o_sync_org (o_cnt_gray_org[i]),
            
            .i_clk      (i_clk),
            .i_rst_n    (i_rst_n),
            .i_sync     (i_cnt_gray[i]),

            .o_clk      (o_clk),
            .o_rst_n    (o_rst_n)
        );
    end
endgenerate

G2B_Conv #(.WD(WD))
u_g2b(.gray(o_cnt_gray), .binary(o_cnt));

G2B_Conv #(.WD(WD))
u_g2b_org(.gray(o_cnt_gray_org), .binary(o_cnt_org));

endmodule

OK,代码就写完了,然后测试一下;

测试

快时钟跨异步到慢时钟的场景:

 从图里可以挺明显的看到,有些值由于没有被采样到,直接就没了,比如2(sync里我还打了一拍,因此看看i_cnt延一拍的情况);有些因为亚稳态被吃掉了,比如 8;

满时钟到快时钟的场景:

可以看到确实不会有漏采,但是可能会晚一拍达到正确值。 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 多bit跨时钟域同步格雷码是一种在不同时钟域之间进行数据传输的编码方式。在多时钟域系统中,不同的时钟频率可能会导致数据传输的不准确性和同步问题。为了解决这个问题,人们提出了多bit跨时钟域同步格雷码格雷码是一种二进制编码方式,相邻两个数值之间仅有一位二进制位的改变,可以有效地减少在数据传输中的错误,提供更高的数据传输可靠性。多bit跨时钟域同步格雷码,指的就是将多个时钟域之间的数据进行编码和解码,以实现正确的数据传输。 在多bit跨时钟域同步格雷码中,首先需要在发送方将原始数据进行编码。编码过程中,会将数据转换为格雷码形式,即相邻两个数据之间仅有一位二进制位的变化。然后,在接收方,通过解码过程将接收到的格雷码还原为原始数据。 为了实现跨时钟域同步,可能需要使用一些专门的电路或算法。一种常见的方法是使用多级同步和时钟握手信号来进行时钟域之间的同步。这样可以确保接收方在正确的时钟节拍下接收并解码数据,从而减少数据传输错误的可能性。 总的来说,多bit跨时钟域同步格雷码通过编码和解码的方式,在不同时钟域之间实现了数据传输的同步和可靠性。这种编码方式可以广泛应用于多时钟域系统中的数据传输,提高系统的性能和可靠性。 ### 回答2: 多bit跨时钟域同步是指在不同时钟域之间进行数据传输时,需要进行同步以保证数据的正确性。而格雷码是一种编码方式,在二进制编码中比较能够减少由于信号传输延迟和干扰而造成的错误。 在多bit跨时钟域同步过程中,为了保持数据的同步,通常会使用双重同步策略。首先,在发送端时钟域中使用锁相环等电路将数据进行同步,并将其转换为格雷码。然后,在接收端的时钟域中使用另一个锁相环将数据同步回来,并重新转换为二进制码。 格雷码的特点使其在多bit跨时钟域同步中具有一定的优势。格雷码中相邻的码字只有一位发生变化,这样在信号发生传输延迟或者干扰引起的错误时,只会影响到一个位,减少了错误的传播。同时,格雷码转换过程中只需要少量的逻辑门操作,降低了电路的复杂性。 在多bit跨时钟域同步中使用格雷码可以提高系统的可靠性和稳定性。通过双重同步策略和格雷码的编码方式,可以有效减少由于时钟差异和信号传输问题导致的数据错误。在实际应用中,需要根据具体的系统要求和传输距离选择合适的时钟同步和编码方式,以确保数据的正确传输。 ### 回答3: 多bit跨时钟域同步是指在不同时钟域中的多位二进制数据进行同步的一种方法。而格雷码是一种二进制数码系统,其中相邻的数只有一个位数变化。 在多bit跨时钟域同步中使用格雷码是因为格雷码具有一定的容错性和同步性能。由于格雷码的特点是相邻数只有一个位数变化,因此在跨时钟域同步过程中可以降低错误传播的风险。在数据从一个时钟域传输到另一个时钟域时,由于时钟的相位差或频率差异,传统的二进制数据可能会出现错误的传输或解析,而使用格雷码可以有效减少这种错误。 在多bit跨时钟域同步中,使用格雷码的具体方法可以通过引入一个辅助时钟域,在这个辅助时钟域中对原始二进制数据进行格雷码编码。然后,将编码后的格雷码数据传输到目标时钟域,并在目标时钟域中进行格雷码解码,得到最终的二进制数据。 通过这种跨时钟域同步的方式,可以确保数据在不同时钟域中的传输正确性,并减少错误传播的风险。格雷码的特性,即相邻数只有一个位数变化,使得数据传输更加稳定和可靠。 总之,多bit跨时钟域同步使用格雷码是一种有效的同步方法,通过将原始二进制数据编码成格雷码,并在目标时钟域中解码,可以保证数据在不同时钟域之间的传输正确性和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尼德兰的喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值