2014年9月27日土曜日

Slave FIFOs メモ書き①

「EZ-USB(R) Technical Reference Manual.pdf」
の(page.99~)「9.Slave FIFOs」について、


The FIFOADR[1:0] pins select which of the four FIFOs is
connected to the FD bus and is being controlled by the
external master.

FIFOADR[1:0] pins:(FPGA->EZ_USB_FX2LP)
接続先の4つのFIFO(エンドポイント?)を選択する。





In asynchronous mode (IFCONFIG.3 = 1), SLRD and SLWR
are read and write strobes; in synchronous mode
(IFCONFIG.3 = 0), SLRD and SLWR are enables for the
IFCLK clock pin.

IFCLK clock pin:(FPGA<->EZ_USB_FX2LP)(双方向)
信号の同期を取るクロックを出力するピン???

http://optimize.ath.cx/cusb_spa3/index.html」に説明があった。

•非同期転送モードよりは同期転送モードがはるかに高速
•IFCLKは外部クロックを使用するより、内部クロックを使用したほうがタイミング的に楽になる
•エンドポイントの切り替え(FIFOアドレスの変更)はタイミング的にかなりのペナルティーになる

らしい。
良く分からないが、page.102「9.2.3 Interface Clock」を見た感じだと、

今回は発振器を付けないので、EZ_USB_FX2LPでCLKOEのフラグを立てることで、
CLKOUT端子から出力したクロックでFPGAを駆動し、
さらに、FIFOについては、FPGAからのクロックで駆動する。って感じかな。
確かにタイミングは楽になりそうだ。
→良く考えれば、これだとFPGA->EZ_USB_FX2LPへの転送は兎も角、
EZ_USB_FX2LP->FPGA向きの転送はタイミングを揃える必要がある(とは言っても48MHzで問題になるとは思わない……と信じている)。
→しかし、クロックが外部であれば、クロックを止める事もできるだろうから、
デバックはやり易いと思われる。
→まあ、それなら非同期転送でも同じだけれど……。

「Figure 9-6. IFCLK Configuration」の説明で、IFCL Kレジスタを設定すればいい。

オプティマイズの設定は同期では無く非同期だった。



The FIFO Data (FD) bus, FD[x:0], can be either 8- or 16-bits
wide. The width is selected via each FIFO’s WORDWIDE
bit, (EPxFIFOCFG.0):
■ WORDWIDE = 0: 8-bit mode. FD[7:0] replaces Port B.
See Figure 9-4.
■ WORDWIDE = 1: 16-bit mode. FD[15:8] replaces Port D
and FD[7:0] replaces Port B. See Figure 9-5. FD[7:0] is
the LSB of the word, and FD[15:8] is the MSB of the
word.

8-bit mode. FD[7:0] replaces Port B.
16-bit mode. FD[15:8] replaces Port D and FD[7:0] replaces Port B.
(FPGA<->EZ_USB_FX2LP)(双方向)




「9.2.4 FIFO Flag Pins (FLAGA, FLAGB,FLAGC, FLAGD)」より、

Flag pins configured for Indexed mode report the status of
the FIFO currently selected by the FIFOADR[1:0] pins.
When configured for Indexed mode, FLAGA reports the programmable
level status, FLAGB reports the ‘full’ status, and
FLAGC reports the ‘empty’ status.

FLAGA : the programmable level status
FLAGB : the ‘full’ status
FLAGC : the ‘empty’ status.

(EZ_USB_FX2LP->FPGA)

フラグは自分で決めるんだったっけ?(下記)




同じく
「9.2.4 FIFO Flag Pins (FLAGA, FLAGB,FLAGC, FLAGD)」より、
Flag pins configured for Fixed mode report one of the three
conditions for a specific FIFO, regardless of the state of the
FIFOADR[1:0] pins. The condition and FIFO are userselectable.
For example, FLAGA could be configured to
report FIFO2’s ‘empty’ status, FLAGB to report FIFO4’s
‘empty’ status, FLAGC to report FIFO4’s ‘programmable
level’ status, and FLAGD to report FIFO6’s ‘full’ status.

FLAGの意味を自分で設定できる……って事???
(EZ_USB_FX2LP->FPGA)


The polarity of the ‘empty’ and ‘full’ flag pins defaults to
active-low but may be inverted via the FIFOPINPOLAR register.


On a hard reset, the FIFO flags are configured for Indexed
operation.

デフォルトでは「Indexed operation」らしい。




「9.2.5 Control Pins (SLOE, SLRD,SLWR, PKTEND, FIFOADR[1:0])」について、


--------------

In synchronous mode (IFCONFIG.3 = 0), the FIFO pointer is
incremented on each rising edge of IFCLK while SLRD is
asserted. In asynchronous mode (IFCONFIG.3 = 1), the
FIFO pointer is incremented on each asserted-to-deasserted
transition of SLRD.

SLRD:Slave Read:(FPGA->EZ_USB_FX2LP)
同期転送の場合、
クロックが立ち上がった時、SLRDがLの場合、
データのポインタがインクリメントされ、
次の(あるいは最初の?)データがEZ_USB_FX2LPから出力される。???

データをFPGAに読み込む時、SLRDをLにする。???
「SLRD is asserted」ってLでいいのかな?

非同期転送の場合、
SLRDがL->Hを繰り返すごとにインクリメントされる。

--------------

The SLOE pin enables the FD outputs. In synchronous
mode, when SLOE is asserted, this causes the FD bus to be
driven with the data that the FIFO pointer is currently pointing
to. The data is pre-fetched and is output only when
SLOE is asserted. In asynchronous mode, the data is not
pre-fetched, and SLRD must be asserted when SLOE is
asserted for the FD bus to be driven with the data that the
FIFO pointer is currently pointing to. SLOE has no other
function besides enabling the FD bus to be in a driven state.
By default, SLOE and SLRD are active-low; their polarities
can be changed via the FIFOPINPOLAR register.

SLOE:Slave Output Enable:(FPGA->EZ_USB_FX2LP)
EZ_USB_FX2LPに対して、FD(FIFO Data)へのデータの出力を許可する。
(FD(FIFO Data)は双方向なので、注意して制御しないと、ショートする可能性がある。)


--------------

Slave Write — SLWR
In synchronous mode (IFCONFIG.3 = 0), data on the FD bus
is written to the FIFO (and the FIFO pointer is incremented)
on each rising edge of IFCLK while SLWR is asserted. In
asynchronous mode (IFCONFIG.3 = 1), data on the FD bus
is written to the FIFO (and the FIFO pointer is incremented)
on each asserted-to-deasserted transition of SLWR.
By default, SLWR is active-low; its polarity can be changed
via the FIFOPINPOLAR register.

SLWR:Slave Write:(FPGA->EZ_USB_FX2LP)
クロックが立ち上がった時、SLWRがLの場合、
データがEZ_USB_FX2LPに書き込まれる。


--------------

FIFOADR[1:0]:
The FIFOADR[1:0] pins select which of the four FIFOs is
connected to the FD bus (and, if the FIFO flags are operating
in Indexed mode, they select which FIFO’s flags are presented
on the FLAGx pins):


Table 9-2. FIFO Selection via FIFOADR[1:0]
+--------------------------+
|FIFOADR[1:0]  |  Selected FIFO|
+------------+-------------+
|         00          |    EP2               |
|         01          |      EP4             |
|         10          |      EP6             |
|         11          |      EP8             |
+--------------------------+

FIFOADR[1:0]:FIFO address:(FPGA->EZ_USB_FX2LP)
FPGAが接続する先のエンドポイントを選択する。


--------------

PKTEND
An external master asserts the PKTEND pin to commit an IN
packet to USB regardless of the packet’s length. PKTEND is
usually used when the master wishes to send a ‘short’
packet (for example, a packet smaller than the size specified
in the EPxAUTOINLENH:L registers).

For example: Assume that EP4AUTOINLENH:L is set to the
default of 512 bytes. If AUTOIN = 1, the external master can
stream data to FIFO4 continuously, and (absent any bottlenecks
in the data path) the EZ-USB automatically commits a
packet to USB whenever the FIFO fills with 512 bytes. If the
master wants to send a stream of data whose length is not a
multiple of 512, the last packet is not be automatically committed
to USB because it is smaller than 512 bytes. To commit
that last packet, the master can do one of two things: It
can pad the packet with dummy data in order to make it
exactly 512 bytes long, or it can write the short packet to the
FIFO, then pulse the PKTEND pin.

PKTEND:Packet End:(FPGA->EZ_USB_FX2LP)
FPGAからEZ_USB_FX2LPにデータを書き込む時、
FIFOに512Byte(the EPxAUTOINLENH:L registersのサイズなので、設定によっては512Byteとはならないと考えられる。)溜まると自動的にPCへ転送されるが、
512Byte以下(the EPxAUTOINLENH:L registersのサイズ以下のサイズ)のデータを転送したい場合は、
PKTENDをLにすれば良い。


……
逆に、PC->EZ_USB_FX2LP->FPGA
に「the EPxAUTOINLENH:L registers」のサイズ以下のサイズ
のデータを転送したい場合は……どうなるのだろうか?


--------------
引き続きPKTENDについて。

Note The PKTEND pin must not be asserted unless a
buffer is available, even if only a zero-length packet is being
committed. The ‘full’ flag may be used to determine whether
a buffer is available.

例え0の長さのパケットが約束されているとしても、
バッファが利用可能でない時にPKTEND pinをLにしてはいけない。
‘full’フラグによってバッファが利用可能かどうか判断できる。

(おそらく0でも1でも10でも512でも64でもバッファが利用可能でなければダメって事かな。)


--------------

Note In synchronous mode, there is no specific timing
requirement for PKTEND assertion with respect to SLWR
assertion. PKTEND can be asserted anytime. In asynchronous
mode, SLWR and PKTEND should not be pulsed at
the same time. PKTEND should be asserted after SLWR
has been deasserted for the minimum deasserted pulse
width. In both modes, FIFOADR[1:0] should be held constant
during the PKTEND pin assertion.

同期転送では、PKTENDとSLWRのタイミングの問題で注意する点は無い。
非同期転送では、PKTENDとSLWRは同時にパルスさせてはいけない。
PKTENDは、SLWRがdeasserted(Lにして再びHに)された後で、
assert(Lにする事)する必要がある。
また、どちらのモードでも、PKTENDがLの間は、FIFOADR[1:0]を一定に保つ必要がある。




「9.2.6 Slave FIFO Chip Select」(page.104)について。

SLCS:The Slave FIFO Chip Select:(FPGA->EZ_USB_FX2LP)


The Slave FIFO Chip Select (SLCS#) pin is an alternate
function of pin PA7; it is enabled via the PORTACFG.6 bit
(see section 13.4.1 Port A Alternate Functions on
page 185).

The SLCS# pin allows external logic to effectively remove
the EZ-USB from the FIFO Data bus, in order to, for example,
share that bus among multiple slave devices. For applications
that do not need to share the FD bus among multiple
slave devices, the SLCS# pin can be tied to GND to permanently
select the EZ-USB slave FIFO interface. This configuration
is assumed for the interface and timing examples that
follow.

While the SLCS# pin is pulled high by external logic, the EZUSB
floats its FD[x:0] pins and ignores the SLOE, SLRD,
SLWR, and PKTEND pins.

SLCSは、pin PA7の選択できる機能の内の一つ。
PORTACFG.6 bitによって有効にできる。

SLCSを使う事によって、複数のデバイスで
「FD[x:0]、SLOE、SLRD、SLWR、PKTEND」
を共有させる事ができる。

//(例えば一つのFPGAに複数のスレーブのEZ_USB_FX2LPが接続されている場合、
//FPGAがどちらのEZ_USB_FX2LPと通信するかを選択する事ができる。)

そのようなバスを共有する必要の無いアプリケーションでは無い場合は、
SLCSは永続的にGNDに接続する事ができる。

SLCSがhighの間は、EZ_USB_FX2LPは、FD[x:0] pinsをハイ・インピーダンスに設定し、
SLOE、SLRD、SLWR、PKTENDの信号を無視する。


--------------
(see section 13.4.1 Port A Alternate Functions on page 185)
の部分について。


Table 13-1. Register Bits that Select Port A Alternate Functions
~中略~
[1] Although the SLCS alternate function is selected by bit 6 of PORTACFG, that function does not appear on pin PA6. Instead, the SLCS function appears
on pin PA7 (see Table 13-2).

SLCSを有効にするのはPORTACFGの6bit目だが、実際のピンはPA7なので注意。



Table 13-2. Port A Alternate Function Configuration
PA.0:INT0                   <-FIFO以外で使えそう(ただし割り込み端子)
PA.1:INT1                   <-FIFO以外で使えそう(ただし割り込み端子)
PA.2:SLOE
PA.3:WU2                   [1]<-FIFO以外で使えそう?
PA.4:FIFOADR0
PA.5:FIFOADR1
PA.6:PKTEND
PA.7:FLAGD  [2]  /SLCS     [3]<-???

[1] When PA.3 is configured for alternate function WU2, it continues to function as a general purpose input pin as well. See section 6.4.1 WU2 Pin on page 81
for more information.
[2] Although PA.7’s alternate function FLAGD is selected via the PORTACFG register, the state of the FLAGD output is undefined unless IFCFG1:0 = 11.
[3] FLAGD takes priority over SLCS if PORTACFG.6 and PORTACFG.7 are both set to ‘1’.

[1]
WU2を設定している場合は、汎用入力端子としても使える。

[2]
PA.7をFLAGDに設定するにはPORTACFGだけでなく、「IFCFG1:0 = 11」を指定する必要がある。
つまり、
PORTACFG = 0x80 | ( PORTACFG & 0x3F );
//あるいは他に設定しないのであれば単純に、「PORTACFG=0x80;」
//
//あるいは注意書き[3]を前提にするのであれば
//「PORTACFG |= 0x80;」
//で問題ない。

IFCONFIG = 0x03;
となる。

[3]
PORTACFG.6 と PORTACFG.7 が共に 1 にセットされている場合は、
FLAGD が SLCS よりも優先される。
--------------
上記のSLCSについて、指定しなければおそらく、SLCSが常にGNDに設置されているのと同じ条件になると考えられる。




FD[x:0] pinsがハイ・インピーダンスになっているタイミングは、
恐らくタイミングチャートに「Z」と書かれている期間。(Hi-Zの略だと思う。たぶん。)




http://optimize.ath.cx/FX2_USB/fifo.htm
に各フラグの意味が、簡単にだが説明されている……。





レジスタのメモ書きは以上。以下より書き込み及び読み込みのタイミングについて考える。


page.105~
「9.2.7 Implementing Synchronous Slave FIFO Writes」






page.107~
「9.2.8 Implementing Synchronous Slave FIFO Reads」


























0 件のコメント:

コメントを投稿