コントロールレジスタ
コントロール・ステータス・レジスタ
サンプルデザインでは、DMAの制御レジスタはBAR0空間に配置されています。
BAR0空間は、main.vhd内でGPIOを構成しているほか、dmaint_userというモジュールにつながっています。このモジュールは、割り込み発生の処理と、DMAのターゲット・アドレスを管理します。
dmaint_user内にはDMAコントロール・ステータス・レジスタが実装されていて、このレジスタを操作することで、DMAを発行することができます。
PCI ExpressはTLPの仕様上、64バイトとか256バイトといった単位でデータを小分けにして送信しなければなりませんが、ユーザアプリケーションは数メガバイト単位のデータ転送を要求することもあります。そのような場合、要求されたデータを64バイトや256バイトといった単位に分割して、何度も繰り返しトランザクションを発生させなければなりません。それが、dmaint_userモジュールの役割です。
dmaint_userでは以下のアドレスにDMA関係のレジスタが配置されております。
これらのレジスタに値を設定することで、dmaint_userモジュールが動作し、DMAを発行します。
アドレス |
機能 |
BAR0 + 0x00 |
未使用 |
BAR0 + 0x04 |
未使用 |
BAR0 + 0x08 |
未使用 |
BAR0 + 0x0C |
未使用 |
BAR0 + 0x10 |
DMAを行う際のPC上のメモリの論理アドレス(下位32bit) |
BAR0 + 0x14 |
DMAを行う際のPC上のメモリの論理アドレス(上位32bit) |
BAR0 + 0x18 |
DMAを行う際のFPGA内のローカルアドレス |
BAR0 + 0x1C |
DMAを行う際のデータ転送長と転送方向 |
BAR0 + 0x20 |
割り込み発生レジスタ |
これらのレジスタを誤って操作するとDMAが勝手に走ってしまい、PC上のメインメモリにデータを書き込んで大変危険です。ご注意ください。 なお、これらのレジスタは、Windows環境では当社が用意するデバイスドライバとAPI(DLL)によって適切に管理されますので、ユーザ・アプリケーション・ソフトウェアから操作する必要はありません。 |
DMA制御レジスタの操作方法
Linuxなどから操作したい場合のために、これらのレジスタの操作方法を示します。以下の手順は、デバイスドライバに要求される手順ですので、通常のユーザアプリケーションで用いるものではありません。
? 転送したいPC上の物理メモリ(論理メモリ)のアドレスを2つの論理アドレスレジスタに設定します。
図2 論理アドレスレジスタ
? FPGA上の読み出したいDDR2メモリのアドレスをローカルアドレスレジスタ(BAR0 + 0x18 )に設定します。
図3 ローカルアドレスレジスタ
? DMAコントロールレジスタ(BAR0 + 0x1C)に、転送したい長さ÷4と0x40000000をORしたものを書き込むと、DMAライトが発生してPCのメインメモリ上にデータが転送されます。
DMAコントロールレジスタ(BAR0 + 0x1C)に、転送したい長さ÷4と0x80000000をORしたものを書き込むと、DMAリードが発生してPCのメインメモリ上からFPGAへデータが転送されます。
図4 DMAコントロールレジスタ
? 具体的には、DMAでデータをライト(FPGA→PCメインメモリ)したい場合は、
PCIeWriteBar(BAR0 + 0x1c ,0x40000000 | (Length >> 2));
とします。
DMAでデータをリード(PCメインメモリ→FPGA)したい場合は、
PCIeWriteBar(BAR0 + 0x1c ,0x80000000 | (Length >> 2));
とします。
? DMAが完了すると割り込みが発生するので、割り込み処理ルーチン(ISR)の中で、 割り込み発生レジスタ(BAR0 + 0x20)を読み、最上位ビット(bit31)が'1'になっているかどうかを判別します。
図5 割り込み発生レジスタ
? このレジスタの最上位ビットが'1'ならば、DMA完了割り込みが発生していると判断されます。ISRの中でこのこのレジスタの上位16bitをUSHORTサイズでライトアクセスして、0x0000にクリアしてください。
※ このとき、必ずUSHORTサイズでアクセスしてください。 割り込み発生レジスタの下位16bitにはユーザ用の割り込みステータスレジスタが配置されているので、ULONGサイズでアクセスすると、DMAとユーザ割り込みが同時に発生した場合にどちらかを取りこぼしてしまいます。
? ISRからDPC(遅延プロシージャ)の呼び出しを要求し、DPCの中で次のDMAをセットアップします。
ご注意
・DMA転送先のPC内のメモリアドレスは、OSのメモリ管理機構を使って、正しくセットしてください。
・正しくないアドレスにDMA転送すると、他のアプリケーションやシステム領域のメモリを破壊します。
・本DMAコアは32bit専用ですので、64bitOSには対応していません。
・これらのレジスタを不用意にアクセスしないでください。
Copyright(C) 2009 TokushuDenshiKairo Inc. All rights reserved.