一、握手信号
一个系统有两个时钟域的电路,其时钟频率分别为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.4 局限
握手信号的缺点也很明显,就是将aclk的信号进行了扩展,两次的同步也增加了延时,同时相比较“脉冲同步“使用了更多的资源。