RMII 仕様

英語なんて誰も読みたくないよな。

RMIIのMAC作ろうとしたら実装できる程度に仕様を教えてくれるサイトが無かったので備忘録をここに残す。間違っている点があったらVLSI.JPの管理者まで適当に連絡してほしい。

http://ebook.pldworld.com/_eBook/-Telecommunications,Networks-/TCPIP/RMII/rmii_rev12.pdf

RMIIとは

RMIIはReduced Media Independent Interfaceの略称であり、動作周波数を二倍にする事でピン数を大体半分に減らしたMIIです。今は影も形も無いRMIIコンソーシアムという団体が独自に策定しました。

信号一覧

一撃で理解できる図は仕様書のFigure 1.参照

信号名 方向 機能
REF_CLK PHY <- XTAL -> MAC
or PHY <- MAC
クロック
CRS_DV PHY -> MAC Carrier Sense/Receive Data Valid
RXD[1:0] PHY -> MAC 受信データ
TX_EN PHY <- MAC 送信イネーブル
TXD[1:0] PHY <- MAC 送信データ
RX_ER(Optional) PHY -> MAC 受信エラー

信号詳解

REF_CLK

REF_CLKはリファレンスクロックであり、CRS_DV, RXD, TX_EN, TXD, RX_ERはこのREF_CLKを参照して動作する。PHYにとってはREF_CLKは必ず外部から入力される信号であり、信号源はMACか外部ソースの場合がある。

REF_CLKは50MHz±50ppmでありduty比は35%から65%までが許容される。

CRS_DV

CRS_DVはCarrier Sense/Receive Data Validであり、MIIにおけるCRSとRX_DV信号を兼ねている。

大前提として、MIIは25MHz, 4bitでデータを受信する仕様になっており、RMIIでは50MHz, 2bitでデータを受信することで帯域を維持しながらピン数を削減している。MIIでは、1サイクルに来る4bitのデータの事をニブルと呼ぶ。RMIIではこのニブルを2bitに分け、2サイクルかけて一つのニブルを受信する。

CRS_DVでは、RXDから先に来る2ビットではCRSとして扱い、後に来る2ビットではRX_DVとして扱う。この仕様により、キャリアは消失しているもののPHYのFIFOにデータが残っているような場合では、CRSとして扱うタイミングではCRS_DVがデアサートされ、RX_DVとして扱われるタイミングではCRS_DVがアサートされる事になり、結果的にCRS_DVの値が振動する。これはRMIIのv1.2で追加された仕様であり、物理層パケットの末尾でよく起こる。

また、CRS_DVがアサートされるまではRXD[1:0]の値は00として扱う。

RXD[1:0]

RXDは受信データであり、CRS_DVがアサートされている各クロックで2bitづつデータを受信する。

CRS_DVがデアサートされている時はRXD[1:0]の値は00になる。もし、CRS_DVがデアサートされている時にRXD[1:0]の値が00以外になる場合、MACはそれを無視して00として扱う。

一撃で理解できる図は仕様書のFigure 2.参照

RXD[1:0] in 100 Mb/s mode

CRS_DVがアサートされた直後は、RXD[1:0]は00である必要がある。その後プリアンブル(01)が現れ、SFDの検出後データの格納が行われる。PHYが誤ったキャリアを検出した場合、RXD[1:0]は10という値が受信イベントの終了まで入力される。

一撃で理解できる図は仕様書のFigure 3.参照

RXD[1:0] in 10 Mb/s mode

REF_CLKがデータレートの10倍になるため、RXDは10サイクル毎にサンプリングされる。

RXD[1:0]と受信エラー検知

RX_ERはOptionalであり、RX_ERを実装しない場合は受信エラー発生時にRXDの値を強制的に01に置き換え、CRCエラーを引き起こすことで受信エラー検知を可能にしている。本物のCRCエラーと区別するには、PHYが持つMIIレジスタの受信エラーカウンタを確認する。

TX_EN

TX_ENは送信イネーブルであり、MACがTXDの2bitで有効なデータを出力していることを意味する。

TX_ENはREF_CLKに同期してアサートされ、プリアンブルの最初から送信データが送信されている間はアサートされ続ける。そして、フレームの最後の2bitが送信されるREF_CLKの立ち上がりエッジの前にデアサートされる。

一撃で理解できる図は仕様書のFigure 4.参照

TXD[1:0]

TXDは送信データであり、REF_CLKに応じて駆動する。

TX_ENがデアサートされている時にTXDが00の場合にはidleを意味する。TX_ENがデアサートされておりTXDが00以外の場合は予約されている。多分未定義。

RXDの送信版。

TXD[1:0] in 100 Mb/s mode

特に言うことなし

TXD[1:0] in 10 Mb/s mode

REF_CLKがデータレートの10倍なため、10サイクル毎にTXDの値がサンプリングされる。この10サイクルの間は同じ値を保つ必要がある。

RX_ER

RX_ERは受信エラーであり、PHYはエラーが起きたREF_CLKの周期でRX_ERをアサートする。CRS_DVがデアサートされている間はRX_ERはMACに影響を与えない。

フレームの構造

フレームの構造は以下のようになっている。

<inter-frame><preamble><sfd><data><efd>

一撃で理解できる図は仕様書のFigure 5.参照