0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是握手协议?握手机制的原理

倩倩 来源:CSDN 作者:CSDN 2022-08-12 14:51 次阅读

什么是握手协议

说起握手,首先查了一下百度百科。握手是一种礼仪,起源于中世纪的欧洲,顺序为长幼有序,女士优先。(PS:所以握手的时候,男士记得要绅士一点哦)。

芯片中,握手是最古老的跨时钟域之间传输数据的方式。握手机制通过将脉冲信号展宽,待输出一侧检测到信号并将其解析为脉冲信号后,再向输入一侧发送应答信号,表明接收到信号并且传输完成。

96f7bf62-19f6-11ed-ba43-dac502259ad0.png

为什么要握手

在人类的进化史中,握手作为一种善意的表达方式,可以增进人与人之间的和谐。言归正传,那么数字电路中为什么也需要握手机制呢?这是因为在数字电路中,跨时钟域处理是个较为常见的问题。关于跨时钟域,我们公众号之前有介绍过,想复习一下的同学可以查看一下之前写的文章。

在从快时钟向慢时钟传递时,由于输入信号变化较快,输出一侧可能跟不上输入的变化,从而导致“漏采“现象。由于两个时钟之间的频率不同,来自快时钟域的脉冲信号,还没来得及被慢时钟的采到,便转瞬即逝,从而导致信号被漏采。此时,握手机制便可以大显神通。

握手机制的原理

97777d60-19f6-11ed-ba43-dac502259ad0.png

(1)发送端在t_clk时钟域下将需要发送的数据准备好后,将t_rdy信号置为有效,该信号必须在tclk下降沿输出。接收端在rclk时钟域下同步r_rdy信号,同步后的信号命名为t_rdy_rclk。

(2)接收端在t_rdy_rclk有效期间,对t_data进行采样,得到t_data_rclk。

(3)接收端将r_ack信号置为1,信号必须在rclk下降沿输出。发送端将r_ack同步为r_ack_tclk。

至此,已经完成“半握手”,发送端在输出下一数据前,不会等到r_ack_tclk被置为0。半握手机制工作速度快,但是使用不当有可能会导致操作错误。然而,如果要从高频时钟向低频时钟传输数据,则需要采用全握手机制。

(4)当r_ack_tclk为高电平时,发送端将t_rdy置为0。

(5)当t_rdy_rclk为低电平时,接收端将r_ack置为0。

(6)当r_ack_tclk为低电平时,发送端将t_rdy重新置为1发送端可以发送新的数据。

至此,全握手完成。显然,全握手过程耗时较长,数据传输较慢。但是全握手机制稳定可靠,可以在两个任意频率的时钟域中安全地进行数据传输。需要注意一点的是,数据应该在发送时钟域内稳定至少两个时钟上升沿,请求信号req的宽度应该超过两个时钟周期,否则从高速时钟向低速时钟传递可能无法捕捉到该信号,也就是信号“失联”了。

握手机制的代码实现

发送端状态机:

97c37e22-19f6-11ed-ba43-dac502259ad0.jpg


module transmit(tclk,reset_tclk,t_rdy,data_avail,transmit_data,t_data,r_ack);input tclk;input reset_tclk;input data_avail;input [31:0]transmit_data;input r_ack;output t_rdy;output t_data;
localparam IDLE_T = 2'd0,    ASSERT_T_RDY = 2'd1,    DEASSERT_T_RDY = 2'd2;
reg [1:0] t_hndshk_state,t_hndshk_state_nxt;reg t_rdy,t_rdy_nxt;reg [31:0] t_data,t_data_nxt;reg r_ack_tclk;
always@(*)begin
 t_hndshk_state_nxt = t_hndshk_state; t_rdy_nxt = 1'b0; t_data_nxt = t_data;
 case(t_hndshk_state)  IDLE_T:begin   if(data_avail) begin    t_rdy_nxt = 1'b1;    t_hndshk_state_nxt = ASSERT_T_RDY;    t_data_nxt = transmit_data;   end  end
  ASSERT_T_RDY:begin   if(r_ack_tclk)begin    t_rdy_nxt = 1'b0;    t_hndshk_state_nxt = DEASSERT_T_RDY;    t_data_nxt = 'd0;   end   else begin    t_rdy_nxt = 1'b1;    t_data_nxt = transmit_data;   end  end
  DEASSERT_T_RDY:begin   if(!r_ack_tclk)begin    if(data_avail)begin     t_rdy_nxt = 1'b1;     t_hndshk_state_nxt = ASSERT_T_RDY;     t_data_nxt = transmit_data;    end    else begin     t_hndshk_state_nxt = IDLE_T;    end   end  end
 endcaseendalways@(posedge tclk or negedge reset_tclk)begin if(!reset_tclk)begin  t_rdy <= 1'b0;  t_hndshk_state <= IDLE_T;  t_data <= 32'h00000000;  r_ack_tclk <= 1'b0; end
 else begin  t_rdy <= t_rdy_nxt;  t_hndshk_state <= t_hndshk_state_nxt;  t_data <= t_data_nxt;  r_ack_tclk <= r_ack; end
endendmodule

接收端状态机:

97e481b2-19f6-11ed-ba43-dac502259ad0.jpg


module receiver(rclk,reset_rclk,t_rdy,t_data,r_ack);input rclk,reset_rclk;input t_rdy;input[31:0] t_data;output r_ack;
reg r_hndshk_state,r_hndshk_state_nxt;reg t_rdy_rclk;reg[31:0] t_data_rclk,t_data_rclk_nxt;reg r_ack,r_ack_nxt;
localparam IDLE_R = 1'b0,    ASSERT_ACK = 1'b1;
always@(*)begin r_hndshk_state_nxt = r_hndshk_state; r_ack_nxt = 1'b0; t_data_rclk_nxt = t_data_rclk; case(r_hndshk_state)  IDLE_R:begin   if(t_rdy_rclk)begin    r_hndshk_state_nxt = ASSERT_ACK;    t_data_rclk_nxt = t_data;    r_ack_nxt = 1'b1;   end  end
  ASSERT_ACK:begin   if(!t_rdy_rclk)begin    r_hndshk_state_nxt = IDLE_R;    r_ack_nxt = 1'b0;   end   else begin    r_ack_nxt = 1'b1;   end  end
 endcaseend
always@(posedge rclk or negedge reset_rclk)begin if(!reset_rclk)begin  r_hndshk_state <= IDLE_R;  t_data_rclk <= 1'b0;  t_rdy_rclk <= 1'b0;  r_ack <= 1'b0; end
 else begin  r_hndshk_state <= r_hndshk_state_nxt;  t_data_rclk <= t_data_rclk_nxt;  t_rdy_rclk <= t_rdy;  r_ack <= r_ack_nxt; endend
endmodule

握手机制的缺点

一个字:慢。

好了,希望本文对大家有所帮助。

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数字电路
    +关注

    关注

    193

    文章

    1601

    浏览量

    80513
  • 代码
    +关注

    关注

    30

    文章

    4753

    浏览量

    68369
  • 脉冲信号
    +关注

    关注

    6

    文章

    396

    浏览量

    36920

原文标题:谈谈数字芯片中的握手协议

文章出处:【微信号:IP与SoC设计,微信公众号:IP与SoC设计】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    自制PD转多协议快充充电线

    和我的手机握手3A以上的电流。 我又买了一个充电宝,它支持UCFS融合快充,也能和我的手机握手PPS(9V/4A)的充电功率。 酷态科的这款充电宝C口可以和我的vivo
    的头像 发表于 09-29 16:20 349次阅读
    自制PD转多<b class='flag-5'>协议</b>快充充电线

    快充协议方案应用场景

    快充协议诱骗原理主要依赖于快充协议芯片与供电端(如PD充电器)之间的握手通信,以申请所需要的电压与电流,确保充电过程安全、快速且高效。
    的头像 发表于 09-07 11:12 502次阅读
    快充<b class='flag-5'>协议</b>方案应用场景

    PD快充协议 XSP16快充协议方案

    PD协议握手过程涉及设备之间的通信,以确定可用的电源配置和协商最佳的充电或供电参数。握手过程以确保设备能够安全、 有效地获取所需的电力,同时保护设备免受过载或不当供电的影响。
    的头像 发表于 08-25 09:45 696次阅读
    PD快充<b class='flag-5'>协议</b> XSP16快充<b class='flag-5'>协议</b>方案

    简述TCP协议的三次握手机制

    TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它主要用于在IP网络中进行数据传输。TCP协议的三次握手
    的头像 发表于 08-16 10:57 693次阅读

    Esp8266与SSL REST的连接失败,并显示“客户端握手失败”,为什么?

    Esp8266 与 SSL REST 的连接失败,并显示“客户端握手失败”
    发表于 07-12 07:43

    编写了一个简单的SSL应用程序,用于向服务器发送HTTPS请求,SSL握手失败的原因?

    我编写了一个简单的SSL应用程序,用于向服务器发送HTTPS请求。在数千个请求之后,应用程序在握手期间崩溃: 客户端握手开始。 型号:M 1032 致命异常 29
    发表于 07-10 08:05

    揭秘USB报文的结构与运作机制

    握手包在一个字节的数据字段后由EOP定界如果一个数据包在解码为握手包的情况下,在一个字节后没有以EOP结束,它必须被视为无效并被接收器忽略
    发表于 04-10 10:56 1840次阅读
    揭秘USB报文的结构与运作<b class='flag-5'>机制</b>

    说说TCP三次握手的过程?为什么是三次而不是两次、四次?

    三次而不是两次或四次。 首先,我们需要了解TCP是一种面向连接的协议。在进行数据传输之前,发送端和接收端需要建立一个可靠的连接。TCP三次握手就是用来建立这个连接的过程。 三次握手的过程如下: 第一步:发送端向接收端发送一个SY
    的头像 发表于 02-04 11:03 626次阅读

    TCP协议连接的三次握手

    通过三次握手,客户端与服务端能够确保彼此的网络连接是可用的。客户端发起的SYN报文和服务端返回的SYN+ACK报文都包含了对方的初始序列号和通信能力信息,通过互相确认这些信息,双方确认彼此的能力和正确性。
    的头像 发表于 02-03 16:44 1310次阅读
    TCP<b class='flag-5'>协议</b>连接的三次<b class='flag-5'>握手</b>

    TCP和UDP协议有什么区别?如何通过网关实现TCP协议通信?

    TCP协议是一种面向连接的、可靠的、基于字节流的传输层通信协议,能够保证数据从发送方到达接收方,是物联网领域常见的通信协议之一。 TCP是面向连接的,所以在开始传输数据前要先经历三次握手
    的头像 发表于 01-24 11:07 572次阅读
    TCP和UDP<b class='flag-5'>协议</b>有什么区别?如何通过网关实现TCP<b class='flag-5'>协议</b>通信?

    浅谈 POE 握手协议

    生活中,我们会接触到很多电子类产品,而它们都离不开供电,供电的方式多样。 今天我们就来介绍一种别样的供电方式:POE 供电。 POE(Power Over Ethernet),即通过网线由 PSE(Power Souring Equipment)端设备向 PD(Power Device)端设备供电。 现在越来越多的应用都采用 POE 供电,比如我们常见的 POE 供电设备---POE 交换机,以及受电端设备---无线 AP,IP 摄像头以及 IP 电话等。 那为何这么多应用都采用 POE 供电呢? 主要是因为 POE 供电有如下几点优势: 简化布局
    的头像 发表于 12-12 09:06 1084次阅读
    浅谈 POE <b class='flag-5'>握手</b><b class='flag-5'>协议</b>

    【芯片设计】握手协议的介绍与时序说明

    最早接触到握手协议是在校期间学习PCIe的AXI总线时,至今日虽然PCIe的结构已经忘得一干二净,但握手协议经过不断的使用还算掌握的不错。
    的头像 发表于 12-11 14:11 3006次阅读
    【芯片设计】<b class='flag-5'>握手</b><b class='flag-5'>协议</b>的介绍与时序说明

    握手型接口的同步FIFO实现

    按照正常的思路,在前文完成前向时序优化和后向时序优化后,后面紧跟的应该是双向时序优化策略了,不过不急,需要先实现一下握手型同步FIFO。
    的头像 发表于 12-04 14:03 679次阅读
    <b class='flag-5'>握手</b>型接口的同步FIFO实现

    Valid-Ready握手协议的介绍与时序说明

    "Valid-Ready" 握手协议是一种常用于数字电路中的接口协议,用于控制数据的传输和处理。
    的头像 发表于 12-04 10:37 1419次阅读
    Valid-Ready<b class='flag-5'>握手</b><b class='flag-5'>协议</b>的介绍与时序说明

    valid-ready握手协议和enable-xoff协议对比

    这一篇主要对比下valid-ready握手协议和enable-xoff协议,当然这个对比仅限于同时钟域下的信号传输。
    的头像 发表于 12-04 10:32 742次阅读
    valid-ready<b class='flag-5'>握手</b><b class='flag-5'>协议</b>和enable-xoff<b class='flag-5'>协议</b>对比