Verilog設計Valid-Ready握手協議


轉自http://ninghechuan.com

 

我不生產知識,我只是知識的搬運工。

Handshake Protocol握手協議!為了保證數據傳輸過程中准確無誤,我們需要加上握手信號來控制信號的傳輸。本篇文章使用Verilog設計一個簡單的Valid-Ready握手協議電路。

為了保持數據的傳輸,通常使用握手信號。握手協議的原則是:

當Valid和Ready信號同時高有效時,數據在時鍾上升沿傳輸。

image

本設計可以實現數據的流入和數據的流出,這樣一個雙端口握手協議通道傳輸。

對於Valid和Ready信號的原理類似於FIFO的讀寫和空滿信號,就好像FIFO外邊包了一層。

image

在FIFO的端口信號上加上如上圖所示反相器,也可達到握手的效果。

Valid-Ready信號產生有兩種情況。

Ready-Before-Valid

Ready-Before-Valid是Ready信號在Valid信號之前有效。如下時序圖。

image

這樣設計使得在數據來臨之前,通道已准備好接收數據,可以保持通道的最大吞吐量,因為Ready先產生,這個通道保持刷新等待數據。通道作為接受數據端采用這樣的設計。

Valid-before-Ready

Valid-before-Ready是Valid信號在Ready信號之前有效。通道作為數據輸出端采用這樣的設計。收到下游接收端的准備接收信號,才開始吧傳輸數據。

image

Valid-Ready協議’Stalemate’情況

Stalemate可以理解為“鎖住”。假設我們不遵守上面兩種接收端和輸出端的設計規則。

輸出端用Ready-Before-Valid而接受端使用Valid-before-Ready,就會出現輸出端等待接受端給出的Ready來輸出數據,但是接收端也在等待輸出端給出Valid信號來接受數據。兩者都在等待卻沒有一方先給,所以這個時候這個通道就是無效的,被“鎖住”了。

管道停止傳輸的情況

image

管道傳輸空的情況

image

握手協議的幾種連接情況

靈活連接

image

image

image

Verilog設計

image

前面說過握手協議的接口可以在同步FIFO的基礎上加以修改,修改電路如圖。

assign valid_o = ~fifo_empty; assign ready_o = ~fifo_full; assign wr_en = ready_o & valid_i; assign rd_en = ready_i & valid_o; 

這是加了緩存后的設計,也可以直接傳輸不加緩存直出。

image

電路如圖

module Handshake_Protocol( input clk, input rst_n, //upsteam  input valid_i, output ready_o, //downsteam  output valid_o, input ready_i, //data  input din, output reg dout ); reg full; wire wr_en; always @(posedge clk or negedge rst_n)begin if(rst_n == 1'b0)begin dout <= 0; full <= 0; end else if(wr_en == 1'b1)begin if(valid_i == 1'b1)begin full <= 1; dout <= din; end else begin full <= 0; dout <= dout; end end else begin full <= full; dout <= dout; end end assign wr_en = ~full | ready_i; assign valid_o = full; assign ready_o = wr_en; endmodule //更剩資源的寫法 module Handshake_Protocol( input clk, input rst_n, input valid_i, //from pre-stage  input data_i, //from pre-stage  input ready_i, //from post-stage  output ready_o,//to pre-stage  output valid_o, //to post-stage  output data_o //to post-stage ); reg valid_o_r; reg data_o_r; always @(posedge clk) if(~rst_n) valid_o_r <= 1'b0; else if(valid_i) valid_o_r <= 1'b1; else if(~valid_i) valid_o_r <= 1'b0; always @(posedge clk) if(~rst_n) data_o_r <= 1'b0; else if(valid_i) data_o_r <= data_i; assign ready_o = ready_i; assign valid_o = valid_o_r; assign data_o = data_o_r; endmodule 

Reference

Using the Valid-Ready pipeline protocol ——ZIPcores.com

Data Transfers Synchronous handshake ——Giorgos Dimitrakopoulos

https://stackoverflow.com/questions/53583946/valid-ready-handshake-in-verilog

https://filebox.ece.vt.edu/~athanas/4514/ledadoc/html/pol_cdc.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM