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レポジトリにコピーします。
私はDドライブにVivadoをインストールしているので、 D:\Xilinx\Vivado\2019.1\data\ip\xilinx\mii_to_rmii_v2_0にありました。
これでIPのRepositoryをRefresh Allすれば、mii_to_rmiiが使えるようになります。
IP Catalogでmiiと入力すると、Ethernet PHY MII to Reduced MIIが出てきます。
これを貼り付けます。最初はMII仕様になっているのですが、クリックして
Mode Selectionを[Zynq PS Gigait Ethernet Controlloer]に変えると、
左側のポートがGMIIに変わります。
偉いコアですね。なんでディスコンにしてしまったのでしょう。
ZYNQのPSの設定ではEthernetをEMIOに出すようにしておきます。
これで、ZYNQのPSから出てきたGMII_ETHERNET_0とmii_to_rmiiコアがぴったりとつながるようになりました。
ref_clkには50MHzのクロックを入力します。このクロックはRMIIのバスのクロックなので、PHYチップにCLKOUTという端子があるならばPHYチップからのクロックを供給します。PHYチップがクロックを入力するタイプならばFPGA内で50MHzを作り出して供給します。
それから、PHYの動作にはMDIOが必要ですが、XILINXのMDIOのInterface定義には誤りがあるのでそのままでは使えません。
下の図を見てください。MDIO_IとMDIO_OとMDIO_Tが、MasterとSlaveの両方で同じDirectionになっています。
そこで、上の図のように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本です。
| 固定リンク
コメント