1. 程式人生 > >跨時鐘域處理-握手機制

跨時鐘域處理-握手機制

採用握手機制:傳送域現將資料鎖存在總線上,隨後傳送一個req訊號給接受域;接受域在檢測到req訊號後,鎖存匯流排資料,並送回一個有效的ack訊號表示讀取完成應答;檢測到應答訊號ack後,撤銷req訊號,接受域在檢測到req撤銷後也相應撤銷ack訊號,完成一次正常的握手訊號。

module handshake(
        input clk,                 //50MHZ時鐘
        input rst_n,               //復位訊號
        input req,                //資料傳送請求訊號
        input [7:0]data_in,        //資料輸入
        output reg ack,            //應答訊號
        output [15:0]data_out
);

reg req1,req2,req3;                //req輸入同步訊號
reg [15:0]data_in_r;                //輸入資料暫存器
wire pos_req1,pos_req2;
//---------通過三級暫存器同步非同步輸入訊號req--------
[email protected]
(posedge clk or negedge rst_n)begin if(!rst_n)begin req1 <= 1'b0; req2 <= 1'b0; req3 <= 1'b0; end else begin req1 <= req; req2 <= req1; req3 <= req2; end end //--------------檢測req1、req2的上升沿--------------- assign pos_req1 = req1 && ~req2; assign pos_req2 = req2 && ~req3; //----------在檢測到pos_req1上升沿時,鎖存資料-------
[email protected]
(posedge clk or negedge rst_n)begin if(!rst_n)begin data_in_r <= 16'd0; end else begin if(pos_req1)begin data_in_r <= data_in; end end end assign data_out = data_in_r; //----------在檢測到pos_req2上升沿時,發出ack應答訊號,表示資料已經鎖存------- //----------檢測req訊號,如果req訊號取消,則ack也取消-----------------------
[email protected]
(posedge clk or negedge rst_n)begin if(!rst_n)begin ack <= 1'b0; end else begin if(pos_req2)begin ack <= 1'b1; end else if(!req)begin ack <= 1'b0; end end end endmodule