当前位置:   article > 正文

IC学习笔记8——单比特信号的跨时钟域处理方法之“握手信号”_单比特跨时钟域握手

单比特跨时钟域握手

一、握手信号

一个系统有两个时钟域的电路,其时钟频率分别为aclk=64MHz和bclk=20MHz。aclk时钟域驱动一个脉冲信号pulse_a(位宽1bit),传输到bclk时钟域的电路中,用于触发b模块的某些动作。解决这个单比特信号的跨时钟域问题,我们采用握手信号的方法处理。

1.1 概念

所谓握手,即通信双方使用了专用控制信号进行状态指示。
这个控制信号既有发送域给接收域的,也有接收域给发送域的,使用握手协议方式处理跨时钟域数据传输,只需要对双方的握手信号(req和ack)分别使用打两拍进行同步。
在具体实现中,假设req、ack总线在初始化时都处于无效状态,当发送域检测到脉冲信号pulse_a,使req信号有效,随后发送有效的req信号给接收域。
接收域在检测到有效的req信号后锁存数据总线,然后回送一个有效的ack信号表示读取完成应答。
发送域在检测到有效ack信号后撤销当前的req信号,接收域在检测到req撤销后也相应撤销ack信号,此时完成一次正常握手通信。

1.2 电路波形图

在这里插入图片描述
在这里插入图片描述

1.3 代码

     module handshake_signal(
                              input aclk,
                              input arst_n,
                              input signal_a,
                              input bclk,
                              input brst_n,
                              output signal_b
                             );
                             
                          reg   req;
                          reg   req_r0;
                          reg   req_r1; 
                          reg   req_r2; 
                     
                          reg   ack; 
                          reg   ack_r0;

                          always@(posedge aclk or negedge arst_n)
                          begin
                             if(arst_n==1'b0)
                                       req<=1'b0;
                             else if(signal_a==1'b1)
                                       req<=1'b1;
                             else  if(ack_r0==1'b1)
                                       req<=1'b0; 
                          end
                          
                          always@(posedge bclk or negedge brst_n)
                          begin
                               if(brst_n==1'b0)
                               begin
                                       {req_r2,req_r1,req_r0}<=3'b0;
                               end
                              else
                              begin        
                                        {req_r2,req_r1,req_r0}<=  {req_r1,req_r0,req};
                               end
                         end
                          
                           always@(posedge aclk or negedge arst_n)
                          begin
                             if(arst_n==1'b0)
                                     {ack_r0,ack}<=2'b0;
                             else
                                     {ack_r0,ack}<=  {ack,req_r1}; 
                          end
               assign   signal_b=req_r2^req_r1;
       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

握手方式也一般适用于单比特信号从快时钟域传递慢时钟域的场景

1.4 局限

握手信号的缺点也很明显,就是将aclk的信号进行了扩展,两次的同步也增加了延时,同时相比较“脉冲同步“使用了更多的资源。

二、参考文献

如何用握手信号法处理单比特跨时钟域问题

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

闽ICP备14008679号