TEL:086-227-0113
info@gopher-tec.jp
TOP page 製品情報 FPGAサンプルコードリポジトリ I2C 32bit-DIO
I2C 32bit-DIO

32ビットデジタル入力・出力を備えたI2Cスレーブのサンプルコードです。
I2Cマスターによるバスアクセスを監視し、7ビットデバイスアドレスが自身のアドレス(外部から設定
可能)と一致すると、内部レジスタへのリードライトを行いつつ、I2Cスレーブとして応答します。
あくまでI2Cからリードライト可能なレジスタを複数構成する、というのが主眼のサンプルであり、DIO部
には特別な機能は付けていません。オマケ的なものです。

I2Cバススピードは、100kHz以下のスタンダードモードと400kHz以下のファストモードに対応
しています。内部レジスタは、アクセスするレジスタを選択するためのアドレスレジスタ、32ビット入力値
を読み出すための8ビットレジスタ4本、そして32ビット出力値を設定するための8ビットレジスタ4本の
合計9本で構成されています。これら内部レジスタにアクセスする際は、レジスタを複数持つI2Cスレーブ
でよく見られる通り、まずアドレスレジスタにライトしてアクセス対象のレジスタを指定し、その後で
ライトする・あるいはリードするという2段階のアクセスが必要です。
連続アクセス時にアドレスレジスタを自動的にインクリメント・またはデクリメントする機能は搭載して
いません。必要な方はご自身で追加下さい。

なお本コードでは、I2Cバスラインの負荷が大きく、信号の立ち上がり時間がデバイスの許容範囲を超えて
大きいこと(I2C規格上、立ち上がり時間はスタンダードモードで1usまで、ファストモードで300nsまで
許されており、条件によってはFPGA/CPLDに直結できないケースが多々あります)を想定し、I2Cの
SDA、SCLを外部のシュミットインバータで受け、その出力をFPGA/CPLDに接続する前提としています。
もし負荷が小さく、特にケアが必要ない場合には、I2Cバスと直結しつつ、コード中のSDA・SCLの
インバート部分を単なるバッファ回路へ変更してご使用下さい。

Name I/O  Description 
RESET in 非同期リセット入力です。パワーオン時、またはシステムリセット時にアサートして下さい。
CLK33M
in クロック入力です。本モジュールはこの信号の立ち上がりエッジで動作します。
33MHzを想定していますが、25~40MHzの範囲であれば特に問題はありません。
SDA_O out I2CのデータラインSDAへの出力です。I2Cの当該ラインへ直結して下さい。
SDA_IL in I2CのデータラインSDAの入力で、外部シュミットインバータで受けた信号を想定しています。
接続方法については機能概要欄の後半を参照下さい。
SCL_IL in I2CのクロックラインSCLの入力で、外部シュミットインバータで受けた信号を想定しています。
接続方法については機能概要欄の後半を参照下さい。
MY_ADDR[7:1] in 本モジュールが応答すべきI2Cデバイスアドレスを固定入力して下さい。
DO_REGS0[7:0] out 8ビットのデジタル出力です。レジスタアドレス4hにライトした値が出力されます。
DO_REGS1[7:0] out 8ビットのデジタル出力です。レジスタアドレス5hにライトした値が出力されます。
DO_REGS2[7:0] out 8ビットのデジタル出力です。レジスタアドレス6hにライトした値が出力されます。
DO_REGS3[7:0] out 8ビットのデジタル出力です。レジスタアドレス7hにライトした値が出力されます。
DO_REGS0[7:0] in 8ビットのデジタル入力です。レジスタアドレス0hからリードできます。
DO_REGS1[7:0] in 8ビットのデジタル入力です。レジスタアドレス1hからリードできます。
DO_REGS2[7:0] in 8ビットのデジタル入力です。レジスタアドレス2hからリードできます。
DO_REGS3[7:0] in 8ビットのデジタル入力です。レジスタアドレス3hからリードできます。
※特に注記のない限り、信号は全て正論理です。
本ソースコードはVerilogを用意しています。
詳細は下記の資料ダウンロードをクリックください。

I2C 32bit-DIO
資料ダウンロード