↓具体的にはこのブロック図のように、EZ-USB FX2LPのCPU 8051を介さずにデータを流したい.USB経由でPCから大量のincrementalデータをバルク転送して、FIFOにブタ積みします.FIFOが満杯になると(512BYTE)自動的に出力し、、、を繰り返します.
ところが、いざやってみようとするとわからないことがたくさんありました.
●FIFOとGPIFの繋ぎ込みは具体的にどうなってるんだろう?
●EP2,EP4,EP6,EP8のうちEP2をGPIFに接続するのはどうやってるのか?
●FIFOのポインタを進行させるのは誰がトリガしてるの?
●FIFOの読み出しレートはどうやって設定すればいいの?
↓FX2LPを動かしてみて、こういう構造になっているんだとわかりました.OUTだけですが.
各信号の意味は、、、
●FD[7:0]はFIFOデータ出力です.16bitにも変更できます.FDはGPIFを通過しません.
●FEは、FIFO Emptyの意味で、FIFOがGPIFへ与えます
●FFは、FIFO Fullの意味で、FIFOがGPIFへ与えます
●enは、FIFOのポインタを進める信号です
●RDY0は、enの源信号とも言える信号で、要するにFD[7:0]のデータレートを決定しています.
(ここでは、GPIFが出力する30MHzを2^12分周した7324HzをRDY0とした)
●CTL0は、データ出力したぞというモニタ信号です
(RDYとCTLは、各数本用意されていて、わたしは各1本しか使わなかった)
●FIFOが空っぽになったらFDを止めなくてはイケナイ.それは次のアルゴリズムでenを生成することで実現する.つまり、FIFOが空ならFIFOポインタを止める.非RDY0ならFIFOポインタを止める.
if (!FE & RDY0) en=1; else en=0; ①
●①のアルゴリズムは変更可能で、GPIF Designerで編集する
以上がわかったので、わたしはほぼ納得できました.
----
上記についての補足的説明です.
<その1>
FD[7:0]は外部ポートPB[7:0]に出力されます.(固定)
FD[15:8]は外部ポートPD[7:0]に出力されます.(固定)
FD[7:0]つまり8bitバスか、FD[15:0]つまり16bitバスを選択可能です.
だとすると、8bitバスで使うならば、PD[7:0]は空きますから、PD[7:0]をuser PORTとして使えるとばかり思っていたのですが、やってみたところどうもそうではないらしい.8bitバスと設定したにも関わらず、PD[7:0]にもデータが出力され続ける構造になっている、というのがわたしの経験から知り得たコトです.無用な期待はしない方がよいらしい.
訂正: この連載24号で書きますが、Ref. manualを読んでここの動作が判りました.結論から言うと、FD[7:0]の8bitバスの時には、PD[7:0]をuser PORTとして利用できます.ただし、4つのFIFO全てが8bitバスに設定されているコトがその条件です.一つでも16bitバスに設定されているとPDはuserに開放されません.というか、4つのFIFOそれぞれ独立に8bit/16bitを設定できるんだ?
訂正: この連載24号で書きますが、Ref. manualを読んでここの動作が判りました.結論から言うと、FD[7:0]の8bitバスの時には、PD[7:0]をuser PORTとして利用できます.ただし、4つのFIFO全てが8bitバスに設定されているコトがその条件です.一つでも16bitバスに設定されているとPDはuserに開放されません.というか、4つのFIFOそれぞれ独立に8bit/16bitを設定できるんだ?
<その2>
FEとFFは、①の条件判断文では、どちらか片方しか使えません.後述するGPIF Designerの条件文編集画面でFIFOFlagという信号が出てきますが、次のようにレジスタであらかじめ選択されているからです.
FIFOFlag = EP2GPIFFLGSEL[1:0]==0 ? PF :
EP2GPIFFLGSEL[1:0]==1 ? FE :
EP2GPIFFLGSEL[1:0]==2 ? FF : Reserved ;
<その3>
GPIFへEP2を接続するのはどうしてるのか?
別記事で解説しますが、レジスタ設定のこの文がその役目をしてると思う.
EP2GPIFTRIG = 0xFF; // start ep2
これって、同時にEP4,EP6,EP8をstartしちゃったらどうなるのかは知りません.
-------
というところまでわかったので、GPIF Designerの使い方へ話題が移ります.GPIF Designerの基本的な使い方は過去記事に書いたので省略します.
↓ブロックダイヤグラムはこうします.CLK30MHz、FD[7:0]、RDY0、CTL0、が設定のポイントです.
↓波形編集画面をこのように設定します.ピンクのデータと黄色のデータは、N番目とN+1番目のデータという意味です.Data波形の上で右クリックすると出てくるメニューでNext FIFO Dataを選ぶと設定できます.CTL0は1データ出力毎に、30MHzの4clock長(133nS)のパルスを出すという意味にしてあります.
↓肝心の条件判断文の設定に移ります.◆の上で右クリックでEdit...を選びます.
↓条件判断文をこのように設定します.FIFOFlagは、別の処でFE(FIFO Empty)がセレクトしてあるので、この条件判断文は、
if (!FE & RDY0) goto S0; else goto S2; ②
goto S0の意味は、次のFIFOデータを出力しろ、という意味です.
goto S2の意味は、なにもしないでS2に留まり続けろ、という意味です.
↓Projectの説明は一旦省きまして、このGPIF Designが期待通りの動作をしたかどうかをチェックします.まずは細かいところから、CTL0(赤線)のパルス幅は、実測で134nSです.計算133nSですからピッタシです.OKOK
↓CTL0の間隔は、FIFOの読み出しレートを意味しています.実測では136uSecと観測されました.設計上はRDY0へ与えた7342Hzがデータレートになっている筈です.7342Hz→136uSecと計算され、実測値とピッタシです.OKOK
↓次はDACの出力波形(青線)を観測しました.CTL0は密度が濃すぎて全面赤色になってます.incrementalデータをFIFOにブタ積みしたので、それをDACから出力すると右上がりのノコギリ波形が観測されるはずです.実測では35,2mSecのノコギリ波でした.計算上は、136uSecで256周期でグルリと一回転しますから、136uSec x 256 = 34.8mSec と計算され、実測とピッタシです.OKOK
↓FIFOにブタ積みするincrementalデータは、PCのアプリが発生させています.このアプリは、16kBYTEを出力し、約1秒休む、を繰り返します.
↓オシロのスイープ速度を遅くして表示させると、FIFOが動いている場面と、FIFOが空っぽで停止している場面を観測できました.FIFOが動いている場面はCTL0がバタついています.2.26Secと実測されました.CTL0がHIGHレベルで止まっているのは約1Secです.
FIFOには16kBをブタ積みします.それを136uSec間隔でDACへ流すのですから、計算では 136uSec x 16k = 2.23Sec と計算されます.実測とピッタシです.OKOK
以上で動作確認はできました.
↓以下はお試しでやってみたコトです.GPIF DesignerのData波形をこのようにします.
↓すると、DataがLOWレベルに凹みます.GPIF Designerでは、LOWレベルはnot valid(De-active Data)の意味です.HIGHレベルはvalid(Active Data)の意味です.このように設定して回路を動かしますと、FD[7:0]に不定が一瞬出ますので、DACの出力波形がしっかりと乱れます.
↓ちなみにここで使ったDACは、R2Rラダー型の8bit DACなので、データのグリッジには素直に反応してしまうのでした.
今宵はここまでにしとうございます.
0 件のコメント:
コメントを投稿