3.2 結繩法
由於雙鎖存器法在快時鐘域向慢時鐘域過渡中可能存在採樣失效的問題,我們引入了一種安全的跨時鐘域的方法:結繩法。結繩法適合任何時鐘域的過渡(clk1,clk2的頻率和相位關係可以任意選定),如圖4所示。
圖4中的_clk1表示該信號屬於clk1時鐘域,_clk2的信號表示該信號屬於clk2時鐘域。在兩次src_req_clk1之間被src_vld_clk1結繩(Pluse2Toggle)。將src_vld—clk1用雙鎖存器同步以後,該信號轉換為dst_req_clk2(Toggle2Pluse)。同理,用dst_vld_clk2將dat_req_clk2結繩,dst_vld_clk2表明在clk2時鐘域中,src_dat_clk1已經可以進行正確的採樣了。最後將dst_vld_clk2轉換為dst_ack_clk1(Synchronizer and Toggle2Pluse)。dst_ack_clk表明src_dat_clk1已經被clk2正確採樣了,此後clk1時鐘域就可以安全地傳輸下一個數據了。可以看出,結繩法的關鍵是將信號結繩以後,使其保持足夠長的時間,以便另一個時鐘可以正確採樣。圖5描述了結繩法的具體實現,主要包括3個基本單元:Pluse2Toggle、Synchronizer和Toggle2Pluse。
Pluse2Toggle模塊負責將兩個脈衝信號結繩,即將單脈衝信號延長;Synchronizer模塊用雙鎖存器法將得到的信號過渡到另一個時鐘域;Toggle2Pluse模塊與Pluse2Toggle功能相對,即將延長的脈衝信號還原為單脈衝,這裡用到了異或門。整體的設計思想就是用Pluse2Toggle將信號延長,用Synchronizer過渡,再用Toggle2Pluse還原,以保證另一個時鐘域可以正確採樣,而接收方用相反的流程送迴響應信號。
結繩法可以解決快時鐘域向慢時鐘域過渡的問題,且適用的範圍很廣。但是結繩法實現較複雜,在設計要求較高的場合應該慎用。
4 結束語
本文主要把FPGA異步時鐘設計中產生的問題,原因以及解決問題所採用的同步策略做了詳細的分析。其中雙鎖存器法比較適用於只有少數信號跨時鐘域;結繩法比較適用快時鐘域向慢時鐘過渡的情況。所以,在實際的應用中,應根據自身設計的特點選擇適當的同步策略。