本文主要是介绍跨时钟域之全握手,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在跨时钟域(Clock Domain Crossing,CDC)处理时,需要根据源时钟频率,目的时钟频率以及数据是多bit还是单bit数据来选择合适的同步方式。本文主要介绍全握手与半握手处理机制。握手的机制是基于反馈信号进行跨时钟域同步。接下来会详细分析半握手与全握手机制,总结两种握手机制的特点以及适用的场景。
假设有跨时钟域传输的电路如图 1所示,在图中分为trans_module与recv_module两个模块,其中trans_module为发起传输请求的模块,recv_module会根据trans_module的请求来响应传输。
图 1 跨时钟域传输模块电路图
跨时钟域握手传输的时序图如图 2所示。具体传输过程如下:
- trans_module将数据准备完毕,将WDATA1输出到twrdata写数据线,并且拉高trans_req,发起一次传输请求。
- recv_module通过第一级D触发器(也成同步器,Synchronizer)对trans_req进行同步得到tready_ff1,再经过第二级同步器得到tready_ff2。
- 此时recv_module采样到(tready_ff2 == true)因此recv_module可认为twrdata数据已经准备好,能够对twrdata传输的数据进行采样得到WDATA1。
- recv_module可能根据功能计算出要回写的数据,并将要写的数据通过rwrdata数据线发送,此时拉高rack,用于通知trans_module已经成功接收到数据或者要回写的数据已经准备好了。至此已经完成了半握手。
- trans_module通过同步器同步recv_module发送过来的rack信号得到rcv_ack_ff2信号,当检测到(rcv_ack_ff2 == true)此时trans_module知道recv_module已经成功收到数据,并且回写的数据已经准备好了,能够对rwrdata数据线采样得到RDATA1。
- 将trans_req拉低,表示trans_module已经接收到recv_module回写的数据。
- recv_module采集经过同步器同步的tready_ff2为低时拉低rack信号,此时recv_module知道trans_module已经成功接收到回写的数据。
- trans_module检测到rcv_ack_ff2为低电平,此时本次传输已经结束,能够进行下一轮传输。即根据需求重新发起trans_req
图 2 跨时钟域握手机制时序图
为进一步验证上述理论,分别仿真快时钟域向慢时钟域发起传输请求与慢时钟域向快时钟域发起传输请求的全握手传输实验。结果如图 3图 4所示,从波形图中能看到数据均被正确传输。
图 3 慢时钟域向快时钟域传输
图 4 快时钟域向慢时钟域传输
问题讨论:
- 在图 2中展示的时慢时钟域到块时钟域传输的过程,那么当快时钟域向慢时钟域进行数据传输时,握手的方法仍然适用吗?
为了详细说明快时钟域向慢时钟域传输数据,根据握手传输的机制能够得到如图 5所示时序图。从图中能够明显发现全握手方式不论是快时钟域到慢时钟域还是慢时钟域到块时钟域均能够处理跨时钟域问题。
图 5 快时钟域向慢时钟域同步
- 当传输过程描述中e)阶段已经trans_module已经成功将数据写入到recv_module,并且已经接收到recv_module回写的数据,此时能否进行下一轮新的传输?
如果传输时情况是慢时钟域发起trans_req请求,那么当trans_module采集到rcv_ack_ff2为高拉低trans_req一个时钟周期后就可以进行下一轮请求,不必等到rcv_ack_ff2为低。但是当传输时快时钟域发起trans_req的情况如果trans_module不等待rcv_ack_ff2为低就发起新的请求就可能存在trans_req拉低被recv_module漏采,因此需要根据实际情况选择传输方式。
本问题能够进一步讨论半握手方式与全握手方式。半握手方式适用于慢时钟域向快时钟域发起trans_req请求的情况,半握手传输效率比较高,能够比较快的完成数据传输的握手操作,但是半握手是单向的数据传输,当需要回写数据时,应该采用全握手,或者回写数据方作为半握手传输的发起方。对于快时钟域向慢时钟域发起trans_req,或者两个时钟域时钟速度完全不确定的情况下适合全握手方式。
别走开,Jayden小哥哥有话说,仿真工程与源码可扫描二维码关注公众号鼓捣猫尼回复“全握手工程源码”获得(不要引号)。在Jayden小哥哥的杂货铺会不定期的更新关于PFGA、IC设计、模拟电路、嵌入式编程等学习心得,期待小伙伴的关注与点赞,I need U。
这篇关于跨时钟域之全握手的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!