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

上段内容参考:跨时钟域处理——专用握手信号

如下图为握手通信示意图:

//2019年8月17日更新

发送域的Verilog设计:

module handshake_tclk(input tclk, //发送域的时钟和复位input resetb_tclk,input r_ack, //接收到的响应信号input data_avail, //从其他模块接收到的数据有效信号input [31:0] transmit_data, //需要发送出去的信号output t_rdy, //对于发送时钟域,需要输出数据准备好了的信号,以便在接收时钟域接收此信号,用来提示接收信号output [31:0] t_data //需要发送出去的信号
);localparam IDLE = 3'b001;     //空闲状态,判断数据是否有效,如果有效就输出t_rdy有效,表示数据准备好了localparam ASSERT_TRDY = 3'b010; //到了这个状态,表明t_rdy已经有效了,这时我们需要判断响应r_ack_tclk是否有效,如果有效则使t_rdy无效,否则保持不变localparam DEASSERT_TRDY = 3'b100; //到了这个t_rdy无效状态,需要考虑下一次的数据传输了,如果data_avail有效,则下一个状态进入ASSERT_TRDY,且t_rdy有效,否则进入空闲状态reg t_cur_state, t_nxt_state;reg t_rdy, t_rdy_nxt;reg [31:0] t_data, t_data_nxt;reg r_ack_d1, r_ack_tclk; //对于接收到的响应信号,需要进行时钟域同步,同步到发送时钟域always@(posedge tclk or negedge resetb_tclk) beginif(resetb_tclk) begint_cur_state <= IDLE;t_rdy <= 0;//同步接收域的响应信号ackr_ack_d1 <= 0;r_ack_tclk <= 0;endelse begint_cur_state <= t_nxt_state;t_rdy <= t_rdy_nxt;r_ack_d1 <= r_ack;r_ack_tclk <= r_ack_d1;endendalways@(*) begint_nxt_state = t_cur_state;t_rdy_nxt = 0;t_data_nxt = t_data;case(t_cur_state) IDLE: beginif(data_avail) begint_nxt_state = ASSERT_TRDY;t_rdy_nxt = 1'b1;t_data_nxt = transmit_data;endelse ; endASSERT_TRDY: beginif(r_ack_tclk) begint_rdy_nxt = 1'b0;t_nxt_state = DEASSERT_TRDY;t_data_nxt = 'd0;endelse begint_rdy_nxt = 1'b1;t_data_nxt = t_data;endendDEASSERT_TRDY: beginif(!r_ack_tclk) beginif(data_avail) begint_nxt_state = ASSERT_TRDY;t_rdy_nxt = 1'b1;t_data_nxt = transmit_data;endelse t_nxt_state = IDLE;endelse;enddefault: ;endcaseendendmodule

更新于2019年8月18日:

接收域设计代码:

module handshake_rclk(input rclk,input resetb_rclk,input t_rdy,input [31:0] t_data,output r_ack);localparam IDLE = 2'b01;localparam ASSERT_ACK = 2'b10;reg r_cur_state, r_nxt_state;reg r_ack, r_ack_nxt;reg [31:0] t_data_rclk, t_data_rclk_nxt;reg t_rdy_d1, t_rdy_rclk;always@(posedge clk or negedge resetb_rclk) beginif(~resetb_rclk) beginr_cur_state <= IDLE;r_ack <= 0;t_data_rclk <= 0;t_rdy_d1 <= 0;t_rdy_rclk <= 0;endelse beginr_cur_state <= r_nxt_state;r_ack <= r_ack_nxt;t_data_rclk <= t_data_rclk_nxt;t_rdy_d1 <= t_rdy;t_rdy_rclk <= t_rdy_d1;endendalways@(*) beginr_nxt_state = r_cur_state;r_ack_nxt = 1'b0;t_data_rclk_nxt = t_data_rclk;case(r_nxt_state)IDLE: beginif(t_rdy_rclk) beginr_nxt_state = ASSERT_ACK;r_ack_nxt = 1'b1;t_data_rclk_nxt = t_data;endelse;endASSERT_ACK: beginif(~t_rdy_rclk) beginr_ack_nxt = 1'b0;r_nxt_state = IDLE;endelse r_ack_nxt = 1'b1;endendcaseend

综合上述两段设计程序,来大致总结下发送域的控制信号t_rdy和接收域的响应信号r_ack之间的关系;

最先是t_rdy有效,当接收域检测到t_rdy信号后,r_ack有效;

让发送域检测到r_ack后,t_rdy无效;

让接收域检测到t_rdy无效后,使r_ack无效,此时,一次完整的握手成功完成。

无效素材:


下面的设计是参考互联网上的,不得不说真是良莠不齐,这个设计既然是跨时钟域设计的握手信号,你都没有两套时钟,怎么能叫跨时钟域呢?

下面给出Verilog代码及测试文件:

`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2019/04/28 21:00:41
// Design Name:
// Module Name: handshack
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module handshack(input clk,               //系统时钟input rst_n,           //低电平复位信号input req,               //请求信号,高电平有效input [7:0] datain,      //输入数据output ack,              //应答信号,高电平有效output [7:0] dataout     //输出数据,主要用于观察是否和输入一致);//req上升沿检测reg reqr1, reqr2, reqr3; //定义reqrx代表延迟x拍//--------------------------------------------------------//第一种方法always @ (posedge clk or negedge rst_n) beginif(!rst_n) beginreqr1 <= 1'b0;reqr2 <= 1'b0;reqr3 <= 1'b0;endelse beginreqr1 <= req;reqr2 <= reqr1;reqr3 <= reqr2;endend//pos_req3比pos_req2延后一拍,确保数据被稳定锁存wire pos_req1, pos_req2, pos_req3;assign pos_req1 = ( { req, reqr1 } == 2'b10 ) ? 1'b1 : 1'b0;assign pos_req2 = ( { reqr1, reqr2 } == 2'b10 ) ? 1'b1 : 1'b0;assign pos_req3 = ( { reqr2, reqr3 } == 2'b10 ) ? 1'b1 : 1'b0;//------------------------------------------------------------------// 检测上升沿的第二种方法// assign pos_req1 = ~reqr1 & req;// assign pos_req2 = ~reqr2 & reqr1;// assign pos_req3 = ~reqr3 & reqr2;//----------------------------------------------------------------//数据锁存reg [7:0] dataoutr;always @ (posedge clk or negedge rst_n) beginif(!rst_n) begindataoutr <= 8'h00;endelse if(pos_req2) begindataoutr <= datain; //检测到req有效后的第二拍,锁存输入数据;endendassign dataout = dataoutr;//-------------------------------------------------------------------//产生应答信号reg ackr;always @ (posedge clk or negedge rst_n) beginif(!rst_n) beginackr <= 1'b0;endelse if(pos_req3) begin  //锁存输入数据后的一拍,产生应答信号ackr <= 1'b1;endelse if(!req) beginackr <= 1'b0;endendassign ack = ackr;endmodule
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2019/04/28 22:12:00
// Design Name:
// Module Name: handshack_tb
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module handshack_tb();reg clk, rst_n;reg req;reg [7:0] datain;wire ack;wire [7:0] dataout;//--------------------------------------------------//产生时钟initial clk = 0;always begin#1 clk = ~clk; end//------------------------------------------------------//初始化initial beginrst_n = 0;req = 0;#4rst_n = 1;#4datain = 8'h55;#2req = 1;#10req = 0;datain = 8'haa;#4req = 1;#10req = 0;end//------------------------------------------------------//调用模块handshack u_handshack(.clk(clk),.rst_n(rst_n),.req(req),.datain(datain),.ack(ack),.dataout(dataout));endmodule

仿真波形:

RTL原理图:

主要观察pos_reqx是由多路选择器构成,但如果将上升沿检测部分用与门方式实现,我们看看RTL图是什么样的:

跨时钟域信号传输问题之握手同步相关推荐

  1. 跨时钟域信号传输(二)——数据信号篇

    一.使用握手信号进行跨时钟域的数据传输 下面叙述的意义相同:前级时钟=发送时钟: 后级时钟=采样时钟=接收时钟 使用握手信号传输数据不是我们的重点,重点是FIFO的设计.在使用握手信号进行数据传输之前 ...

  2. 单bit脉冲信号跨时钟域处理——展宽信号 + 握手协议

    对于单比特数据,在慢时钟域到快时钟域的数据传输中,可以使用两级触发器进行同步,以此来解决跨时钟域问题. 但在快时钟域到慢时钟域的数据传输中,只有当in 在很长一段时间内为1或0时,才能确保一定可以被c ...

  3. 跨时钟域为什么要双寄存器同步

    随着设计规模的不断攀升,各种接口外设琳琅满目,时钟"满天飞"就不可避免(注意这里的"满天飞"不是滥用,意指时钟频率多.时钟扇出多).而一个设计中,不同时钟频率之 ...

  4. 漫谈时序设计(1)跨时钟域是设计出来的,而非约束出来的!

    目录 亚稳态(Metastability) 单比特信号同步 慢时钟域到快时钟域 快时钟域到慢时钟域 多比特信号同步 Handshake Mechanism 异步FIFO 参考链接 写在最后 这篇博文在 ...

  5. 【 FPGA 】跨时钟域处理以及边沿检测

    本文转载自:跨时钟域处理 题目:多时钟域设计中,如何处理跨时钟域 单bit:两级触发器同步(适用于慢到快) 多bit:采用异步FIFO,异步双口RAM 加握手信号 格雷码转换 题目:编写Verilog ...

  6. 异步fifo_数字IC校招基础知识点复习(五)——跨时钟域涉及part2(异步FIFO)

    1.跨时钟域设计(CDC)-part 2 在上一篇中我们主要关注的是单比特的控制信号,而对于多比特信号的跨时钟域传输则需要一些其他的手段. 首先需要明确的是,一般不采用对多比特信号中的每个比特单独使用 ...

  7. 【数字IC基础】跨时钟域(CDC,Clock Domain Crossing)

    文章目录 一.什么是跨时钟域? 二.跨时钟域传输的问题? 2.1 亚稳态(单bit:两级D触发器(双DFF)) 2.2 数据收敛(多bit亚稳态)(格雷码编码.握手协议.异步FIFO.DMUX) 2. ...

  8. 跨时钟域传输和Verilog代码

    文章目录 基本概念 一.单bit信号 1.慢时钟域信号同步到快时钟域 2.快时钟域信号同步到慢时钟域 3.结绳法处理单bit信号跨时钟域 二.多bit控制信号跨时钟域同步 三.多bit数据流跨时钟域同 ...

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

    转自:http://bbs.ednchina.com/BLOG_ARTICLE_253787.HTM 在逻辑设计领域,只涉及单个时钟域的设计并不多.尤其对于一些复杂的应用,FPGA往往需要和多个时钟域 ...

最新文章

  1. python正则表达式模糊匹配_用python正则表达式编译模糊正则表达式
  2. 第七周项目一-友元函数(3)
  3. 网站安全狗”响应内容保护“网页错误返回页面优化功能介绍
  4. JAX-RS 2.x与Spring MVC:返回对象列表的XML表示
  5. 专访:混合云的发展趋势
  6. c++ 二次开发 良田高拍仪_六枝特良田LYV-850加工中心导轨配套防护罩日常维修
  7. C# - 自动生成分页存储过程
  8. 12.混淆——介绍,傅里叶变换抽样对,采样和重建_1
  9. HTTPS实战之单向验证和双向验证
  10. linux环境中nagios(nagios core)安装?nagios安装?
  11. 【TSP】基于matlab灰狼算法求解旅行商问题【含Matlab源码 1327期】
  12. java jsp高校贫困生助学贷款系统ssm框架
  13. USB免驱接触式FM4442卡ISO7816读写器S3-BMU-A0函数使用规则
  14. KDD2020|字节联合密歇根州立大学提出推荐广告联合训练框架RAM(已开源)
  15. 监听电源键的单击或长按事件
  16. voip 语音质量[摘]
  17. Vue ElementUI el-tree 修改节点收缩 icon
  18. Python安装.whl文件流程及问题解决
  19. middles在python中什么意思_middles是什么意思_middles在线翻译_英语_读音_用法_例句_海词词典...
  20. MYSQL数据库表A数据同步到表B

热门文章

  1. Tiny C++通用库终于基本上完成了 - 专职C++ - C++博客
  2. postfix管理邮件队列的小程序
  3. 用计算机怎么开启音乐模式,XP开机音乐怎么设置?如何设置电脑开机音乐?
  4. 橡胶支座抗压弹性模量计算公式_囊谦网架生态酒店_网架抗震垫块A诚信商家-桥兴橡胶...
  5. mysql 分组排序_MySQL如何实现Excel分组排序功能?
  6. 不符合核销规则条件_1136家建筑企业资质核查不符合条件,复查合格率仅50
  7. linux docker运行目录,Linux更改Docker运行根目录的方法
  8. 智能车竞赛技术报告 | 智能视觉组 - 大连海事大学 - 菜鸡啄米
  9. 第十六届智能车竞赛英飞凌技术培训日程安排
  10. 第十六届全国大学生智能车竞赛竞速组-室内视觉组补充说明