赞
踩
一个系统有两个时钟域的电路,其时钟频率分别为aclk=64MHz和bclk=20MHz。aclk时钟域驱动一个脉冲信号pulse_a(位宽1bit),传输到bclk时钟域的电路中,用于触发b模块的某些动作。解决这个单比特信号的跨时钟域问题,我们采用握手信号的方法处理。
所谓握手,即通信双方使用了专用控制信号进行状态指示。
这个控制信号既有发送域给接收域的,也有接收域给发送域的,使用握手协议方式处理跨时钟域数据传输,只需要对双方的握手信号(req和ack)分别使用打两拍进行同步。
在具体实现中,假设req、ack总线在初始化时都处于无效状态,当发送域检测到脉冲信号pulse_a,使req信号有效,随后发送有效的req信号给接收域。
接收域在检测到有效的req信号后锁存数据总线,然后回送一个有效的ack信号表示读取完成应答。
发送域在检测到有效ack信号后撤销当前的req信号,接收域在检测到req撤销后也相应撤销ack信号,此时完成一次正常握手通信。
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
握手方式也一般适用于单比特信号从快时钟域传递慢时钟域的场景。
握手信号的缺点也很明显,就是将aclk的信号进行了扩展,两次的同步也增加了延时,同时相比较“脉冲同步“使用了更多的资源。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。