當 clock domain A 產生資料要交給 clock domain B 時, 我們以前常用的技巧如附圖。clock domain A 產生一個 Ready_pulse, 於是 Flag 會變成 High。
ready_pulse.JPG
 
而 clock domain B 發現 Flag 成為 High 後, 就可以放心的取走 Parallel Data, 然後產生一個 Ack_pulse, 將 Flag 清除。
 
然而, 這個電路有一個容易出錯的地方, 如果 Ack_pulse 的產生的方法為:
    Ack_pulse <= Flag;
 
若 clock domain B 發生 reset, 而 clock domain A 仍在運作, 那就有可能在 clock domain B 仍未完成 reset 時, 發生了幾個 Ready_pulse 未被處理, 造成 Flag 為 High。等到 clock domain B 完成 reset 後, Ack_pulse 就會永遠為 High (而不是我們期待的 rising edge), 於是形成 dead lock。
 
有名的 Verilog 大師 Clifford E. Cummings 比較建議的用法, 是 clock domain A 產生 toggle 信號來通知 clock domain B。這兩種方法各有適用的場合, 請參考 Clifford E. Cummings 論文。這兩種方法我們的 library 都有, 敝人建議盡量以 toggle 機制為優先改慮。
 
by louis
創作者介紹
創作者 數位之牆 的頭像
louis99

數位之牆

louis99 發表在 痞客邦 留言(1) 人氣( 2897 )