« お花見 | トップページ | ZYNQに100MのイーサをRMIIでつなぐ(後編) »

2021.03.28

ZYNQに100MのイーサをRMIIでつなぐ(前編)

いま作っているZYNQのボードでは消費電力の削減のためネットワークのモジュールを着脱式にしています。開発時にはファイル転送のためにネットワークに使いたいけど、本番時はネットワークなしで動かすという感じになります。

このようにネットワークの存在はそれほど重要ではないので、1000BASEではなく100BASEでよく、RMII(Reduced MII)という方式を用いて少ない信号線でPHYチップに接続したいと思います。

さて、ZYNQの内蔵イーサネットはGMIIというGigabitEtherなので、これをRMIIという一番遅いタイプのインタフェースに変換することが第一の関門となります。

Vivado 2019.1まではGmii to Rgmiiというコアがあったのですが、Vivado 2019.2からはディスコンになってしまいました。2019.2以降ではGmii to Rgmiiのサポートがなくなってしまったのです。

 

このブログではVivado 2019.2以降でZYNQにRMIIをつなぐ方法を紹介します。

 

やり方はとても簡単。

まず、古いVivadoがインストールされたディレクトリから、rmii_to_rmii_v2_0のフォルダを探して、それを自分自身のプロジェクトのIPレポジトリにコピーします。

Rmii1

私はDドライブにVivadoをインストールしているので、 D:\Xilinx\Vivado\2019.1\data\ip\xilinx\mii_to_rmii_v2_0にありました。

Rmii2 

これでIPのRepositoryをRefresh Allすれば、mii_to_rmiiが使えるようになります。

IP Catalogでmiiと入力すると、Ethernet PHY MII to Reduced MIIが出てきます。

Rmii3

これを貼り付けます。最初はMII仕様になっているのですが、クリックして

Rmii4

Mode Selectionを[Zynq PS Gigait Ethernet Controlloer]に変えると、

Rmii5

左側のポートがGMIIに変わります。

Rmii6

偉いコアですね。なんでディスコンにしてしまったのでしょう。

 

ZYNQのPSの設定ではEthernetをEMIOに出すようにしておきます。

Rmii7

これで、ZYNQのPSから出てきたGMII_ETHERNET_0とmii_to_rmiiコアがぴったりとつながるようになりました。

Rmii8

ref_clkには50MHzのクロックを入力します。このクロックはRMIIのバスのクロックなので、PHYチップにCLKOUTという端子があるならばPHYチップからのクロックを供給します。PHYチップがクロックを入力するタイプならばFPGA内で50MHzを作り出して供給します。

それから、PHYの動作にはMDIOが必要ですが、XILINXのMDIOのInterface定義には誤りがあるのでそのままでは使えません。

下の図を見てください。MDIO_IとMDIO_OとMDIO_Tが、MasterとSlaveの両方で同じDirectionになっています。

Rmii9

そこで、上の図のようにMDIOの信号はバラして、独自のIPコア「phyutil」に入れます。

このコアは何をしているかというと、

    inst_obuf : IOBUF port map (
I => zynq_mdio_o,
IO => phy_mdio,
T => zynq_mdio_t,
O => zynq_mdio_i
);
phy_mdc <= zynq_mdc;

と3ステートバッファを実装しているのと、PHYに送るリセットパルスを生成しているだけです。 

 

これでZYNQのGMIIからEMIOを通じてRMIIに変換してPLのI/Oから出すことができるようになりました。

信号の数はリセットとクロックを含めて全部で11本。電源も含めて13本です。

後編に続く

|

« お花見 | トップページ | ZYNQに100MのイーサをRMIIでつなぐ(後編) »

コメント

コメントを書く



(ウェブ上には掲載しません)




« お花見 | トップページ | ZYNQに100MのイーサをRMIIでつなぐ(後編) »