2008 年 3 月 ver. 1.0 SOPC Builder による高性能 DDR DDR2 DDR3 SDRAM の使用 Application Note 517 はじめに Altera の DDR DDR2 および DDR3 SDRAM 高性能コントローラ MegaCore ファンクションのバージョン 7.1 以降では SOPC Builder をサポートし SOPC Builder システムで DDR DDR2 または DDR3 SDRAM 高性能コントローラをインスタンス化することができます このアプリケーション ノートでは 以下について説明します SOPC Builder のシステム インタコネクト ファブリックおよび性能への影響の考慮 フル レートまたはハーフ レート SDRAM 高性能コントローラ システムおよびコンポーネントのクロック選択およびクロック クロッシング ブリッジ バースト リードおよびバースト ライト レイテンシおよびリードまたはライト アドレス指定の最適化方法 SOPC Builder における DDR2 SDRAM 高性能コントローラの実装 Nios II プロセッサおよびその他のペリフェラルの組み込み デザインのコンパイルおよびプログラミング ファイルの生成 開発ボードへのデザインのダウンロードおよびデザイン上でリードおよびライト トランザクションのテストのためのサンプル コード実行 f f f SOPC Builder システムの機能シミュレーションについて詳しくは AN 351: Nios II エンベデッド プロセッサ デザインのシミュレーション を参照してください SOPC Builder でのレガシー DDR または DDR2 SDRAM コントローラ MegaCore ファンクションの使用について詳しくは AN 398: SOPC Builder による DDR/DDR2 SDRAM の使用 を参照してください DDR DDR2 および DDR3 SDRAM 高性能コントローラについて詳しくは DDR および DDR2 SDRAM 高性能コントローラ ユーザーガイド および DDR3 SDRAM 高性能コントローラ ユーザーガイド を参照してください Altera Corporation 6.1 1 AN-517-1.0
SOPC Builder による高性能 DDR DDR2 DDR3 SDRAM の使用 SOPC Builder システムの考慮事項 SOPC Builder で DDR DDR2 または DDR3 SDRAM 高性能コントローラを統合する場合は 以下の注意点および制約を常に考慮してください フル レートまたはハーフ レート SDRAM 高性能コントローラ フル レートまたはハーフ レート SDRAM 高性能コントローラには 以下の定義があります フル レート コントローラは ローカル インタフェースに対して実際の SDRAM インタフェースの 2 倍の幅で フル SDRAM クロック レートでデータを供給します ハーフ レート コントローラは ローカル インタフェースに対して実際の SDRAM インタフェースの 4 倍の幅で SDRAM クロック レートの 1/2 のクロック レートでデータを供給します SDRAM 高性能コントローラをハーフ レート モードで実装すると 可能な最高の SDRAM クロック周波数が得られ より複雑なコア ロジックはこの周波数の 1/2 で動作させることが可能になります ユーザーは Nios II プロセッサを低速のハーフ レート メモリ速度で動作させながら I/O ピンあたりに要求される SDRAM 帯域幅を達成することにより デザインの複雑さを軽減することができます ただし 可能な場合は 一般的に 使用している SOPC Builder システムと同じクロック周波数でコアが動作するフル レート モードにコントローラをコンフィギュレーションするのが最適です フル レートとハーフ レートのコマンド動作 ハーフ レート コントローラを使用すると コマンドは遅くなることがあります 例えば DDR SDRAM デバイスでは多数のバンクを同時に開いておくことができます 各バンクには現在選択されているロウがあります 開いているバンクの選択されたロウ内で欄を変更するために 追加のバンク管理コマンドを発行する必要はありません アクティブ バンク内のロウの変更またはバンクの変更を行うと プロトコル ペナルティが課せられ プリチャージ (PCH) コマンドはアクティブ ロウまたはバンクを閉じて 次にアクティブ (ACT) コマンドが新しいロウまたはバンクの組み合わせを開く ( またはアクティブにする ) 必要があります このペナルティの持続時間は コントローラのクロック周波数 メモリのクロック周波数 およびメモリ デバイスの特性の関数です ある特定のシステムでメモリおよびコントローラのコンフィギュレーション変更の影響を計算することは 実行されるアクセスの性質に依存するため 重要な作業です 2 6.1 Altera Corporation
SOPC Builder システムの考慮事項 この例では 各コマンドは フル レート コントローラでは 1 クロック サイクルで実行されますが ハーフ レート コントローラでは 2 クロック サイクルが必要です バンクは PCH の後まで (trp) 後続の ACT コマンドを受け入れることはできません そのため ハーフ レート コントローラを使用すると それぞれのメモリ タイミング パラメータが同じであっても コマンドの発行は遅くなることがあります 時間指定メモリ パラメータ ハーフ レート SDRAM 高性能コントローラでは コントロール回路はハーフ レートでクロックされるため コントロール動作はフル レート モードの場合よりも遅くなります しかし メモリのクロック周波数および物理的特性は影響を受けません ハーフ レート モードを使用する場合 コントローラの時間指定メモリ パラメータが変更されます 例えば 次の場合です trcdmin = 20 ns 133 MHz のコントローラの場合 : tck = 7.5 ns 20/7.5 = 2.666 切り上げて 3 クロック サイクル (22.5 ns) ハーフ レートの 66 MHz コントローラの場合 : tck = 15 ns 20/15 = 1.33 切り上げて 2 クロック サイクル (30 ns) このように ハーフ レート モードではバンクおよびロウの変更は遅くなりますが 2 倍遅くなるわけではありません 選択されたメモリ デバイスおよびインタフェース クロック速度についてこの影響を見積もる最も容易な方法は ハーフ レートとフル レートの両方のデザインをシミュレーションし ロウを切り換えたときのレイテンシの増加を記録することです 一般的に バンク内のロウを切り換えたときにフル レート コントローラは 効率が約 14% 高くなります ハーフ レート コントローラはリード レイテンシが小さいため システム内でマスタによるバンク切り換えが頻繁には発生しない場合 ハーフ レート コントローラでも高い性能が得られます SOPC Builder では アービトレーション シェアを変えてマスタによるメモリ バンク切り換えを防止することで より最適なシステムを作成することができます Altera Corporation 6.1 3
SOPC Builder による高性能 DDR DDR2 DDR3 SDRAM の使用 クロック選択およびクロック クロッシング ブリッジ SOPC Builder が自動的にクロック ドメイン クロッシング ロジックを追加してレイテンシが増加することを防止するために SOPC Builder システム内のすべてのコンポーネントについて同じクロックを使用してクロッキングするのが理想的です SDRAM 高性能コントローラには PLL が既に内蔵されているため SOPC Builder のシステム クロックを コントローラおよびローカル インタフェース ロジックが使用するクロック altmemddr.sysclk に設定してください SOPC Builder には コントローラ PLL への入力クロックが表示されるだけで インタフェース クロックは表示されません 図 1 を参照してください 図 1. SOPC Builder の Avalon-MM スレーブおよびマスタ クロック選択の注 (1) Avalon s1 2 Avalon 図 1 の注 : (1) clk クロックは コントローラ PLL への入力クロックです (2) s1 クロックは記載されていませんが clk ドメインではなく altmemddr.sysclk クロック ドメイン上にあります 接続されているコンポーネントに対して異なる Avalon メモリ マップド (Avalon-MM) クロックが指定されている場合 SOPC Builder は 使用している SOPC Builder システムのデータ マスタと SDRAM 高性能コントローラ スレーブ インタフェースとの間に自動的にクロック ク 4 6.1 Altera Corporation
SOPC Builder システムの考慮事項 ロッシング アダプタを追加します クロック クロッシング アダプタは 異なるクロック ドメイン間で堅牢かつ安全なトランザクションを提供しますが これによってレイテンシが増加し 全帯域幅が制限されます SOPC Builder によるクロック アダプタの自動挿入を防止するには 以下のようにします 接続されている SOPC Builder のコンポーネントと SDRAM 高性能コントローラが同じ周波数で動作している場合は そのシステムの残りの部分へのクロックとして altmemddr.sysclk を使用します SOPC Builder によってクロック ドメイン クロッシング アダプタは追加されません 接続されている SOPC Builder のコンポーネントと SDRAM 高性能コントローラが異なる周波数で動作している場合 SDRAM 高性能コントローラとその他の SOPC Builder コンポーネントの間に Avalon- MM クロック クロッシング ブリッジを手動で挿入します Avalon-MM クロック クロッシング ブリッジを使用するには スレーブ クロックを使用中の SOPC Builder のシステム クロックに マスタ クロックを altmemddr.sysclk に設定します このコンポーネントは クロック ドメインのデカップリングに FIFO を使用し 自動挿入されたブリッジに比べて帯域幅効率がはるかに高くなります このブリッジのサイズと構造は 低いレイテンシで より最適化されたソリューションを実装するようにパラメータ指定することができます f 詳しくは Quartus II ハンドブック の メモリ マップド インタフェース用システム インタコネクト ファブリック の章および Avalon メモリ マップド ブリッジ の章の クロック ドメイン クロッシング の項を参照してください 1 Avalon-MM クロック クロッシング ブリッジは 周波数が同じで位相が異なる 2 つのクロックを使用している場合にも動作します Avalon-MM クロック クロッシング ブリッジを使用して フル レート コントローラをハーフ レートの SOPC Builder デザインに接続することができます その場合でも メモリ コントローラは Nios II の周波数の 2 倍のフル レートで動作できます したがって メモリ インタフェース コマンドは より高速で動作します 図 2 にクロック クロッシング ブリッジの例を示します Altera Corporation 6.1 5
SOPC Builder による高性能 DDR DDR2 DDR3 SDRAM の使用 図 2. クロック クロッシング ブリッジ Nios II M M JTAG UART S DMA M M S 75 MHz 150 MHz PIO S S M M S Avalon-MM Avalon-MM S SDRAM バースト リードおよびバースト ライト 表 1 に 各タイプの SDRAM 高性能コントローラのバースト長サポートを示します 表 1. バースト長サポート メモリ タイプフル レート モードハーフ レート モード DDR3 8 DDR2 4 4 DDR 2 または 4 4 バースト リードとバースト ライトの違いは次のとおりです 6 6.1 Altera Corporation
SOPC Builder システムの考慮事項 ハーフ レート モードの場合 Avalon-MM スレーブ インタフェースは SDRAM デバイスの 4 倍の幅です したがって 1 つの Avalon- MM トランザクションごとに SDRAM 上で 4 つのトランザクションが実行されます メモリ インタフェースは既に 1 つの Avalon- MM トランザクションごとにサポートされる最大のメモリ バースト サイズを使用しているため ローカル サイドでの Avalon-MM バースト リクエストは何の目的も果たしません フル レート モードの場合 各 Avalon-MM トランザクションによって生じる SDRAM トランザクションは 2 つだけであるため SDRAM 高性能コントローラで 1 つまたは 2 つの Avalon-MM バーストを使用することができます したがって 2 つの Avalon-MM バースト トランザクションを組み合わせて SDRAM 高性能コントローラでサポートされる 4 つのトランザクションをサポートすることができます 1 バーストが可能なマスタがスレーブよりも大きいバースト長をサポートしている場合 SOPC Builder は自動的にバースト長アダプタをパス内に挿入します 高性能を実現するために SOPC Builder の中でマスタ / スレーブ ペアのデータ幅が一致するようにしてください マスタ ポートが幅の異なるスレーブ ポートに接続されている場合は常に SOPC Builder は 異なるデータ幅を変換するアダプタ ロジックを自動的に挿入します Nios II プロセッサでは Avalon-MM インタフェースのデータ サイズは 32 ビットとするのが理想的です フル レート SDRAM 高性能コントローラの場合は ダブル データ レートのステージでデータ幅が 2 倍になるため 外部メモリ幅は 16 ビットが最適です ハーフ レート SDRAM 高性能コントローラの場合は ダブル データ レートとハーフ レートの両方のステージでデータ幅が 2 倍になるため 外部メモリ幅は 8 ビットが最適です 以下のようにデータ キャッシュ ライン サイズをメモリ コントローラのバースト長と一致させるのが理想的です 4 バイト ライン = バースト 1(32 ビット ワード ) 16 バイト ライン = バースト 4 32 バイト ライン = バースト 8 バースト信号の使用を避けるために データ バス アービトレーション プライオリティを設定することができます Altera Corporation 6.1 7
SOPC Builder による高性能 DDR DDR2 DDR3 SDRAM の使用 マルチマスタ SDRAM で最高のスループットとレイテンシを達成するには コントローラを最小数のマスタに接続し これらのマスタを最小数のスレーブで共有してください 接続が少ないほど SOPC Builder で自動挿入されるデータ マルチプレクサの複雑さが低減され Avalon-MM インタフェースの f MAX が高くなります 1 Avalon-MM インタフェースの f MAX が制限要因になる場合は パイプライン ブリッジを挿入することで レイテンシを犠牲にして f MAX を向上させます マスタ / スレーブ ペアは バーストの全持続期間にわたりロックされるため 他のマスタはどれも バーストが完了するまで そのバーストのスレーブ ターゲットへのアクセスを許可されません 重要なメモリ接続は システムの残りの部分から分離する必要があります 1 つのマスタは ライト バーストが完了するまで SDRAM 高性能コントローラをロックすることができます これには数サイクルの時間がかかり この間 SDRAM 高性能コントローラは他のリクエストを受け入れることができません ライト バースト コマンドは すべてのバースト データが SDRAM 高性能コントローラに渡されたときに完了します リード バーストの場合 コントローラはバースト全体を全帯域幅で素早く逆転送し 直ちに新しいリクエストの受け入れが可能になります リードおよびライト アドレッシングとレイテンシ 確定的なアクセス パターンを持ったシステムでは バンクおよびロウの変更数を最小限に抑えることができます 例えば このためにメモリ マップを適切に配置します よりランダムなアクセス パターンを持ったシステムでは ( エンベデッド SOPC Builder タイプのシステムで一般的 ) バンクおよびロウの変更を最小限にすることは難しく レイテンシの増大 ( 常にアクティブ バンク内のロウを変更 またはバンクを変更することによる ) が大きな影響を及ぼします ハーフ レート コントローラでは 最適でないキャッシュ実装によってサイクルが浪費される可能性があります 以下の対処を常に検討する必要があります コントローラの Avalon-MM インタフェース幅を Avalon-MM マスタ インタフェース幅と一致させる ロウのアドレス指定時間を低減するために シーケンシャルでないアドレッシングを最小限にする Nios II のキャッシュ ライン サイズをメモリのバースト長と一致させる 8 6.1 Altera Corporation
SOPC Builder を使用した DDR2 SDRAM 高性能コントローラの実習 アービトレーション プライオリティを正しく設定する ブリッジを挿入することにより レイテンシを犠牲にして f MAX を向上させる アービトレーション停止が発生する可能性がある場合 マルチマスタ デザインを最小限にする 1 マルチマスタ デザインでは メモリは 全マスタで同時に利用可能ではありません アービトレーション プライオリティを正しく設定すると 不要なメモリ アクセスが防止されます 例えば Nios II 命令のマスタ アービトレーション プライオリティは常に 8 に設定してください これは Nios II 命令は 常に 8 個のシーケンシャル アドレスにアクセスを試みるためです キャッシュ ライン サイズに応じてデータ マスタ アービトレーション プライオリティを設定してください アービトレーション プライオリティ値をデフォルトのままにしないでください SOPC Builder を使用した DDR2 SDRAM 高性能コントローラの実習 このアプリケーション ノートは Quartus II ソフトウェアおよび SOPC Builder を理解している方を対象にしています このアプリケーション ノートを使用するには 使用中のコンピュータに以下のソフトウェアがインストールされていることを確認してください Quartus II v7.2 ModelSim-Altera 6.1g 以降 DDR2 SDRAM 高性能コントローラ v7.2 Nios II エンベデッド デザイン スイート (EDS)v7.2 このデザインは Cyclone III FPGA 開発キットを対象にしています その他のサポートされているデバイス ファミリや開発キットを対象にすることができます f Cyclone III FPGA 開発キットについて詳しくは www.altera.com/products/devkits/altera/kit-cyc3.html を参照してください プロジェクト例の作成 この項では 新規の Quartus II プロジェクトおよび SOPC Builder システムの作成方法を示します 新規 Quartus II プロジェクトの作成 Quartus II ソフトウェアで New Project Wizard を使用して新規プロジェクトを作成します このとき デバイス タイプが Cyclone III, EP3C120F780C7 に設定されていることを確認してください Altera Corporation 6.1 9
SOPC Builder による高性能 DDR DDR2 DDR3 SDRAM の使用 1 プロジェクトのパスにスペースや拡張文字を含めないでください SOPC Builder システムの作成 SOPC Builder システムを作成するには 以下のステップに従います 1. Tools メニューの SOPC Builder をクリックします 2. Create New System ダイアログ ボックスの System Name に sopc_top を入力します Target HDL で Verilog を選択して OK をクリックします 3. System Contents タブで Memories and Memory Controllers を展開します SDRAM を展開します DDR2 SDRAM High Performance Controller を選択し Add をクリックします DDR2 SDRAM 高性能コントローラのウィザードが開きます 4. Speed Grade で 7 を選択し 選択したデバイスと一致させます 5. PLL reference clock frequency に 50 MHz を入力し CLKIN50 信号と一致させます 6. Memory clock frequency に 150 MHz を入力します 1 150 MHz は DDR2 SSTL-18 class I トップおよびボトム I/O C7 スピード グレードの Cyclone III デバイスでサポートされる最大周波数です 7. Local interface clock frequency では Half を選択します 8. Memory vendor で Micron を選択します 9. Memory format で Discrete Device を選択します 10. Memory Presets で Micron MT47H32M16CC-3 x4 + MT47H32M8BP-3 x1 を選択します ( 図 3 を参照 ) 1 このメモリ プリセットは Cyclone III 開発ボードおよび Stratix II GX PCIe 開発キットの両方が使用するコンフィギュレーションと正確に一致するので アルテラによって DDR2 SDRAM 高性能コントローラに組み込み済みです 10 6.1 Altera Corporation
SOPC Builder を使用した DDR2 SDRAM 高性能コントローラの実習 図 3. Memory Settings 11. Modify parameters をクリックし 以下のパラメータを変更します Output clock pairs from FPGA で 1 pairs を選択します Memory interface DQ width で 8 bits を選択し Avalon-MM に 32 ビットの幅を与えます これは Nios II プロセッサへの接続に最適です Memory drive strength setting で Reduced を選択します (DQ は 低負荷のポイントツーポイント接続です ) Altera Corporation 6.1 11
SOPC Builder による高性能 DDR DDR2 DDR3 SDRAM の使用 Memory on-die termination (ODT) setting で Disabled を選択します ( ディスクリート Class I 終端は開発ボードに取り付け済みです ) Memory CAS latency setting で 3.0 cycles を選択します ( この DDR2 SDRAM は 200 MHz 以下の周波数に対して CAS = 3 をサポートします ) 12. DDR2 SDRAM 高性能コントローラ ウィザードで OK をクリックしてから Finish をクリックします 図 4. Preset Editor 12 6.1 Altera Corporation
SOPC Builder を使用した DDR2 SDRAM 高性能コントローラの実習 SOPC Builder コンポーネントの追加 System Contents タブからコンポーネントを追加するには 以下のステップに従います 1. On-Chip Memory を展開し On-Chip Memory を選択して Add をクリックします Total memory size に 64 KBytes を入力します Finish をクリックします 2. On-Chip Memory をもう一度選択し Add をクリックします a. Total memory size を 4096 Bytes に設定します b. Finish を選択します c. この 2 つ目の on-chip memory を右クリックし Rename をクリックして dma_read_memory を入力し Enter を押します 3. System メニューの Auto-Assign Base Addresses をクリックします 4. Nios II Processor を選択して Add をクリックします a. Nios II/s を選択します b. Reset Vector および Exception Vector で onchip_mem を選択します ローカルのオンチップ メモリに Nios II 命令コードが保持されている場合 SDRAM インタフェースに要求されるアービトレーションは少なくなり その結果 より最適な Avalon- MM 構造が得られます c. Reset Vector Offset を 0x20 に Exception Vector Offset を 0x40 に変更します c コントローラは リセットされるごとにメモリ インタフェース キャリブレーションを実行し そのときにアドレス 0x0 ~ 0x1f に書き込みます システム リセット中にメモリ内容を元のまま保持したい場合は 0x20 以下のメモリ アドレスを使用しないようにします リセットするたびにフラッシュから SDRAM の内容をリロードする場合は このステップは不要です d. Finish をクリックします 5. Interface Protocols を展開し Serial を展開して JTAG UART を選択し Add をクリックします Altera Corporation 6.1 13
SOPC Builder による高性能 DDR DDR2 DDR3 SDRAM の使用 a. リードとライトの両方の FIFO について Buffer Depth (bytes) に 64 を選択し IRQ threshold に 8 を入力します b. Finish をクリックします 6. Peripherals を展開し Microcontroller Peripherals を展開して PIO (Parallel I/O) を選択し Add をクリックします a. Width に 8 bits を入力します b. Direction で Output ports only を選択します c. Finish をクリックします 7. Memories and Memory Controllers を展開し DMA を展開して DMA Controller を選択し Add をクリックします a. Enable burst transfers をオンにし Maximum burst size で 512 words を選択します b. Advanced タブをクリックします Advanced タブで doubleword および quadword をオフにします c. Finish をクリックします 1 PLL コンポーネントは DDR2 SDRAM 高性能コントローラに含まれているため SOPC Builder デザインに追加しないでください 8. バス リンクを設定します ( 図 5 を参照 ) a. altmemddr と dma_read_memory の両方に DMA read_master および write_master を接続します 1 アドレスのオーバーラップを警告するメッセージが表示される場合 System メニューで Auto-Assign Base Addresses をクリックします 1 IRQ のオーバーラップを警告するメッセージが表示される場合 System メニューで Auto-Assign IRQs をクリックします 14 6.1 Altera Corporation
SOPC Builder を使用した DDR2 SDRAM 高性能コントローラの実習 b. altmemddr が外部クロック clk でクロックされていること および周波数が外部オシレータと一致していること (Cyclone III 開発ボードの場合 50 MHz) を確認します c. 不要なクロック ドメイン クロッシング ロジックを回避するために 他のすべてのモジュールが altmemddr_sysclk でクロックされるようにします f SOPC Builder のシステム インタコネクト ファブリックについて詳しくは Quartus II ハンドブック の メモリ マップド インタフェース用システム インタコネクト ファブリック の章を参照してください 図 5. SOPC Builder の最終システム接続 SOPC Builder システムの生成 システムを生成するには 以下のステップに従います 1. SOPC Builder で Next をクリックします Altera Corporation 6.1 15
SOPC Builder による高性能 DDR DDR2 DDR3 SDRAM の使用 2. Simulation をオフにします シミュレータのプロジェクト ファイルを作成します f SOPC のシミュレーションおよびテストベンチ オプションについて詳しくは Quartus II ハンドブック Volume 4 の SOPC Builder の章 および AN351: Nios II システムのシミュレーション を参照してください 3. SOPC Builder で Generate をクリックします Save をクリックします 生成が完了すると 以下のメッセージが表示されます SUCCESS: SYSTEM GENERATION COMPLETED. 4. SOPC Builder で Exit をクリックします トップレベル デザイン ファイルの作成 概念上 SOPC Builder システムはデザインのコンポーネントと見なすことができます これは 唯一のコンポーネントである場合も 多くのコンポーネントの 1 つである場合もあります したがって SOPC Builder システムが完成したときに トップレベル デザインに追加しなければなりません トップレベル デザインは ユーザーが希望する HDL 言語とするか または単に.bdf 回路図デザインとすることもできます この実習では トップレベル デザインは 追加コンポーネントの無い SOPC Builder システムを囲む単純なラッパー ファイルです トップレベル デザイン ファイルは 単にピンの命名規則とポート接続を定義するだけです 図 6 に SOPC Builder のトップレベル ブロック図を示します 16 6.1 Altera Corporation
SOPC Builder を使用した DDR2 SDRAM 高性能コントローラの実習 図 6. SOPC Builder のトップレベル ブロック図 global_reset clock_source reset global_reset Nios II sopc_top JTAG UART DMA SDRAM PIO PIO SDRAM SDRAM 高性能コントローラは トップレベルのメモリ インタフェース ピンへのアサインメントを行う必要があります これらのアサインメントは 自動生成されたスクリプトおよび制約ファイルを使用して適用されます 制約を機能させるには ピン名とピン グループ アサインメントが一致しなければなりません 一致しない場合は デザインをコンパイルするときに適合しません デフォルトでは ピン名は mem_* です 予想されるデフォルトのピン名は 生成された altmemddr_example_top ファイルに記載されています オプションで デフォルトのピン命名規則にプリフィックスを付けることができます すべての SDRAM 高性能コントローラで 独立のデザイン例 altmemddr_ example_top が生成されます このファイルは コントローラとサンプル ドライバだけを含んでいます ( 図 7 を参照 ) このファイルは SOPC Builder システムをインスタンス化しませんが 以下のうちの 1 つに使用することができます メモリ コントローラのデフォルトのピン名を特定する デザインの残りの部分に対する開始点として使用する Altera Corporation 6.1 17
SOPC Builder による高性能 DDR DDR2 DDR3 SDRAM の使用 図 7. デザイン例 DDR2 SDRAM ALTMEMPHY DDR2 SDRAM altmemddr_example_top をテンプレートとして使用し HDL トップレベル デザインを作成することができます 必要に応じて altmemddr_example_top ファイル内でプリフィックスを追加するだけでピン名を編集することができます ユーザーは サンプル ドライバおよび DDR2 SDRAM 高性能コントローラを置き換えて SOPC Builder で生成されたシステムをインスタンス化しなければなりません アルテラは 参照資料として正しいピン名が入った.bdf トップレベル デザインの例を提供しています ( 図 8 を参照 ) mem_clk[0] および mem_clk_n[0] ピンは 双方向です (ALTMEMPHY メガファンクションの模擬パスのため ) 18 6.1 Altera Corporation
SOPC Builder を使用した DDR2 SDRAM 高性能コントローラの実習 図 8. Quartus II トップレベル プロジェクト Quartus II.bdf の回路図を使用して SOPC Builder システムのトップレベル デザインを作成するには 以下の手順に従います 1. Quartus II ソフトウェアで File メニューの New をクリックします 2. Block Diagram/Schematic File を選択し OK をクリックします ブランクの.bdf である Block1.bdf が開きます 3. File メニューの Save As をクリックします Save As ダイアログ ウィンドウで Save をクリックします 1 Quartus II ソフトウェアは 自動的に.bdf のファイル名をユーザーのプロジェクト名に設定します 4. ブランクの.bdf を右クリックし Insert をポイントして Symbol をクリックし Symbol ダイアログ ボックスを開きます 5. Libraries の下にある Project を展開し sopc_top を選択して OK をクリックします 6. SOPC Builder システム コンポーネントの外形を <project>.bdf の中に置き 左クリックします Altera Corporation 6.1 19
SOPC Builder による高性能 DDR DDR2 DDR3 SDRAM の使用 7. SOPC Builder システム コンポーネントを右クリックし Generate Pins for Symbol Ports をクリックすると 回路図の記号にピンおよびネットが自動的に追加されます 8. 自動生成されたピン名は SOPC Builder システムのピン名と一致します altmemddr_example_top の中の対応するピン名と一致させるために それぞれのピンを選択して ピン名を手動で変更します 1 このデザイン例について SOPC Builder システムでは 以下の不要な信号が組み込まれますが ユーザーはその接続を切り離すことができます altmemddr_phy_clk_out local_init_done_from_the_altmemddr local_refresh_ack_from_the_altmemddr local_wdata_req_from_the_altmemddr reset_phy_clk_n_from_the_altmemddr 1 以下の単一ベクタ信号は [0] ベクタのピン名が必要です それ以外の場合 シミュレーションは失敗することがあります mem_dm mem_dqs mem_clk mem_cke mem_cs_n mem_odt 9. SOPC Builder システムには reset_n と global_reset_n_to_ the_altmemddr の 2 つのリセット入力があります この 2 つの信号を 1 つのピン (global_reset_n) に接続します 10. クロック信号は 必ず clock_source に名前を変更してください f 信号について詳しくは ALTMEMPHY メガファンクション ユーザーガイド を参照してください 11. out_port_from_the_pio[7..0] の名前を pio[7..0] に変更します 12. File メニューの Save をクリックして 変更を保存します 13. Project メニューの Set as Top-Level Entity をクリックします 20 6.1 Altera Corporation
SOPC Builder を使用した DDR2 SDRAM 高性能コントローラの実習 Quartus II プロジェクト設定の更新 Quartus II プロジェクトで最適な結果を得るには 以下の手順に従います 1. Assignments メニューの Settings をクリックします Category リストの Fitter Settings を選択します Fitter effort で Standard Fit (Highest Effort) を選択します 2. Category リストの Analysis and Synthesis Settings を選択します Optimization Technique で Speed を選択します 3. Category リストで Device を選択します Device and Pin Options をクリックします Unused Pins タブをクリックし Reserve all unused pins で As input tri-stated with weak pull-up resistor を選択します 4. Voltage タブをクリックし Default I/O standard で 選択した SDRAM インタフェースと同じ VCCIO 電圧を選択します (DDR2 SDRAM の場合 1.8 V を選択します ) OK をクリックします 5. Category リストの Timing Analysis Settings を選択し TimeQuest Timing Analyzer During Compilation を選択します 6. Category リストの Timing Analysis Settings を展開し TimeQuest Timing Analyzer を選択します 自動生成された altmemddr_phy_ddr_timing.sdc ファイルに移動し Add をクリックします OK をクリックします トップレベル デザインのピン配置の指定 どの DDR SDRAM インタフェースでも 信号は正しいピン タイプおよびグループ上に配置する必要があります トップレベル デザインのピン配置を指定するには 以下の手順に従います 1. Processing メニューの Start をポイントして Start Analysis and Synthesis をクリックします 2. ピンの I/O 規格アサインメントを追加します a. デフォルトのピン名を使用している場合は <variation_name>_ pin_assignments.tcl を実行します Tools メニューの Tcl Scripts をクリックし <variation name>_pin_ssignments.tcl を選択して Run をクリックします または Altera Corporation 6.1 21
SOPC Builder による高性能 DDR DDR2 DDR3 SDRAM の使用 b. ピン名を変更する ( プリフィックスの変更のみ ) 必要がある場合は Quartus II Pin Planner を使用して Import an existing custom megafunction を実行します Assignment メニューで Pin Planner をクリックします Node Name の下の任意の場所で右クリックして Create/Import Megafunction を選択します ( 図 9 を参照 ) Import an existing custom megafunction を選択して <variation name>.ppf ファイルを選択します 使用したいプリフィックスを Instance name に入力します ( 図 10 を参照 ) 図 9. Pin Planner によるメガファンクションの作成 / インポート 22 6.1 Altera Corporation
SOPC Builder を使用した DDR2 SDRAM 高性能コントローラの実習 図 10. プリフィックスの追加 f DDR DDR2 および DDR3 SDRAM 高性能コントローラのピンの命名について詳しくは DDR および DDR2 SDRAM 高性能コントローラ ユーザーガイド および DDR3 SDRAM 高性能コントローラ ユーザーガイド を参照してください 3. Quartus II ソフトウェアがユーザーのデザインに正しく適合し 正しいタイミング解析が得られるようにするために すべてのピンを割り当ててください Cyclone III 開発ボードでピン位置を割り当てるには アルテラが提供する c3_host_ddr2_sopc_pins.tcl ファイルを実行するか または Pin Planner または Assignment Editor のいずれかを使用して ピン位置を手動で割り当てます 1 SDRAM 高性能コントローラで自動生成されたスクリプトは ピン位置の割り当てを行いません 1 デザイン サイクルの中のデザイン調査の段階にあって PCB でピン位置が定義されていない場合 最初のピン制約のセットは手動で定義する必要がありますが これは開発プロセス中に より具体的なものになる可能性があります ピン位置を手動で割り当てるには 以下の手順に従います 1. Pin Planner を開きます Assignments メニューで Pin Planner をクリックします 2. DQ および DQS ピンを割り当てます Altera Corporation 6.1 23
SOPC Builder による高性能 DDR DDR2 DDR3 SDRAM の使用 a. デザインで使用するデバイスの DQS ピン グループを選択するには デザインの中の各 DQS ピンを Pin Planner で要求される DQS ピンに割り当てます 次に Quartus II Fitter は 対応する DQ 信号を各グループ内の適切な DQ ピンに自動的に配置します Pin Planner の中で DQS グループを見るには 右クリックし Show DQ/DQS Pins を選択して In x8/x9 Mode をクリックします Pin Planner で 各 DQS グループは異なる色で 異なる凡例を付けて表示されます S = DQS ピン Sbar = DQSn ピン および Q = DQ ピン ( 図 11 を参照 ) 1 ほとんどの DDR2 SDRAM デバイスは x8/x9 モードで動作しますが いくつかの DDR2 SDRAM デバイスは x4 モードで動作します 使用している特定のメモリ デバイスのデータシートを参照してください b. 使用しているメモリ デバイスの DQ グループ幅 (DQ ピンの数 / DQS ピンの数 ) と一致するように DQ モードを選択してください DQ モードはメモリ インタフェースの幅とは無関係です 1 各グループ内の DQ グループの順番および DQ ピンの順番は重要ではありません しかし DQ ピンはそれぞれ対応するストローブ ピンと同じグループ内に配置する必要があります 24 6.1 Altera Corporation
SOPC Builder を使用した DDR2 SDRAM 高性能コントローラの実習 図 11. Quartus II Pin Planner DQ/DQS ピンの表示 x8/x9 モード 3. DM ピンをそれぞれの対応する DQ グループ内に配置します 4. アドレスおよび制御 / コマンド ピンを 理想的にはデバイスの mem_clk ピンと同じバンク内または同じ側にある 予備 I/O ピンのいずれかに配置します 5. mem_clk ピンは 隣接する通常の I/O ピンを使用するようにしてください CK/CK# ピン ペアのための差動 I/O ペアが理想的です 差動 I/O ペアを確認するには Pin Planner 内で右クリックし Show Differential Pin Pair Connections を選択します ピン ペアは それぞれペアとなるピンの間に赤線が表示されます Altera Corporation 6.1 25
SOPC Builder による高性能 DDR DDR2 DDR3 SDRAM の使用 6. clock_source ピンは SDRAM コントローラの PLL/DLL ペアへの直接接続により専用の PLL クロック入力ピン上に配置します PLL/DLL ペアは 通常 デバイスのメモリ インタフェースと同じ側にあります この推奨事項によって PLL のジッタが小さくなり グローバル クロック リソースが節約され タイミングおよびフィッタ エフォートが緩和されます 7. global_reset_n ピンを ( 高ファンアウト信号と同様に ) 専用のクロック ピン上に配置します f f Quartus II Pin Planner の使い方について詳しくは Quartus II ハンドブック Volume 2 の I/O Management の章を参照してください Cyclone III の外部メモリのピン選択について詳しくは Cyclone III デバイス ハンドブック の Cyclone III デバイスの外部メモリ インタフェース の章を参照してください 差動 DQS モードを備えた Stratix III デバイスの DDR2 SDRAM は DIFFIO_RX が可能なピン ペア上に mem_clk[0]/mem_clk_n[0] が必要です Stratix III デバイスの DDR3 SDRAM インタフェースは DIFFIO_RX 機能を備えた DQ または DQS ピン ペアに mem_clk[0]/mem_clk_n[0] が必要です f Stratix III の外部メモリのピン選択について詳しくは Stratix III デバイス ハンドブック の Stratix III デバイスの外部メモリ インタフェース の章を参照してください デザインのコンパイル デザインをコンパイルするには Processing メニューの Start Compilation をクリックします メモリ インタフェースのタイミング確認 メモリ インタフェースのタイミングを確認するには 以下の手順に従います 1. Tools メニューの Tcl Scripts をクリックします 2. <variation name>_phy_report_timing.tcl を選択し Run をクリックします 26 6.1 Altera Corporation
SOPC Builder を使用した DDR2 SDRAM 高性能コントローラの実習 開発プラットフォーム上でのデザインのテスト 開発プラットフォーム上でデザインをテストするには 以下の手順に従います 27 ページの SignalTap II ロジック アナライザの追加 29 ページの プロジェクトのコンパイル 30 ページの タイミング検証 SignalTap II ロジック アナライザの追加 SignalTap II ロジック アナライザは システム内のリードおよびライト動作を表示します f SignalTap II ロジック アナライザの使用について詳しくは 以下の資料を参照してください Quartus II ハンドブック の SignalTap II エンベデッド ロジック アナライザを使用したデザインのデバッグ の章 AN 323: SOPC Builder システムでの SignalTap II エンベデッド ロジック アナライザの使用 AN 446: SignalTap II ロジック アナライザを使用した Nios II システムのデバッグ SignalTap II ロジック アナライザを追加するには 以下の手順に従います 1. Tools メニューの SignalTap II Logic Analyzer をクリックします 2. Clock ボックスの横にある Signal Configuration ウィンドウで をクリックします (Node Finder を参照します ) 3. Named ボックスに *phy_clk を入力して Filter で SignalTap II: pre-synthesis を選択して List をクリックします 4. Nodes Found の中で sopc_top:inst altmemddr:the_altmemddr phy_clk を選択し > をクリックして 信号を Selected Nodes に追加します 5. OK をクリックします 6. Signal Configuration の下で以下の設定を指定します Sample depth で 512 を選択する RAM タイプで Auto を選択する (Stratix III デバイスのみ ) Trigger flow control で Sequential を選択する Altera Corporation 6.1 27
SOPC Builder による高性能 DDR DDR2 DDR3 SDRAM の使用 Trigger position で Center trigger position を選択する Trigger conditions で 1 を選択する 7. Edit メニューの Add Nodes をクリックします 8. Named ボックスに *local* を入力することによって特定のノードを検索して Filter で SignalTap II: pre-synthesis を選択して List をクリックします 9. Nodes Found の中で以下のノードを選択し > をクリックして Selected Nodes に追加します local_address local_rdata local_rdata_valid( リード / ライト データを比較するための代替トリガ ) local_read_req local_ready local_wdata local_wdata_req local_write_req( トリガ ) 1 DDR SDRAM インタフェース信号は SignalTap II ロジック アナライザに追加しないでください これらの信号に対する負荷が大きくなり タイミング解析に悪影響を与えます 10. OK をクリックします 11. SignalTap II のロジック サイズを小さくするために 以下のバス信号に対して Trigger Enable をオフにします local_address local_rdata local_wdata 12. local_write_req 信号の Trigger Conditions を右クリックし Rising Edge を選択します 図 12 に 完成した SignalTap II ロジック アナライザを示します 28 6.1 Altera Corporation
SOPC Builder を使用した DDR2 SDRAM 高性能コントローラの実習 図 12. SignalTap II ロジック アナライザ 13. File メニューの Save をクリックして SignalTap II の.stp ファイルをユーザーのプロジェクトに保存します 1 Do you want to enable SignalTap II file stp1.stp for the current project というメッセージが表示されたら Yes をクリックします プロジェクトのコンパイル SignalTap II ロジック アナライザに信号を追加した後 デザインを再コンパイルし Processing メニューの Start Compilation をクリックします Altera Corporation 6.1 29
SOPC Builder による高性能 DDR DDR2 DDR3 SDRAM の使用 タイミング検証 デザインがコンパイルされた後 TimeQuest のタイミング解析が合格することを確認します この FPGA タイミング解析に加えて PCB またはシステムの SDRAM タイミングをチェックします タイミング解析を実行するには *_phy_report_timing.tcl スクリプトを実行します 1. Tools メニューの Tcl Scripts をクリックします 2. <variation name>_phy_report_timing.tcl を選択して Run をクリックします 開発ボードの接続 Cyclone III 開発ボードを 使用しているコンピュータに接続します Cyclone III 開発ボードについて詳しくは Cyclone III 開発キット ユーザーガイド を参照してください オブジェクト ファイルのダウンロード Tools メニューの SignalTap II Logic Analyzer をクリックします SignalTap II ダイアログ ボックスが表示されます SOF Manager には < ユーザーのプロジェクト名 >.sof ファイルが入っているはずです SOF Manager に正しいファイルを追加するには 以下の手順に従います 1.... をクリックして Select Program Files ダイアログ ボックスを開きます ( 図 13 を参照 ) 2. < ユーザーのプロジェクト名 >.sof を選択します 3. Open をクリックします 4. Program Device ボタンをクリックして ファイルをダウンロードします ( 図 13 を参照 ) 30 6.1 Altera Corporation
SOPC Builder を使用した DDR2 SDRAM 高性能コントローラの実習 図 13. SignalTap II ダイアログ ボックスでの SRAM オブジェクト ファイルのインストール Nios II IDE の組み込み プロジェクトの Nios II プロセッサにテスト コードを追加し このプログラムを使用して簡単なテストを実行することができます メモリ テストを行う場合 読み出しと書き込みは キャッシュされたメモリからではなく 外部 DDR SDRAM から行わなければなりません 以下の 3 通りの方法によって Nios II のキャッシュされたメモリを使用しないようにします このプロジェクト例で使用している Nios II/s のように キャッシュ メモリを搭載していない Nios II プロセッサを使用する alt_remap_uncached ファンクションを使用する Nios II IDE の起動 NiosII IDE を起動するには 以下の手順に従います 1. Tools メニューの SOPC Builder をクリックします 2. System Generation タブをクリックします 3. Nios II IDE をクリックします 1 初めて IDE を実行する場合は Workbench をクリックします 4. File メニューの Switch Workspace をクリックして ユーザーのプロジェクト ディレクトリを選択します 5. File メニューで New をポイントして Project をクリックします Altera Corporation 6.1 31
SOPC Builder による高性能 DDR DDR2 DDR3 SDRAM の使用 6. Altera Nios II を展開して Nios II C/C++ Application を選択し Next をクリックします 7. Select Project Templates の下にある Blank Project を選択し Next をクリックします 8. SOPC Builder システムの.ptf が < ユーザーのプロジェクト パス >/< ユーザーの SOPC トップ >.ptf になっていることを確認します 9. Next をクリックし Finish をクリックします 10. Windows Explorer で アルテラが提供した main.c を blank_project_0 ディレクトリにドラッグします f main.c のテスト プログラム例を見るには 42 ページの 付録 :main.c テスト プログラム ファイルの例 を参照してください このプログラムは JTAG UART からコマンドを取得して実行する単純なループで構成されています 表 2 に Nios II の C コードに送られるコマンドを示します 1 コマンドは以下のフォーマットとする必要があり スイッチ A B C D は大文字で入力しなければなりません アドレスおよびデータの文字列は どちらも必ず 8 桁でなければなりません 表 2. コマンド コマンドフォーマット説明例 Switch A スイッチ データ LED を制御します A000000FF 最後の 2 バイトによって 8 個の LED すべてを制御します LED はボード上でアクティブ Low です Switch B スイッチ アドレス データ メモリ内のアドレス オフ セット位置に 1 回の書き込 みを実行します B を入力し その後に 00000000 続いて 00000001 を入力すると SDRAM のメモリ アドレス位置 00000000 に 00000001 が書き込まれます 32 6.1 Altera Corporation
SOPC Builder を使用した DDR2 SDRAM 高性能コントローラの実習 表 2. コマンド コマンドフォーマット説明例 Switch C スイッチ アドレス メモリ内のアドレス オフ セット位置で 1 回の読み出 しを実行します Switch D スイッチ 転送元アドレス 転送先アドレス 1 番目のアドレス位置へのインクリメンタル ライトを実行し その後 1 番目のアドレス位置から 2 番目のアドレス位置への DMA バースト転送を行います このバーストは 512 ワード つまり 2048 バイトの固定長です C を入力し その後に 00000000 を入力すると SDRAM のアドレス オフセット位置 00000000 のメモリの内容が読み出されます D0200100000000000は DMA リード メモリにインクリメント パターンをロードし 次に SDRAM 高性能コントローラに DMA バースト転送します SOPC Builder コンポーネントのアドレス位置は SOPC Builder ウィンドウから直接読み出すことができます ( 図 14 を参照 ) Altera Corporation 6.1 33
SOPC Builder による高性能 DDR DDR2 DDR3 SDRAM の使用 図 14. SOPC Builder コンポーネントのアドレス SDRAM DMA プロジェクト設定のセットアップ Nios II プロジェクトの設定をセットアップするには 以下の手順に従います 1. Nios II C/C++ Projects タブで blank_project_0 を右クリックして System Library Properties をクリックします 2. Properties ダイアログ ボックスの左側のリストにある System Library をクリックします 3. ライブラリ プロジェクトのフットプリント サイズを最適化するために System Library Contents の下にある Reduced device drivers をオンにします 4. Linker Script の下にある すべてのメモリ オプションで onchip_mem を選択します オンチップ メモリが 実行可能ファイルに対するターゲット メモリ空間になります 34 6.1 Altera Corporation
SOPC Builder を使用した DDR2 SDRAM 高性能コントローラの実習 5. システム ライブラリに割り当てられるメモリ サイズを小さくするために Max file descriptors に 4 を入力します 図 15 に Properties ダイアログ ボックスを示します 図 15. Nios II プロジェクトの設定 6. OK をクリックします 7. blank_project_0 を右クリックし Run As をポイントして Nios II Hardware をクリックします Nios II C/C++ IDE により このテスト プログラム例がコンパイルされます 使用しているコンピュータに 2 本以上の JTAG ダウンロード ケーブルが接続されている場合は JTAG エラーが表示されることがあります JTAG エラーが表示された場合は 以下の手順に従います 1. Nios II IDE の Run メニューの RUN... をクリックします Target Connection タブをクリックして JTAG cable connection を修正します ( 図 16 を参照 ) Altera Corporation 6.1 35
SOPC Builder による高性能 DDR DDR2 DDR3 SDRAM の使用 2. blank_project_0 を右クリックし Run As をポイントして Nios II Hardware をクリックします 図 16. JTAG ダウンロード ターゲットの接続の設定 システムのテスト システムの正常動作を確認するには 以下のテストを実行します SignalTap II Trigger を local_write_req に設定する SignalTap II ロジック アナライザを使用して ライト動作をキャプチャします ライト動作を表示するには 以下の手順に従います 1. SignalTap II の Setup タブで local_write_req の立ち上がりエッジでのトリガを選択します ( 図 17 を参照 ) 36 6.1 Altera Corporation
SOPC Builder を使用した DDR2 SDRAM 高性能コントローラの実習 図 17. local_write_req 信号に対するトリガの設定 2. Run Once Analysis をクリックして ライト要求をキャプチャします 3. Nios II コマンド コンソールで 以下のコマンドを入力します B0000000000000001 4. SignalTap II ウィンドウに戻り 時間 0 のときに以下のようになっていることを確認します ( 図 18 を参照 ) local_write_req 信号が 1 サイクル立ち上がる local_wdata が 00000001h を示す local_address が 000000h を示す Altera Corporation 6.1 37
SOPC Builder による高性能 DDR DDR2 DDR3 SDRAM の使用 図 18. ライト要求の波形 SignalTap II のトリガを local_read_req に設定する SignalTap II ロジック アナライザを使用して リード動作をキャプチャします リード動作を表示するには 以下の手順に従います 1. SignalTap II の Setup タブで local_read_req の立ち上がりエッジでのトリガを選択します ( 図 19 を参照 ) 図 19. local_read_req 信号に対するトリガ設定 2. Run Once Analysis をクリックして リード要求をキャプチャします 38 6.1 Altera Corporation
SOPC Builder を使用した DDR2 SDRAM 高性能コントローラの実習 3. Nios II コマンド コンソールで 以下のコマンドを入力します C00000000 4. SignalTap II ウィンドウに戻り 時間 0 のときに以下のようになっていることを確認します ( 図 15 を参照 ) local_read_req 信号が立ち上がる local_address が 000000h を示す 数クロック サイクル後 ( システムのリード レイテンシにより異なる ) local_rdata_valid が 1 サイクル High になるとともに local_rdata が 00000001h を示す 図 20. リード要求の波形 バースト ライト動作のテスト SignalTap II ロジック アナライザを使用して ライト動作をキャプチャします ライト動作を表示するには 以下の手順に従います 1. SignalTap II の Setup タブで local_write_req の立ち上がりエッジでのトリガを選択します ( 図 21 を参照 ) Altera Corporation 6.1 39
SOPC Builder による高性能 DDR DDR2 DDR3 SDRAM の使用 図 21. local_write_req 信号に対するトリガの設定 2. Run Once Analysis をクリックして ライト要求をキャプチャします 3. Nios II コマンド コンソールで 以下のコマンドを入力します D0200100000000000 4. SignalTap II ウィンドウに戻り 時間 0 のときに以下のようになっていることを確認します ( 図 15 を参照 ) local_write_req 信号が数サイクル立ち上がる local_wdata が 03020100h を示し 続いて 07060504h などを示す local_address が 000000h を示し 続いて 000001h などを示す 1 ライト データは 最初から最後へ MSB から LSB へのカウント フォーマットになっています 例えば カウント 00,01,02,03 = 03020100h 40 6.1 Altera Corporation
SOPC Builder を使用した DDR2 SDRAM 高性能コントローラの実習 図 22. バースト ライト要求の波形 バースト リード動作のテストバースト リード動作の実行はバースト ライト動作の実行と似ていますが (39 ページの バースト ライト動作のテスト を参照 ) メモリ位置がスワップされる点が異なります バースト リード動作を実行するには 以下の手順に従います 1. SignalTap II の Setup タブで local_read_req の立ち上がりエッジでのトリガを設定します 2. Run Once Analysis をクリックして リード要求をキャプチャします 3. Nios II コマンド コンソールで 以下のコマンドを入力します D0000000002001000 Altera Corporation 6.1 41
SOPC Builder による高性能 DDR DDR2 DDR3 SDRAM の使用 結論 このアプリケーション ノートでは 最適な SOPC Builder Avalon-MM アーキテクチャを実現するためのデザイン決定について検討しました 単純な Nios II C プログラムを SignalTap II ロジック アナライザと組み合わせることにより ハードウェアとソフトウェアの両方の動作をどのように検証できるかを実際に示しました SDRAM 高性能コントローラを SOPC Builder システム インタコネクト ファブリックと組み合わせる場合 以下の推奨事項を十分に検討する必要があります ロウのアドレス指定時間を低減するために シーケンシャルでないアドレッシングを最小限にする コントローラの Avalon-MM インタフェース幅を Avalon-MM マスタ インタフェース幅と一致させる データのキャッシュ サイズをメモリのバースト長と一致させる アービトレーション停止が発生する可能性がある場合 マルチマスタ デザインを最小限にする クロック ドメイン クロッシング アダプタを取り除くか 最適化する 付録 :main.c テスト プログラム ファイルの例 #include<stdio.h> #include"sys/alt_dma.h" #include "sys/alt_cache.h" #include "system.h" #include "altera_avalon_dma_regs.h" #define length 512 int to_hex(char* pkt) { unsigned int value[8]; unsigned int value1=0; unsigned int q; for (q=0;q<=7;q++) { value[q]=(pkt[q]>0x39)?(pkt[q]-0x37):(pkt[q]-0x30); if (q==0) { value1=(value1+value[q]); } else { 42 6.1 Altera Corporation
付録 :main.c テスト プログラム ファイルの例 } } value1=((value1<<4)+value[q]); } return value1; /****************************************************************** * Function: Main_menu * * Purpose: Prints the main menu commands * ******************************************************************/ static void Main_menu(void) { printf("\n\n"); printf(" \n Select One of the following Commands \n"); printf( "\n Use Upper case \n"); printf(" \n Enter 'A' : Controls the LEDS:\n"); printf(" \n Enter 'B' : Single Write to an address location in Memory:\n"); printf(" \n Enter 'C' : Single Read to an address location in Memory:\n"); printf(" \n Enter 'D' : Performs DMA operation with burst length of 512 words:\n"); printf( "\n Enter your command now \n"); } /****************************************************************** * Function: LED_Control * * Purpose: Controls the LEDs.. * ******************************************************************/ void LED_Control(void) { unsigned int led_value; unsigned char led[8]; printf(" \n LED Test opertaion \n"); printf( "\n Enter the value in Hex you want to write to the LEDs:(i.e. 000000FF)\n"); printf(" \n The last two bytes control all eight LEDs. \n"); gets(led); led_value=to_hex(&led[0]); printf(" \n Value to be displayed on LEDs is: %08x \n",led_value); IOWR_32DIRECT(LED_PIO_BASE,0, led_value); } /****************************************************************** * Function: Single_Write * * Purpose: Performs a single write to an address location in memory. Altera Corporation 6.1 43
SOPC Builder による高性能 DDR DDR2 DDR3 SDRAM の使用 * ******************************************************************/ void Single_Write(void) { unsigned char write_offset[8]; unsigned char data[8]; unsigned int DDR_write_OFFSET_ADDRESS; unsigned int write_data; printf(" \n Single Write opertaion \n"); printf( "\n Enter the data you want to write to the Memory:(i.e. 44444444) \n"); gets(data); write_data=to_hex(&data[0]); printf( "\n Enter the offset address where you want to write in the Memory: (i.e. 00000010)\n"); gets(write_offset); DDR_write_OFFSET_ADDRESS = to_hex(&write_offset[0]); if ((DDR_write_OFFSET_ADDRESS<0) (DDR_write_OFFSET_ADDRESS>=(ALTMEMDDR_SPAN /4))) { printf(" \n Invalid Offset \n"); printf( "\n You have entered wrong offset address : \n"); return; } IOWR(ALTMEMDDR_BASE,DDR_write_OFFSET_ADDRESS,write_data); if (IORD(ALTMEMDDR_BASE,DDR_write_OFFSET_ADDRESS)==write_data) { printf("\n Data: %08x is correctly written to memory offset: %08x \n", write_data,ddr_write_offset_address); printf("\n Write operation is done \n"); } else { printf("\n Write operation is Failed \n"); } } /****************************************************************** * Function: Single_Read * * Purpose: Performs a single read to an address location in memory * ******************************************************************/ void Single_Read(void) { unsigned char read_offset[8]; unsigned int DDR_read_OFFSET_ADDRESS; unsigned int read_data; printf(" \n Single Read opertaion \n"); printf( "\n Enter the offset address from where you want to read in the Memory:(i.e. 00000010) \n"); gets(read_offset); 44 6.1 Altera Corporation
付録 :main.c テスト プログラム ファイルの例 DDR_read_OFFSET_ADDRESS = to_hex(&(read_offset[0])); if ((DDR_read_OFFSET_ADDRESS<0) (DDR_read_OFFSET_ADDRESS>=(ALTMEMDDR_SPAN/4))) { printf(" \n Invalid Offset \n"); } else { read_data=iord(altmemddr_base,ddr_read_offset_address); printf("read %08x from address %08x \n",read_data,(altmemddr_base+ddr_read_offset_address)); } } /****************************************************************** * Function: Verify Operation * * Purpose: Compares the memory contents of the read data master and write data master * ******************************************************************/ void Call_verify(unsigned char* source, unsigned char* destination) { if (memcmp(source,destination,(length*4))==0) { printf("\n DMA operation successful \n"); } else { printf("\n DMA operation failed \n"); printf( "\n Please check that DMA is correctly setup \n "); } } /****************************************************************** * Function: DMA_Operation * * Purpose: Performs an incremental write to the first address location, followed by a DMA burst transfer from the first address location to the second address location. The burst is a fixed length of 512 words or 2048 bytes. * ******************************************************************/ Altera Corporation 6.1 45
SOPC Builder による高性能 DDR DDR2 DDR3 SDRAM の使用 改訂履歴 表 3 に このアプリケーション ノートの改訂履歴を示します 表 3. 改訂履歴 日付およびドキュメント バージョン 変更内容 概要 2008 年 3 月 v1.0 初版 101 Innovation Drive San Jose, CA 95134 Technical Support: www.altera.com/support/ Literature Services: literature@altera.com Copyright 2008 Altera Corporation. All rights reserved. Altera, The Programmable Solutions Company, the stylized Altera logo, specific device designations, and all other words and logos that are identified as trademarks and/or service marks are, unless noted otherwise, the trademarks and service marks of Altera Corporation in the U.S. and other countries. All other product or service names are the property of their respective holders. Altera products are protected under numerous U.S. and foreign patents and pending applications, maskwork rights, and copyrights. Altera warrants performance of its semiconductor products to current specifications in accordance with Altera's standard warranty, but reserves the right to make changes to any products and services at any time without notice. Altera assumes no responsibility or liability arising out of the application or use of any information, product, or service described herein except as expressly agreed to in writing by Altera Corporation. Altera customers are advised to obtain the latest version of device specifications before relying on any published information and before placing orders for products or services. 46 6.1 Altera Corporation