原创 基于FPGA的跨时钟域信号处理——专用握手信号

2009-8-19 19:32 11265 4 21 分类: FPGA/CPLD

基于FPGA的跨时钟域信号处理——专用握手信号


<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

    在逻辑设计领域,只涉及单个时钟域的设计并不多。尤其对于一些复杂的应用,FPGA往往需要和多个时钟域的信号进行通信。异步时钟域所涉及的两个时钟之间可能存在相位差,也可能没有任何频率关系,即通常所说的不同频不同相。


    1是一个跨时钟域的异步通信实例,发送域和接收域的时钟分别是clk_aclk_b。这两个时钟频率不同,并且存在一定的相位差。对于接收时钟域而言,来自发送时钟域的信号data_a2b有可能在任何时刻变化。


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />


点击看大图


1 跨时钟域通信


    对于上述的异步时钟域通信,设计者需要做特殊的处理以确保数据可靠的传输。由于两个异步时钟域的频率关系不确定,触发器之间的建立时间和保持时间要求也无法得到保证。如果出现建立时间或者保持时间违规,接收域将会采样到处于亚稳态数据,那么后果可想而知。


    如何有效的进行跨时钟域的信号传输呢?最基本的思想是同步,在这个基础上设计者可以利用各种协议约定进行通信。单向控制信号检测方式(前面提到过的脉冲信号检测方法,这里为了和握手方式相区别,所以如此称呼)、握手协议的方式或者借助存储器的方式都是比较常用的处理手段。


    本文将重点介绍握手方式进行异步时钟域的通信。


    2是一个基本的握手通信方式。所谓握手,意即通信双方使用了专用控制信号进行状态指示。这个控制信号既有发送域给接收域的,也有接收域给发送域的,有别于前面的单向控制信号检测方式。



点击看大图


2 握手通信原理


    使用握手协议方式处理跨时钟域数据传输,只需要对双方的握手信号(reqack)分别使用脉冲检测方法进行同步。在具体实现中,假设reqackdata总线在初始化时都处于无效状态,发送域先把数据放入总线,随后发送有效的req信号给接收域。接收域在检测到有效的req信号后锁存数据总线,然后回送一个有效的ack信号表示读取完成应答。发送域在检测到有效ack信号后撤销当前的req信号,接收域在检测到req撤销后也相应撤销ack信号,此时完成一次正常握手通信。此后,发送域可以继续开始下一次握手通信,如此循环。该方式能够使接收到的数据稳定可靠,有效的避免了亚稳态的出现,但控制信号握手检测会消耗通信双方较多的时间。以上所述的通信流程如图3所示。



点击看大图


3 握手通信流程


    下面通过一个简单的工程代码及其仿真测试进一步加深大家对基本握手协议的认识。


module handshack(


                clk,rst_n,


                req,datain,ack,dataout


            );


 


input clk;      //50MHz系统时钟


input rst_n;    //低电平复位信号


 


input req;      //请求信号,高电平有效


input[7:0] datain;  //输入数据


output ack;     //应答信号,高电平有效


output[7:0] dataout;//输出数据,主要用于观察是否和输入一致


 


//--------------------------------------


//req上升沿检测


reg reqr1,reqr2,reqr3;


 


always @(posedge clk or negedge rst_n)


    if(!rst_n) begin


            reqr1 <= 1'b1;


            reqr2 <= 1'b1;


            reqr3 <= 1'b1;


        end


    else begin


            reqr1 <= req;


            reqr2 <= reqr1;


            reqr3 <= reqr2;


        end


       


    //pos_req2pos_req1延后一个时钟周期,确保数据被稳定锁存


wire pos_req1 = reqr1 & ~reqr2; //req上升沿标志位,高有效一个时钟周期


wire pos_req2 = reqr2 & ~reqr3; //req上升沿标志位,高有效一个时钟周期


 


//--------------------------------------


//数据锁存


reg[7:0] dataoutr;


 


always @(posedge clk or negedge rst_n)


    if(!rst_n) dataoutr <= 8'h00;


    else if(pos_req1) dataoutr <= datain;   //检测到req有效后锁存输入数据


   


assign dataout = dataoutr; 


   


//--------------------------------------


//产生应答信号ack


reg ackr;


 


always @(posedge clk or negedge rst_n)


    if(!rst_n) ackr <= 1'b0;


    else if(pos_req2) ackr <= 1'b1;


    else if(!req) ackr <= 1'b0;


 


assign ack = ackr;


 


endmodule


 


    该实例的verilog代码模拟了握手通信的接收域,其仿真波形如图4所示。在发送域请求信号(req)有效的若干个时钟周期后,先是数据(datain)被有效锁存了(dataout),然后接收域的应答信号(ack)也处于有效状态,此后发送域撤销请求信号,接收域也跟着撤销了应答信号,由此完成一次通信。



点击看大图


4 握手通信仿真波形

文章评论17条评论)

登录后参与讨论

billzhu_345737527 2014-6-19 15:29

测试代码怎么写

wujingwei1990_987795185 2012-12-14 11:00

特权同学您好,这里我有个问题。在req的撤销时也就是reqr<=0.这个时候也会产生pos—req1和pos_req2状态的改变,这个会导致ack的改变。也就是说下降沿的时候也会导致ack<=1呀。不知特权同学怎么考虑的哦?

billzhu_345737527 2012-3-21 11:19

我有个疑问,这里datain的频率与clk的频率不同步啊,万一datain两个clk或者一个clk就发生跳变,那怎么进行处理呢,会有那么多时间来进行握手么?

schoolwe_500423590 2012-2-2 22:03

在这个基础上设计者可以利用各种协议约定进行通信。单向控制信号检测方式(前面提到过的脉冲信号检测方法,这里为了和握手方式相区别,所以如此称呼)、握手协议的方式或者借助存储器的方式都是比较常用的处理手段。

billzhu_345737527 2012-2-2 06:32

亚稳态也没处理。。。。还得加个synchronizer

billzhu_345737527 2012-2-2 06:31

你画两个时钟啊,不清不楚的

yanzhe127_721589395 2011-7-1 16:20

我觉得riple说的没错啊,实际上FIFO和握手控制信号本质上都是将多bit跨时钟域传输转换成单比特传输,所以我感觉应该req 和 ack 在各自的时钟域做同步,必要的时候ack还要展宽

izefei 2011-5-27 16:22

嗯,不错。

ilove314_323192455 2009-8-22 23:20

呵呵,我也准备就亚稳态问题和该文中提到的req、ack的有效采样再写一篇深入的博文,到时riple兄可别忘了指点指点,哈哈

ash_riple_768180695 2009-8-22 08:02

这篇经典文章中关于取边沿脉冲的电路和握手的论述也很好:http://article.ednchina.com/2004-8/AtcShow2005127160310.htm
相关推荐阅读
特权ilove314 2016-06-30 21:16
例说FPGA连载6:FPGA开发所需的技能
例说FPGA连载6:FPGA开发所需的技能 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   前面的文字已经做了很多铺垫,相信读...
特权ilove314 2016-06-28 21:09
例说FPGA连载5:FPGA的优势与局限性
例说FPGA连载5:FPGA的优势与局限性 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   若要准确评估FPGA技术能否满足开...
特权ilove314 2016-06-28 21:05
例说FPGA连载5:FPGA的优势与局限性
例说FPGA连载5:FPGA的优势与局限性 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   若要准确评估FPGA技术能否满足开...
特权ilove314 2016-06-26 22:11
例说FPGA连载4:FPGA语言与厂商介绍
例说FPGA连载4:FPGA语言与厂商介绍 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   Verilog与VHDL 说到FP...
特权ilove314 2016-06-23 21:26
例说FPGA连载3:FPGA与其它主流芯片的比较
例说FPGA连载3:FPGA与其它主流芯片的比较 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   FPGA、ASIC和ASSP...
特权ilove314 2016-06-21 20:32
例说FPGA连载2:FPGA是什么
例说FPGA连载2:FPGA是什么 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   2015年伊始,Intel欲出资百亿美金收...
广告
我要评论
17
4
1
2
3
4
5
6
7
8
9
0
广告
关闭 热点推荐上一条 /4 下一条