非同期FIFOを使ったCDC転送

[] [] []


非同期FIFOを使えば簡単に多ビットのCDC転送ができる。このとき必要なFIFOの深さは次のように設計すればよい

(1) ライトがリードより速いとき (fWCLK > fRCLK)

FIFOemptyでなくなったらすぐリード開始すればよい。

FIFOがオーバーフローするまでの時間 =nDEPTH /(fWCLK - fRCLK)

だから

連続してライトできる最大ワード数 = nDEPTH * fWCLK/(fWCLK - fRCLK)

逆に

連続してNワードをライトするのに必要なFIFOの深さ = N * (fWCLK - fRCLK)/ fWCLK

となる。

◇◇

(2) リードがライトより速いとき (fWCLK < fRCLK)

連続してリードできるためにはFIFOfullになってからリードを開始すればよいが、本当にfullになるまで待っていると、リードを開始する前に次のライトがされてしまうかもしれないので、fullになる少し前の状態(almost full)を検出する必要がある。

これはfullの判定条件を少し変えて

ライト側でFIFONワード空きがある条件(almost full) wadr[AW:0]+N=={~radr[AW] ,radr[AW-1:0]}

とすればよい。

上記(1)と同様に

FIFOemptyになるまでの時間 = DEPTH /(fRCLK - fWCLK)

だから

連続してリードできる最大ワード数 = nDEPTH * fRCLK/(fRCLK - fWCLK)

逆に

連続してNワードリードするのに必要なFIFOの深さ = N * (fRCLK - fWCLK)/ fRCLK

となる。

◇◇◇

(3) リードとライトがほぼ同じ速さのとき (fWCLK fRCLK)

連続してライトとリードができるためには、FIFOにある程度たまった状態(almost empty)を検出してリード開始する必要がある。これはemptyの判定条件を少し変えて

リード側でFIFONワードたまっている条件(almost empty) wadr[AW:0]==radr[AW:0]+N

とすればよい。

FIFO半分たまってからリード開始した場合、リードとライトのレートのノミナル値をfCLK、差をΔfCLKとおくと

FIFOemptyまたはfullになるまでの時間 = nDEPTH /(2ΔfCLK)

だから

連続してリードできる最大ワード数 = nDEPTH * fCLK/(2ΔfCLK)

逆に

連続してNワードのライト/リードができるのに必要なFIFOの深さ = N * (2ΔfCLK)/ fCLK

となる。


[] [] []