非同期FIFOを使った非同期クロック間転送

[] [] []


非同期FIFOを使えば簡単に非同期クロック間転送ができる。

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

FIFOemptyでなくなったらすぐに読み出しを開始すればよい。

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

だから、

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

逆に、

 連続してNワード書き込むのに必要なFIFOの深さ = N * (fWCLK - fRCLK)/ fWCLK

となる。

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

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

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

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

とすればよい。

上記(i)と同様に

 FIFOが空になるまでの時間 = nDEPTH /(fRCLK - fWCLK)

だから、

 連続して読み出せる最大ワード数 = nDEPTH * fRCLK/(fRCLK - fWCLK)

逆に、

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

となる。

(iii) リードとライトが同じ速度のとき (fWCLK fRCLK)

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

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

とすればよい。

FIFOが半分たまってから読み出しを開始した場合、リードとライトの速度のノミナル値をf、差をfとおくと

 FIFOが空またはフルになるまでの時間 = nDEPTH /(2f)

だから、

 連続して読み出せる最大ワード数 = nDEPTH * f/(2f)

逆に、

 連続してNワード書き込みと読み出しができるのに必要なFIFOの深さ = N * (2f)/ f

となる。


[] [] []