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 电路波形图

IC学习笔记8——单比特信号的跨时钟域处理方法之“握手信号”_第1张图片
IC学习笔记8——单比特信号的跨时钟域处理方法之“握手信号”_第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.4 局限

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

二、参考文献

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

你可能感兴趣的:(IC学习,学习,fpga开发)