2012年4月28日土曜日

SPIコントローラの作成 6

ぶはー、、ようやく休みだ~
これでしばらくは好きな事に没頭できる。やっほーい

さて、UARTの高速化だが、Linuxでは115200bps以上の転送速度の設定は簡単には
いかないと思っていたのだが、なんのこたぁーない、cfsetspeedの引数で値を渡せば
いいだけだった。今回は921600bpsにした。


このプログラムと、921600bpsにしたFPGAとで通信できた。
ところがである。全体的な速度はあんまり速くならない、いや、まったく速くならない。
UART I/F部は115200bpsから921600bpsになった分高速化できているが、
例えばN25Qの256ワードのリードに要する時間は115200と921600とで同じだった。


これは、USBがストリーミング向けのI/Fのため、少量のデータをハンドシェイクで送受する
使い方では速度が出せないということと、現状のPC-FPGA間の通信仕様がまさにそういう
仕様になっているためだと思う。 具体的には、PC-FPGA間は以下のような伝文フォーマット
で通信を行っている。


また、SPIコントローラの制御方法も工夫が足りなかった。
リードの場合はCTLレジスタにパラメータを設定してリードサイクルを発生させ、受信したデータを
RXDレジスタからリードするという手順になるが、この場合PC - FPGA間では3回の交信が必要になる。
即ち、

1.  CTLレジスタへのライトコマンド ... PC→FPGA
2.  RXDレジスタのリードコマンド ... PC→FPGA
3.  RXDデータの受信 ... FPGA→PC

そこで、RXDレジスタのリードの場合は、同時にSPIの転送も発生するようにRTLを変更してみた。
プログラムとしては以下のようになる。 まず、96行目でCTLレジスタにリード用のパラメータ
をライトして最初のリードサイクルを発生させる。それ以降は、99行目のRXDレジスタのリードに
同期してSPIのリードサイクルが発生するのでRXDレジスタのリードを必要回数繰り返すだけだ。


この結果、時間は1秒程短縮できた。


先頭アドレスとデータ長を設定して起動したら連続してSPIサイクルを発生しデータを連続して
送信するようにすればN25Qのリードに関してはもっと高速化できるだろう。  ライトもなるべく
PC-FPGA間でデータの送受が発生しないようにする必要がある。
という訳で、PC-FPGA間の通信仕様も見直した方が良さそうだ。


0 件のコメント:

コメントを投稿

自作CPUで遊ぶ 25

まだ制御ソフトが完成していないので今まではスピンドルを移動するために一々簡単なプログラムを書いて移動させていたのだが、非常に面倒なのでCNCペンダント的なものを作ることにした。 右側の縦に2つ並んでいるスイッチ...