バッファ長

相変わらず細々と思考実験を繰り広げています。今回は、バッファ長について書いておきます。

TRX-305のDSPが使うバッファには3種類有ります。一つはRX-IFデータをSPORTから受取るDMAバッファ。次はAFデータをSPORTから送り出すDMAバッファ。最後がRX-IFとAFの間のジッターを吸収するFIFOです。

DMAバッファ長

TRX-305はBlackfinのSPORTを介してFPGAからRX-IFデータを送り、また、FPGAにAFデータを返すことをすでに説明しました。送受のサンプル周波数は等しく、同期しています。しかしながら、1サンプル辺りのデータサイズが異なるため、それぞれは異なる速度で動いています。では、DMAを使うとして、バッファサイズはどのようにすれば良いのでしょうか。

結論からすれば、送受のDMAサイズはそれぞれの事情で決めてしまってかまいません。受信側では復調モードに応じてギアチェンジが起きますが、復調後のデータ速度は形式に寄らず一定です。逆に、復調後のデータ速度が一定になるようにRX-IFの速度がギアチェンジしていると言ってもかまいません。復調後のデータ速度は一定でかつAFの送信速度と同じですから、バッファサイズがどうであれ、長期的には同期しています。

ざっくりとしたところですが、AFデータを格納する送信DMAバッファは長めにとって良いでしょう。8サンプル分のバッファを確保するとすると、1サンプルはおおよそ1/31kHzですから、DMAの周期は約250μSとなります。ITRONがいくら重いといえども、400MHzのDSPとしては気にならないオーバーヘッドになるはずです。

RX-IF受信データを格納する受信DMAバッファは少し匙加減が重要です。ここはワイドFMモードの時に8倍のオーバーサンプルになるため、データ転送速度が一気に増えます。その増えた分による割り込み発生頻度の上昇を無理に抑えようとしてバッファ長を大きくすると、RX-IFが非ワイドFMモードになったとき、割り込み発生間隔が長くなりすぎるかも知れません。

具体的に言えば、DMAバッファの長さが同じ時、非ワイドFMモードの割り込み周期はワイドFMモードのそれの4倍になります。仮にワイドFMモードのDMAバッファを2サンプル分確保すると、割り込み周期はおおよそ120uSであり、対応する非ワイドFMモードの割り込み周期はおおよそ500uSとなります。

全体としてみたとき、これは送受DMAによる遅延が0.75mS程度発生することになります。これは音声通信としては問題にならないと思われます。おそらく、SSBの復調に供するフィルタのほうが大きな遅延となるでしょう。

しかしながら、CWにおいてサイドトーンを受信機側で作り出すとすると、この遅延がどのくらい効いてくるかは少し検討が必要かもしれません。これは作ってみないとわからない種類のことです(もっとも、こういった場合の遅延はXX以下にせよという研究結果がすでにあるかもしれません)。私は最初から最適化するのが嫌いなタイプの人間です。まず、安定して動くように作る。次に必要に応じて最適化する、という手法が好きです。DMAバッファについても最初は安定動作を目指し、遅延の最適化は後に回します。

FIFOバッファ長

RX-IFデータとAFデータの周期は同期しているものの、不可避的にジッターが入ることはすでに説明しました

説明したジッターはデータのアライメントに起因するもので有り、これは基本的に電源投入後1度だけしかおきません。また、起きる場合にも最大で1サンプル分しかずれません。ではその1サンプルを吸収できれば済むかというと、決してそうではありません。

一つには、Blackfin DMAのプリフェチFIFOによる先読みジッターがあります。このFIFOは送信DMA転送時にバスの取り合いによってデータが遅れることを嫌って設けられているものです。これによって動作は大変安定しますが、代わりに送信DMA割り込みが、実際の送信よりもFIFO分早く発生するという問題があります。当然、これはジッターとなりますのでバッファで吸収しなければなりません。

プリフェッチによるジッターは一度しか発生しませんが、面倒な話になりますのでここではさらっと流すだけにして、実際の検討は後日とします。

さて、TRX-305のジッター吸収FIFOを考える上で一番考慮しなければならないのは先の「ギヤチェンジ」です。何度も書いていることですが、RX-IFから流れ込んでくるデータの速度はワイドFMモードと非ワイドFMモードで異なります。この速度差は、復調器出口でのサンプル速度を一定にするためのものですので、出口での速度あわせは不要であると述べました(繰り返しますが、すでに述べたジッター対策は必要です)。

ところが、この速度差によってすでに述べたようにDMAの発生周期が変わります。DMAはデータをまとめて転送する技術ですから、DMAの周期が変わると言うことは、一度にまとめて入ってくるデータのサンプル数が変わると言うことです。言い換えると、FIFOにまとめ書きされる数が変動するのです。

ここでワイドモードのDMAバッファの長さを、2 AFサンプル相当と仮定しましょう。そうすると、FIFOには2 AFサンプル周期で2サンプルずつまとめ書きされます。ところが、非ワイドFMモードに切り替えると、これが8 AFサンプル周期で8サンプルずつまとめ書きとなります。一方で、AF送信側は独自のDMAバッファの長さに基づき、淡々とDMA転送を続けます。そのため、FIFO内部のデータ長は常に変動します。

まとめ

TRX-305用のDSPには3つのバッファを使うことになります。このうち、DMAバッファは割り込み周期から決めることになります。また、ジッター吸収用のバッファが必要になります。このサイズはデータのアライメント、DMAのプリフェッチ、DMAバッファによる割り込み粒度を考慮して決める必要があります。

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください