GPIO 原理#
GPIO は MIO を介して 54 のインターフェースを提供し、そのうち 16 はバンク 500 にあり、残りはバンク 501 にあります。また、EMIO インターフェースを介して PL から 64 の入力と 128 の出力を提供します。GPIO の制御および状態レジスタは、ベースアドレス $0xE000_A000$ にメモリマップされています。
ZYNQ の GPIO ピンは 4 つのバンクに分かれており、合計 118 の GPIO があります。
GPIO 内部構造#
図から、GPIO には 3 つの機能があることがわかります:入力、出力、割り込み。
その中で MIO 7 と 9 は出力専用です。
1 つのレジスタセットは 1 つの GPIO バンクのすべてのピンを制御できます。
デバイスピンの GPIO 制御#
入出力レジスタ#
レジスタ名 | 説明 |
---|---|
DATA_RO | GPIO ピンの値はこのレジスタに格納され、GPIO が入力または出力に設定されていても、このレジスタを読み取ることで GPIO ピンの値を取得できます。 これは読み取り専用レジスタ(ソフトウェアにとって)であり、ソフトウェアがこのレジスタに書き込む操作は無視されます。 |
DATA | 出力データレジスタで、GPIO が出力に設定されているときのみ機能します。このレジスタの値が出力ピンに出力されます。 このレジスタに書き込むことは GPIO の出力値を設定することを意味し、 このレジスタを読み取ると、GPIO の前回の出力値が返され、現在の値ではありません。 |
MASK_DATA_LSW | Mask Data Least Significant Words、出力データの下位 16 ビットマスクレジスタで、このレジスタは下位 16 ビットのみが有効です。 対応するビットが 1 の場合、DATA レジスタの下位 16 ビットの対応するビットの値を変更できます。 1 でない場合、DATA レジスタの下位 16 ビットの対応するビットは元の値を保持します。 |
MASK_DATA_MSW | Mask Data Most Significant Words、出力データの上位 16 ビットマスクレジスタで、 機能は MASK_DATA_LSW と同じですが、DATA レジスタの上位 16 ビットに対応します。 |
DIRM | Direction Memory、方向レジスタで、デフォルトは 0(入力)を示し、1 に設定すると出力を示します。 注意:DIRM が 1 であっても、ソフトウェアはこのピンのレベルを入力のように読み取ることができます。 |
OEN | Output Enable、出力イネーブルレジスタで、 DIRM が 0 のときのみ有効で、1 は出力をイネーブル、 0 は出力を無効にし、このとき対応するピンの値は三状態値になります。 |
割り込み制御レジスタ#
レジスタ名 | 説明 |
---|---|
INT_TYPE | Interrupt Type 割り込みタイプレジスタで、 GPIO 割り込みがレベルトリガーかエッジトリガーかを制御します。 |
INT_POLARITY | Interrupt Polarity 割り込み極性レジスタで、 GPIO 割り込みが低レベル / 下降エッジ有効か、高レベル / 上昇エッジ有効かを制御します。 |
INT_ANY | Interrupt Any、両エッジレジスタで、 INT_TYPE がエッジトリガーのときのみこのレジスタが有効で、両エッジで割り込みをトリガーできるかを制御します。 |
INT_STAT | Interrupt State、割り込み状態レジスタで、 このレジスタの値は接続されている INT State D フリップフロップによって読み取られます。 D フリップフロップは割り込み状態を保存し、ソフトウェアはこの D フリップフロップの出力を読み取ることで割り込みが発生したかどうかを判断します。 この D フリップフロップをクリアすることで割り込み状態をクリアします。 |
INT_MASK | Interrupt Mask、割り込みマスクレジスタで、 現在どのビットがマスクされ、どのビットが有効かを表示します。 |
INT_DIS | Interrupt Disable、割り込み無効レジスタで、 このレジスタの任意のビットに 1 を書き込むと、その割り込み信号がマスクされます。 このレジスタを読み取ると予測不可能な値が返されます。 |
INT_EN | Interrupt Enable、割り込みイネーブルレジスタで、 このレジスタの任意のビットに 1 を書き込むことで、割り込み信号のマスクを有効 / 無効にできます。 このレジスタを読み取ると予測不可能な値が返されます。 |
GPIO の割り込み番号は ==52== で、割り込み優先度は固定されており、GPIO の割り込み優先度を設定する必要はありません。GPIO のすべてのピンは同じ割り込みを共有しており、2 つのピンの割り込みを有効にしても、ソフトウェアはどのピンから割り込みが来たかを判断できません。
EMIO と MIO#
MIO(Multiuse I/O)は、PS 側の構成可能な多機能ピンに対応するマルチユース入力 / 出力です。
EMIO(Extent MIO)は、PL 側の構成可能な多機能ピンに対応します。
MIO は周辺機器の基本ピンであり、MIO のピン数が少ないため、ZYNQ は EMIO インターフェースを提供して MIO を拡張し、周辺機器は EMIO インターフェースを介して PL 側のピンに接続され、MIO とほぼ同じ機能を実現します。
MIO と EMIO の違いは以下の通りです:
- MIO は PL 側にとって透明で、PL は MIO ピンのレベルを読み取ることができません;PS 側は EMIO を介して PL 側と通信できます。
- 周辺機器は MIO と固定的に組み合わされており、初期化時に開発ボードの回路図に基づいてピン制約を選択する必要があります。EMIO は相対的に柔軟で、ピンは任意に指定でき、xdc ファイル制約を介して PL 側の特定のピンに指定できます。
- MIO ピンは周辺回路に近いため、EMIO に比べて一部の周辺機器は MIO を使用する方が性能が良く、他の周辺機器は MIO のみを使用できます。
MIO バンクとパッケージのバンクの違いと関係#
MIO はバンク 0 とバンク 1 に分かれており、バンク 0 はパッケージバンク 500 の一部ピンを含み、バンク 1 はパッケージバンク 501 の一部ピンを含みます。
バンク 0 には MIO 0〜15 の合計 16 の MIO が含まれ、バンク 1 には MIO 16〜53 の合計 38 の MIO が含まれ、合計 54 の MIO があります。EMIO は合計 64 があります。