跨時鐘域處理-握手機制
阿新 • • 發佈:2018-12-11
採用握手機制:傳送域現將資料鎖存在總線上,隨後傳送一個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