非同期FIFOを使ったCDC転送
非同期FIFOを使えば簡単に多ビットのCDC転送ができる。このとき必要なFIFOの深さは次のように設計すればよい。
◇
(1) ライトがリードより速いとき (fWCLK > fRCLK)
FIFOがemptyでなくなったらすぐリード開始すればよい。
FIFOがオーバーフローするまでの時間 =nDEPTH /(fWCLK - fRCLK)
だから
連続してライトできる最大ワード数 = nDEPTH * fWCLK/(fWCLK - fRCLK)
逆に
連続してNワードをライトするのに必要なFIFOの深さ = N * (fWCLK - fRCLK)/ fWCLK
となる。
◇◇
(2) リードがライトより速いとき (fWCLK < fRCLK)
連続してリードできるためにはFIFOがfullになってからリードを開始すればよいが、本当にfullになるまで待っていると、リードを開始する前に次のライトがされてしまうかもしれないので、fullになる少し前の状態(almost full)を検出する必要がある。
これはfullの判定条件を少し変えて
ライト側でFIFOにNワード空きがある条件(almost full): wadr[AW:0]+N=={~radr[AW] ,radr[AW-1:0]}
とすればよい。
上記(1)と同様に
FIFOがemptyになるまでの時間 = DEPTH /(fRCLK - fWCLK)
だから
連続してリードできる最大ワード数 = nDEPTH * fRCLK/(fRCLK - fWCLK)
逆に
連続してNワードリードするのに必要なFIFOの深さ = N * (fRCLK - fWCLK)/ fRCLK
となる。
◇◇◇
(3) リードとライトがほぼ同じ速さのとき (fWCLK ≒ fRCLK)
連続してライトとリードができるためには、FIFOにある程度たまった状態(almost empty)を検出してリード開始する必要がある。これはemptyの判定条件を少し変えて
リード側でFIFOにNワードたまっている条件(almost empty): wadr[AW:0]==radr[AW:0]+N
とすればよい。
FIFOが半分たまってからリード開始した場合、リードとライトのレートのノミナル値をfCLK、差をΔfCLKとおくと
FIFOがemptyまたはfullになるまでの時間 = nDEPTH /(2ΔfCLK)
だから
連続してリードできる最大ワード数 = nDEPTH * fCLK/(2ΔfCLK)
逆に
連続してNワードのライト/リードができるのに必要なFIFOの深さ = N * (2ΔfCLK)/ fCLK
となる。