Vivadoを用いたI2C通信用FPGAモジュールのピン設定

2022年12月20日

環境

  • Ubuntu 20.04
  • Vivado 2021.1

ポイント

  • I2C通信に必要なSCLとSDAの線は、入出力ポートとして設定しなければならない
  • Vivadoで入出力ポートを実装する場合、下記のようにする必要がある
    • I2Cのmaster処理を担うモジュールのポートに、下記3つのポートをSCL、SDAそれぞれに定義する
      1. 外部デバイスから信号を入力するポート(例:scl_i, sda_i)
      2. 外部デバイスへ信号を出力するポート(例:scl_o、sda_o)
      3. 信号を入力するか出力するかを設定するポート(例:scl_t、sda_t)
  • 理由は、FPGA内部でinoutのネットを実装することができないため、最上位まではinputまたはoutputのネットで引っ張る必要があるから
  • Vivadoを使う場合、トップのモジュールをBlock diagramで設計し、WrapperとなるHDLを自動生成してそれを最上位とするため、何もしなければWrapperを自動生成した後、手書きでIOBUFを挿入しなければならない
  • ただし、IOBUFの3-state inputに入力するポートを持つモジュールをIP化し、Interfaceを設定するとWrapperを自動生成するときにVivadoが自動でIOBUFを挿入してくれる(本記事の内容)

手順

  1. SCLを担うポートをscl_i, scl_o, scl_tのように定義する。SDAも同様。
  2. 1.のポートを持つモジュールをIP化する
    • こちらを参照:VivadoでBlock designをIP化する
    • 手書きモジュールをIP化する手順は設定が少し異なると思う(後日まとめるかもしれない)
  3. Package IPのウインドウを開く
    • Package IPのWindowが出ていない場合、Block diagram上で IPを右クリック > Edit in IP Packagerとすると、一時的にIP Packagerが別プロジェクトとして開かれる(この後の設定が終わったらSaveせずに閉じてしまっても問題ない)
  4. Package IPウインドウ内Packaging Steps > Ports and Interfacesをクリック
    1. 右クリック > Add Bus Interfaceをクリック
    2. Add Interfaceのダイアログが開く
      1. Generalタブ
        1. Interface Definitionの「…」ボタンをクリック
          1. 虫眼鏡ボタンをクリックし「iic」で検索
          2. Advancedの左の「>」をクリック
          3. iic_rtlを選択し、「OK」をクリック
        2. Nameに「IIC」と入力(別の名前でもOK)
        3. Modeがmasterになっていることを確認
      2. Port Mappingタブ
        1. Interface’s Logical PortsのSCL_Iを選択し、IP’s Physical Portsから割り当てたいポートを選択
        2. 「Map Ports」をクリック
        3. 同様に、全てのInterface’s Logical PortsについてIP’s Physical Portsを割り当てる
      3. 「OK」をクリック
  5. Package IPウインドウ内Packaging Steps > Review and Packageをクリック
    1. 「Re-Package IP」をクリック
  6. IPを更新
  7. 最上位のBlock designでIICのポートを右クリック > Make External
  8. 中央左のWindowで、Sourcesタブを選択、ブロックデザインのファイルを右クリック > Create HDL Wrapper
  9. WrapperファイルにIOBUFが自動挿入されていることを確認