在進行FPGA開發的時候,經常會用到,幾個模塊之間的鏈接與嵌套這個時候就需要保證數據准確無誤的傳輸,那么我們就需要加上握手信號來控制信號的傳輸。特別是在通信中的同步,會經常的用到這些握手信號,握手協議的原則是:當Valid 和 Ready信號同時高有效時,數據在時鍾的上升沿傳輸。在新版本的Xilinx的FPGA中好多IP核都是基於此種握手協議來傳輸的。特別是在學到AXI的時候,不至於太吃力。類比於生活中的接力賽跑運動員之間的接力棒傳遞,有利於更好的理解握手協議。
端口名稱解釋:
clk : 輸入端口,上升沿有效。
data_in:輸入信號,輸入數據。
datain_val:輸入信號,表明該模塊的上流有有效的數據發送過來,高電平有效。
datain_rdy:輸出信號,表明該模塊已經准備好接受來自上流模塊的數據。高電平有效。
data_out :輸出信號,輸出的是數據。
dataout_val;輸出信號,表明該模塊有有效數據要輸出。
dataout_rdy:輸出信號,表明該模塊有做好了數據輸出的准備。
轉化為幾個模塊的鏈接形式更容易理解:
那么先從最基本的開就是兩個模塊之間的數據傳輸:
從圖中可以看出:當發送端的有效發送數據到來的時候,也就是VALID拉高的時候data開始輸出有效的數據,在上圖中雖然發送端的數據有效發出但是接收端並沒有准備好接受第一幀數據,所以上圖中,接受端只會有效的接收到第二幀和第三幀數據(word2和word3)。
如圖所示,只有紅色虛線標注的兩個時鍾上升沿,接收端才能接收到有效的數據。
握手信號的三種類型:
第一種是Valid-before-Ready,就是說valid信號是在Ready信號之前有效,這種通道一般作為數據的輸出端的設計。在收到下游模塊的READY信號之后,才開始傳輸數據。第三種是Ready-Before-Valid信號一般作為接收端的模塊,這樣的設計在數據來臨之前,通道就已經做好了接收數據的准備,可以保持通道的最大吞吐量。因為READY信號產生,這個通道保持刷新等待數據。通道作為接收端的使用。
Valid-Ready協議'Stalemate'情況:
Stalemate可以理解為“鎖住”。假設我們不遵守上面兩種接收端和輸出端的設計規則。輸出端用Ready-Before-Valid而接受端使用Valid-before-Ready,就會出現輸出端等待接受端給出的Ready來輸出數據,但是接收端也在等待輸出端給出Valid信號來接受數據。兩者都在等待卻沒有一方先給,所以這個時候這個通道就是無效的,被“鎖住”了。
例子:
可以實現數據的流入和數據的流出,這樣一個雙端口握手協議通道傳輸。對於Valid和Ready信號的原理類似於FIFO的讀寫和空滿信號,就好像FIFO外邊包了一層。也就是在FIFO的端口信號上加上如下圖的方向器。可以實現一個簡單的握手協議。
在此圖的基礎上升級一下:其中FIFO相當於中間數據的一個緩存。
端口的代碼實現:
1 assign valid_o = ~fifo_empty; 2 assign ready_o = ~fifo_full; 3 assign wr_en = ready_o & valid_i; 4 assign rd_en = ready_i & valid_o;
先到這里吧,下一次用這種方法做個實例看看效果,也注意一下細節,各位多多指教。