●RD
RDのドライバのしくみ
※C言語ドライバはFT601プログラマーズガイドに解説されています。ここではイメージレベルで理解して頂ければ大丈夫です
C言語のRDのドライバ抜粋
g_len //任意転送レングス数 ここを可変します
BE_SIZE = 4; //4byte幅(固定)
acWriteBuf //データポインタ
ftStatus = FT_WritePipe(ftHandle, 0x02, (PUCHAR)acWriteBuf, (g_len
* BE_SIZE), &ulBytesWritten, NULL); |
FT_WritePipeのAPIで、指定レングス(32bit幅)のデータを、FTへWrite
FTは、RDが起動される
FPGAは、FTの起動で、RDを実施する
C側のWriteは、FPGA側は、RDを意味します
|
RD、レングス=10
![](bust_10.PNG)
※OE信号は測定を略しています。別途バス・タイムチャートをご覧ください。OEとRDはほぼ同じで、OEはアサートが1CLK早いのが違いです
※BE信号は測定を略しています。基板でプルアップして制御していません。
レングス g_len=10
1パケットは、RDは、RXFがLowの区間。WRは、TXEがLowの区間です
黄色2カーソル間が、パケット中のDATA有効区間です(データシートのタイムチャート参照)
この間、CLKが10個、つまり、レングス=10が数えられます。DATAは、D0のみ計測しています。1バースト毎にトグルしているデータ、0,1,0,1,0,1,0,1,0,1 と10個データが計測されている。
CLK=100MHz
RD、レングス=1024
![](bust_1024.PNG)
レングス g_len=1024
DATAを肉眼では数えられないので、自動計測機能を使っている。右赤矢印部分に、H回数=512 とある。
これは、黄色2カーソル間にD0のトグルの回数が512回を意味します(0,1を1回とし、それが512回)。従って、512x2=1024 レングスを意味します
RD、レングス=1024+2 = 1026
![](bust_1026.PNG)
レングス g_len=1026
レングスが1024を超えると、独特の動作をします。
2パケットに分かれている。
ここがこのドライバの特徴です。
黄色丸。そこを拡大
![](bust_1026b.PNG)
1回のドライバをコールしただけで、自動で、1パケット=MAX1024レングスで区切り、複数パケットにしてくれます
右赤矢印部分に、H回数=513 とある。
これは、黄色2カーソル間にD0のトグルの回数が513回を意味します(0,1を1回とし、それが513回)。最初のパケットは512回と決まっている。
2番目のパケットは、緑矢印のデータで、最後のトグル0,1です
従って、(512+1)x2=1026 レングスを意味します
RD、レングス=1024x10
![](bust_10240.PNG)
レングス g_len=10240
10パケットに分割されます
右赤矢印部分に、H回数=5120 とある。
これは、黄色2カーソル間にD0のトグルの回数が5120回を意味します(0,1を1回とし、それが5120回)。従って、5120x2=10240 レングスを意味します
ここで帯域幅を計算してみます
![](bust_10240b.PNG)
先頭パケットのRXF開始から、後尾パケットのRXFの終了までを計測すると、赤矢印=106.456us
1データ周期は、平均、
この間のレングスが10240なので、106.456us ÷ 10240 = 0.01039us
平均周波数は、
1 ÷ 0.00000001039 = 96.246MHz
32bit4byte幅なので x4 ≒ 385MHz
約385MBbps = 3.08Gbps
これは信号レベルの話です
ULOGの仕様で提示しているのは、ここに、APIのオーバヘッド分も加えているのでその分が余計にかかり、少し落ちて、365MBbpsとなります
1個のパケットの中は、CLK同期なので、データ転送帯域幅は、400MBbps(100MHzの4byte)。
しかし波形をご覧の通り、パケット間に、隙間がある。この隙間が帯域を落とす部分です。RXFからRD起動までのCLKもロスになります。
FPGA側の反応をうまく作ると、この隙間は小さくなります。しかし、ゼロにすることはできません。
これが理論値400MBbpsが実際は、3**MBbpsになる理由です。
RD、イリーガルパケット中断
![](bust_sp_b.PNG)
レングス g_len=81920
イリーガルなパケット幅が計測されることがある
レングス=81920なら、1パケット=1024レングスが80個、同一間隔で並んでいるはずだが、最初のあたりがイリーガルになっている。赤矢印
拡大
![](bust_sp.PNG)
通常は、1パケット=1024レングスで区切られますが、このように、それ以下の適当な数で区切られる場合があります。赤矢印。
何番目のパケットで起きるとか何レングスで起きるとか決まってもいません。レングス=81920なので、通常は等間隔1024レングス80パケット。赤矢印4のパケット目で中断はありません。
赤矢印部分はドライバ側が都合で中断し、中断後はドライバ側が自立で再開し、残りのパケットは漏れることなく発行されます。
レングスが数万を超えた時に、約10%で起きるようです。
中断はドライバの都合ですが、理由は公開されてないようです。
FPGA側が、1パケット=1024を前提に作ると、この時、取りこぼしが起きてしまいます。
当社も最初この事実をしらなかったのでこの件で悩まされました。
解決法は、FPGA側はパケット数を前提で作らず、不特定な位置でパケットの中断があると認識して作るです。
つまり、パケット処理中でも、RXF=Hを検出すれば、停止状態を作る。これができれば取りこぼしはなく作れます。
ユーザーはこの資料で最初からこの事実を知れたわけなので設計が楽になると思います
●WR
WRのドライバのしくみ
※C言語ドライバはFT601プログラマーズガイドに解説されています。ここではイメージレベルで理解して頂ければ大丈夫です
C言語のWRのドライバ抜粋
g_len //任意転送レングス数 ここを可変します
BE_SIZE = 4; //4byte幅(固定)
acReadBuf //データポインタ
ftStatus = FT_ReadPipe(ftHandle, 0x82, (PUCHAR)acReadBuf, (g_len
* be_size), &ulBytesRead, NULL); |
FT_ReadPipeのAPIで、指定レングス(32bit幅)のデータを、FTからRead
FTは、WRが起動される
FPGAは、FTの起動で、WRを実施する
C側のReadは、FPGA側は、WRを意味します
|
WR、レングス=10
![](bust_w_10.PNG)
※BE信号は測定を略しています。基板でプルアップして制御していません。
レングス g_len=10
1パケットは、RDは、RXFがLowの区間。WRは、TXEがLowの区間です
黄色2カーソル間が、パケット中のDATA有効区間です(データシートのタイムチャート参照)
この間、CLKが10個、つまり、レングス=10が数えられます。DATAは、D0のみ計測しています。1バースト毎にトグルしているデータ、0,1,0,1,0,1,0,1,0,1 と10個データが計測されている。
CLK=100MHz
WR、レングス=さまざま
前述のRDの時と同様です。説明は省きます
WR、レングス=1024x10
![](bust_w_10240.PNG)
レングス g_len=10240
10パケットに分割されます
右赤矢印部分に、H回数=5120 とある。
これは、黄色2カーソル間にD0のトグルの回数が5120回を意味します(0,1を1回とし、それが5120回)。従って、5120x2=10240 レングスを意味します
ここで帯域幅を計算してみます
![](bust_w_10240b.PNG)
先頭パケットのRXF開始から、後尾パケットのRXFの終了までを計測すると、赤矢印=114.746us
1データ周期は、平均、
この間のレングスが10240なので、106.456us ÷ 10240 = 0.011205us
平均周波数は、
1 ÷ 0.000000011205 = 89.240MHz
32bit4byte幅なので x4 ≒ 356MHz
約356MBbps = 2.848Gbps
これは信号レベルの話です
前述でRDの帯域幅を計算しました。385MBbpsでした。WRの方が少し小さいが、上の波形を見ると、RDよりパケット隙間が大きいのが分かります。それが原因です。しかしそこはドライバに依存している部分なのでそういうことと理解するしかありません。
ULOGの仕様で提示しているのは、ここに、APIのオーバヘッド分も加えているのでその分が余計にかかり、少し落ちて、335MBbpsとなります
1個のパケットの中は、CLK同期なので、データ転送帯域幅は、400MBbps(100MHzの4byte)。
しかし波形をご覧の通り、パケット間に、隙間がある。この隙間が帯域を落とす部分です。RXFからRD起動までのCLKもロスになります。
FPGA側の反応をうまく作ると、この隙間は小さくなります。しかし、ゼロにすることはできません。
これが理論値400MBbpsが実際は、3**MBbpsになる理由です。
WR、イリーガルパケット中断
RDのところで,1024レングス以外でパケットが中断する現象は、計測できておりません。
当方の環境で計測できないのかなんともいえません。
しかし、FPGA側の作りは、RD、WR、同思想で作るのが宜しいと思います
※ULOGは、デルタコア社オリジナル開発です。
記載されている各名称、製品名は、各社の商標、または、登録商標です。
|
Copyright (c) デルタコア All Rights Reserved.