DMPG1 & DMPG2

DMPG1( DAG Memory Page )はDAG1が生成するアドレスのページ(上位8ビット)部分として使います。下位24ビットはDAG1が計算して生成します。

DMPG2( DAG Memory Page )はDAG2が生成するアドレスのページ(上位8ビット)部分として使います。下位24ビットはDAG2が計算して生成します。

この二本を高級言語から直接扱うことはありません。

レジスタの構造

DMPGxは8ビット長です。DMPGと16ビットレジスタとの間でデータをやり取りする場合は右詰で転送し、上位は0フィル扱いになります。

DMPG1 & DMPG2

図1 レジスタの構造

この二本のレジスタの初期値は0です。このレジスタには構造はありません。

API

C/C++言語用に以下のインターフェースが用意されています。宣言はsysreg.hで行われています。

// 推奨しないAPI
// #include <sysreg.h>

sysreg_write(sysreg_DMPG1, 値)     // 値をDMPG1に代入します
変数 = sysreg_read(sysreg_DMPG1)   // DMPG1の値を取得します

sysreg_write(sysreg_DMPG2, 値)     // 値をDMPG2に代入します
変数 = sysreg_read(sysreg_DMPG2)   // DMPG2の値を取得します

ただし、上のインターフェースは使わないほうがいいでしょう。この二本はコンパイラのメモリーアクセスに強い影響を与えます。特にDMPG1は専用レジスタとして予約されていることを考えると、割り込み処理などに深刻な影響を与える可能性があります。

VisualDSP++3.0はC/C++言語から64KWより上のメモリー空間にアクセスするために次のAPIを用意しています。通常はこちらの関数を使えば用は足りるはずです。どちらの関数も第一引数はメモリーのページを、第二引数はページ内部のオフセットを与えます。書き込み関数の第三引数は書き込む値を与えます。

// #include <sysreg.h>

int external_memory_read( int page, void * address )                // 読み取り関数
void external_memory_write( int page, void * address, int value )   // 書き込み関数

レイテンシ

DMPGxのレイテンシは以下のとおりです。

命令 DMPG=value/reg;
レイテンシ 2

レイテンシが1のとき、直後の命令からその値を利用することができます。レイテンシが2以上のとき、直後の命令でその値を参照しようとすると、インターロック機構によって1サイクルのストールが発生します。なお、この表のレイテンシの数え方はHRとは異なっています。

参照情報

項目 マニュアルのページ等
解説 HR 4-6
レイテンシ HR 3-6
2191空挺団 | プログラム | EZ-KIT | こぼれ話 | アーキテクチャー | 命令 | レジスタ | DSP掲示板 | FAQ |