Vivadoを用いたI2C通信用FPGAモジュールのピン設定
2022年12月20日
環境
- Ubuntu 20.04
- Vivado 2021.1
ポイント
- I2C通信に必要なSCLとSDAの線は、入出力ポートとして設定しなければならない
- Vivadoで入出力ポートを実装する場合、下記のようにする必要がある
- I2Cのmaster処理を担うモジュールのポートに、下記3つのポートをSCL、SDAそれぞれに定義する
- 外部デバイスから信号を入力するポート(例:scl_i, sda_i)
- 外部デバイスへ信号を出力するポート(例:scl_o、sda_o)
- 信号を入力するか出力するかを設定するポート(例:scl_t、sda_t)
- 最上位のモジュールまで上記のポートをひっぱり、SCL、SDAそれぞれIOBUFプリミティブの3-state inputに接続
- 最上位モジュールに入出力ポートを宣言し、IOBUF I/Oポートと接続
- 理由は、FPGA内部でinoutのネットを実装することができないため、最上位まではinputまたはoutputのネットで引っ張る必要があるから
- Vivadoを使う場合、トップのモジュールをBlock diagramで設計し、WrapperとなるHDLを自動生成してそれを最上位とするため、何もしなければWrapperを自動生成した後、手書きでIOBUFを挿入しなければならない
- ただし、IOBUFの3-state inputに入力するポートを持つモジュールをIP化し、Interfaceを設定するとWrapperを自動生成するときにVivadoが自動でIOBUFを挿入してくれる(本記事の内容)
手順
- SCLを担うポートを
scl_i
, scl_o
, scl_t
のように定義する。SDAも同様。
- 1.のポートを持つモジュールをIP化する
- Package IPのウインドウを開く
- Package IPのWindowが出ていない場合、Block diagram上で IPを右クリック > Edit in IP Packagerとすると、一時的にIP Packagerが別プロジェクトとして開かれる(この後の設定が終わったらSaveせずに閉じてしまっても問題ない)
- Package IPウインドウ内Packaging Steps > Ports and Interfacesをクリック
- 右クリック > Add Bus Interfaceをクリック
- Add Interfaceのダイアログが開く
- Generalタブ
- Interface Definitionの「…」ボタンをクリック
- 虫眼鏡ボタンをクリックし「iic」で検索
- Advancedの左の「>」をクリック
- iic_rtlを選択し、「OK」をクリック
- Nameに「IIC」と入力(別の名前でもOK)
- Modeがmasterになっていることを確認
- Port Mappingタブ
- Interface’s Logical PortsのSCL_Iを選択し、IP’s Physical Portsから割り当てたいポートを選択
- 「Map Ports」をクリック
- 同様に、全てのInterface’s Logical PortsについてIP’s Physical Portsを割り当てる
- 「OK」をクリック
- Package IPウインドウ内Packaging Steps > Review and Packageをクリック
- 「Re-Package IP」をクリック
- IPを更新
- 最上位のBlock designでIICのポートを右クリック > Make External
- 中央左のWindowで、Sourcesタブを選択、ブロックデザインのファイルを右クリック > Create HDL Wrapper
- WrapperファイルにIOBUFが自動挿入されていることを確認

ディスカッション
コメント一覧
まだ、コメントがありません