AR# 51948

14.2 EDK/Zynq - PL で CIP pcore を使用し、カスタムのソフトウェア ドライバー コードを使用すると、ソース バッファーおよびデスティネーション バッファーを DDR に設定すると機能しない

説明

Zynq に対しカスタム IP を作成し、PL で追加します。CIP で生成されたドライバー ソフトウェア コードを使用し、テストを実行します。ソースバッファーおよびデスティネーション バッファーを DDR で設定すると機能しません。なぜですか。

ソリューション


これは、スタンドアロンの BSP ではデフォルトでキャッシュがイネーブルになっているためです。

解決策にはいくつかの方法があります。

1) main.c コードでキャッシュをディスエーブルにします。これで問題なく機能します。

#include "xil_cache.h"
Xil_DCacheDisable();

2) セルフテストの例で、DDR に書き込みをした後、次のステップに進む前にキャッシュを消去します。

for ( Index = 0; Index < CIP_AXI4_MASTER_SELFTEST_BUFSIZE; Index++ )
{
SrcBuffer[Index] = Index;
DstBuffer[Index] = 0;
}

xil_printf(" ******* flushing data cache!!! \n\r");
Xil_DCacheFlushRange((unsigned int)SrcBuffer, CIP_AXI4_MASTER_SELFTEST_BUFSIZE);
Xil_DCacheFlushRange((unsigned int)DstBuffer, CIP_AXI4_MASTER_SELFTEST_BUFSIZE);

xil_printf(" - start user logic master module to receive word from the source\n\r");

3) SRC バッファーのみを消去してから CIP を起動します。そして (キャッシュからではなく) メインの DDR から読み出しを強制的に実行するため比較する直前に、デスティネーション バッファーを無効にします。

for ( Index = 0; Index < CIP_AXI4_MASTER_SELFTEST_BUFSIZE; Index++ )
{
SrcBuffer[Index] = Index;
DstBuffer[Index] = 0;
}

xil_printf(" ******* flushing data cache for source only!!! \n\r");
Xil_DCacheFlushRange((unsigned int)SrcBuffer, CIP_AXI4_MASTER_SELFTEST_BUFSIZE);
xil_printf(" - start user logic master module to receive word from the source\n\r");
/**** more code from selftest ****/

xil_printf(" ******* invalidate destination data cache to force correct read!!! \n\r");
Xil_DCacheInvalidateRange((unsigned int)DstBuffer, CIP_AXI4_MASTER_SELFTEST_BUFSIZE);
/*** do the memory compare as in the original code ***/
AR# 51948
日付 11/20/2012
ステータス アクティブ
種類 一般
デバイス
ツール