FC2ブログ

[NEEK][動画再生]SGDMAディスクリプタチェーン設定(SD to DDR)

■SGDMAディスクリプタチェーン(SD to DDR)
 次のようにやったら、ディスクリプタ2個でのチェーン作成、動作が成功。

wr_1bit_h(SGDMA_MMC_CTRL, SGDMA_CTRL_PARK_BIT);
*((volatile unsigned int *)SGDMA_MMC_NDESC_PTR_U) = 0x0000 ;
*((volatile unsigned int *)SGDMA_MMC_NDESC_PTR_L) = SGDMA_MMC_DESC ;
alt_avalon_sgdma_construct_mem_to_mem_desc(
(unsigned int)SGDMA_MMC_DESC, // descriptor
(unsigned int)SGDMA_MMC_DESC+0x20,// next descriptor
(unsigned int)MMCSPI_READBUF, // read address
(unsigned int)VRAM_SNK, // write address
(unsigned short)0x200, // length
0, // read_fixed
0 // write_fixed
);
alt_avalon_sgdma_construct_mem_to_mem_desc(
(unsigned int)SGDMA_MMC_DESC+0x20,// descriptor
(unsigned int)SGDMA_MMC_DESC, // next descriptor
(unsigned int)MMCSPI_READBUF, // read address
(unsigned int)VRAM_SNK+0x200, // write address
(unsigned short)0x200, // length
0, // read_fixed
0 // write_fixed
);
wr_1bit_h(SGDMA_MMC_DESC +0x1C, SGDMA_DESC_OWNED_BY_HW); // owned_by_hw of 1st desc set to H
wr_1bit_h(SGDMA_MMC_CTRL, SGDMA_CTRL_RUN_BIT);



 手順としては、
 PARKビットをHに設定。(ディスクリプタチェーンがループするための設定)
 最初のディスクリプタアドレスをNEXT_DESCレジスタへ設定。
 2個のディスクリプタを登録。この時、2個目から1個目へループするようにNEXT_DESCを設定。
 次に、1個目のOWNED_BY_HWビットをHへ設定。
 (OWNED_BY_HWはディスクリプタチェーンをCPU介在無しにHWが自動実行するための設定。
  この設定が今まで分からなかった事で、長時間のSimulationを経て、やっと気付いた。
  ディスクリプタ1個目のこのビットがLであったため、今までチェーンのループ実行に失敗。)
 最後に、コントロールREGのRUNビットをHに設定して、DMAスタート。
 これでSimulationで成功。実機でもDDRCリソース食って画面が変化したからたぶん成功したのだろう。

■SD to DDRへのDMA動作成功したらDDRCスピード不足になった模様
 上で書いた通り、DMA動作出来たようだが、その代わり、画面が真っ暗に。
 SD to DDRのDMAをRUNしなければ、DDRメモリを読み出して、ランダムな色が出る。

 SDカードコントローラはSPIモードを使用し、コントローラ内のバッファI/FはAvalon MM(Memory Map)。
 DDRCも同じだから、SGDMAはAvalon MM to Avalon MMの設定になる。
 Avalon ST(Stream)と違って、だいぶ転送速度遅いので、DDRへのReadに加えて今回Writeもやったから
 LCDモニタへの画素補充が間に合わなくなったんだと予想。バースト転送の設定をいじって試し中。
 (そもそも、SPIモードでSDから読み出すと、840x480の画面を毎フレーム読み出しやれんのか?
  という疑問あるが、後で計算しよう。)

 それともう1つ問題あって、SDカード初期化が以前成功してSuccessしてたのが、どこをいじったか
 Failになってしまう。SDからのリード成功しないとSDコントローラ内のリードバッファも0固定とか
 になっちゃうから、画面は一色(真っ黒?)になって、成功してるんだか分からん。

■SignalTapIIで見ようとするが、Memoryリソースは足りるのに、Hold違反発生
 AdvisorのHold改善設定は全て実施済み。
 Fmax改善設定をいじるとHold改善しないかと期待して見てみると、Maximum Fan-out設定ないよ、
 という指摘が。

 以下のようにqsf設定すると出来るらしい。
  参照先=http://www.polybus.com/altera_verilog_example/s4gt_demo_625.qsf.html

set_instance_assignment -name MAX_FANOUT 32 -to *
set_global_assignment -name IGNORE_MAX_FANOUT_ASSIGNMENTS OFF


 現在コンパイル実行中。改善出来るかな?
         ↓(20分後)
 おお!改善出来て、タイミング違反消えた!!
スポンサーサイト



カレンダー
12 | 2011/01 | 02
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
累積訪問者
現在の訪問者
現在の閲覧者数:
最新記事
最新トラックバック
最新コメント
月別アーカイブ
カテゴリ
プロフィール

bobgosso

Author:bobgosso
FPGAのブログへようこそ!

検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード