• 正文
    • 什么是握手協(xié)議
    • 為什么要握手
    • 握手機(jī)制的原理
    • 握手機(jī)制的代碼實(shí)現(xiàn)
    • 握手機(jī)制的缺點(diǎn)
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

談?wù)剶?shù)字芯片中的握手協(xié)議

2024/05/13
1.7萬
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

本文版權(quán)歸本公眾號(hào)所有。

 hi大家好,最近工作實(shí)在是太忙了,今天終于有時(shí)間更新一下公眾號(hào)。雖然現(xiàn)在上海仍處于疫情的中心,但是對(duì)于芯片設(shè)計(jì)行業(yè)影響并不大,項(xiàng)目一個(gè)接一個(gè)。同時(shí)希望大家在出行的時(shí)候保護(hù)好自己,注意安全,千萬別“中招”哦。

什么是握手協(xié)議

說起握手,首先查了一下百度百科。握手是一種禮儀,起源于中世紀(jì)的歐洲,順序?yàn)殚L幼有序,女士優(yōu)先。(PS:所以握手的時(shí)候,男士記得要紳士一點(diǎn)哦)。    

在芯片中,握手是最古老的跨時(shí)鐘域之間傳輸數(shù)據(jù)的方式。握手機(jī)制通過將脈沖信號(hào)展寬,待輸出一側(cè)檢測(cè)到信號(hào)并將其解析為脈沖信號(hào)后,再向輸入一側(cè)發(fā)送應(yīng)答信號(hào),表明接收到信號(hào)并且傳輸完成。

為什么要握手

在人類的進(jìn)化史中,握手作為一種善意的表達(dá)方式,可以增進(jìn)人與人之間的和諧。言歸正傳,那么數(shù)字電路中為什么也需要握手機(jī)制呢?這是因?yàn)樵跀?shù)字電路中,跨時(shí)鐘域處理是個(gè)較為常見的問題。關(guān)于跨時(shí)鐘域,我們公眾號(hào)之前有介紹過,想復(fù)習(xí)一下的同學(xué)可以查看一下之前寫的文章。

在從快時(shí)鐘向慢時(shí)鐘傳遞時(shí),由于輸入信號(hào)變化較快,輸出一側(cè)可能跟不上輸入的變化,從而導(dǎo)致“漏采“現(xiàn)象。由于兩個(gè)時(shí)鐘之間的頻率不同,來自快時(shí)鐘域的脈沖信號(hào),還沒來得及被慢時(shí)鐘的采到,便轉(zhuǎn)瞬即逝,從而導(dǎo)致信號(hào)被漏采。此時(shí),握手機(jī)制便可以大顯神通。

握手機(jī)制的原理

(1)發(fā)送端在t_clk時(shí)鐘域下將需要發(fā)送的數(shù)據(jù)準(zhǔn)備好后,將t_rdy信號(hào)置為有效,該信號(hào)必須在tclk下降沿輸出。接收端在rclk時(shí)鐘域下同步r_rdy信號(hào),同步后的信號(hào)命名為t_rdy_rclk。

(2)接收端在t_rdy_rclk有效期間,對(duì)t_data進(jìn)行采樣,得到t_data_rclk。

(3)接收端將r_ack信號(hào)置為1,信號(hào)必須在rclk下降沿輸出。發(fā)送端將r_ack同步為r_ack_tclk。

至此,已經(jīng)完成“半握手”,發(fā)送端在輸出下一數(shù)據(jù)前,不會(huì)等到r_ack_tclk被置為0。半握手機(jī)制工作速度快,但是使用不當(dāng)有可能會(huì)導(dǎo)致操作錯(cuò)誤。然而,如果要從高頻時(shí)鐘向低頻時(shí)鐘傳輸數(shù)據(jù),則需要采用全握手機(jī)制。

(4)當(dāng)r_ack_tclk為高電平時(shí),發(fā)送端將t_rdy置為0。

(5)當(dāng)t_rdy_rclk為低電平時(shí),接收端將r_ack置為0。

(6)當(dāng)r_ack_tclk為低電平時(shí),發(fā)送端將t_rdy重新置為1發(fā)送端可以發(fā)送新的數(shù)據(jù)。

至此,全握手完成。顯然,全握手過程耗時(shí)較長,數(shù)據(jù)傳輸較慢。但是全握手機(jī)制穩(wěn)定可靠,可以在兩個(gè)任意頻率的時(shí)鐘域中安全地進(jìn)行數(shù)據(jù)傳輸。需要注意一點(diǎn)的是,數(shù)據(jù)應(yīng)該在發(fā)送時(shí)鐘域內(nèi)穩(wěn)定至少兩個(gè)時(shí)鐘上升沿,請(qǐng)求信號(hào)req的寬度應(yīng)該超過兩個(gè)時(shí)鐘周期,否則從高速時(shí)鐘向低速時(shí)鐘傳遞可能無法捕捉到該信號(hào),也就是信號(hào)“失聯(lián)”了。

握手機(jī)制的代碼實(shí)現(xiàn)

發(fā)送端狀態(tài)機(jī)

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 

接收端狀態(tài)機(jī):

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

握手機(jī)制的缺點(diǎn)

 一個(gè)字:慢。

好了,希望本文對(duì)大家有所幫助。疫情期間,請(qǐng)多注意防護(hù)~

參考文獻(xiàn):https://blog.csdn.net/qq_39814612/article/details/105795252

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計(jì)資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄