”FPGAで遊んでみる”では、セミナー用に作成したサンプル回路などを整理して少しづつ紹介していきます。


セミナ開催します
手ぶらでOK!実習・Raspberry Pi PicoW×MicroPython I/Oデバイス「時短」開発入門
-- 133MHz ARM Cortex-M0マイコンをPythonでプログラミング 
2024年12月6日(金)CQ出版社セミナルーム CQ出版社セミナ・ルーム
詳しくはこちらへ

ZYBOの本
FPGAパソコンZYBOで作るLinux I/Oミニコンピュータ CQ出版 発売中

Papilioの本
FPGA版Arduino!!Papilioで作るディジタル・ガジェット CQ出版 発売中


第10回 簡易SDRAMコントローラでSDRAMを読み書きしてみる(DE0編

 今回は、簡易SDRAMコントローラを紹介します。TERASIC社のFPGAボードDE0にはSDRAM乗っていいるのですが
ALTERA社のQuartusUのMegaWizardにはDDRSDRAMのコントローラはあるのですが、SDRAMコントローラがありません。
そこで、簡易SDRAMコントローラを作ってSDRAMにアクセスしてみました。題材としては第9回(その2)で紹介してるカメラモジュールの表示回路の
VRAMをFPGA内部RAMから外部のSDRAMへ変更して表示サイズを大きくしてみました。
16バイトのバーストリード/バーストリードにしか対応していないので簡易SDRAMコントローラとしています。

 評価機器
 
 上がSVGAモニタ(RGB)、モニタの右がカメラモジュール(OV7670)
 下がFPGAボード(DE0

カメラモジュール・インターフェースのソース(zip圧縮してあります)
 camera_ap_de0_sdram_files.zip
 内容
  sdram_ctrl.v 簡易SDRAMコントローラ
  line_buf_in.v 書込み用ラインバッファ
  line_buf_out.v 読出し用ラインバッファ
  camera_if.v カメラモジュールインターフェース回路
  vram_ctrl.v 入力画像のメモリ保存、出力画像のメモリ読出し回路
  ov7670_cmd_genv ov7670の設定情報の生成
  i2c_ov7670_ctrl.v ov7670の設定情報からi2cモジュール制御情報生成
  camera_ap.v 周辺回路も含めたFPGAの最上階層
  svga_if.v SVGA画像出力回路(第4回で紹介)
  layer_a.v 移動する箱のグラフィック生成(第4回で紹介
  layer_b.v カラーパタンのグラフィック生成(第4回で紹介
  msg_buf.v メッセージバッファ回路(第8回で紹介)
  fifo.v メッセージ保持用FIFO(第8回で紹介)
  ram.v メッセージ保持用FIFO用RAM(第8回で紹介)
  rs232c_txrx.v RS232Cインターフェースモジュール(第3回で紹介)
  vram_dumy.v  チップスコープ使用時にメモリが足りないので、使用するvramのダミー記述
  camera_ap_test.v camera_apのテストベンチ
  camera_ap.qsf FPGAボードにDE0を使用した場合のPIN配置指定
  camera_ap.mif OV7670設定用のROMデータファイル
 
 ※この回路を使用する場合は、自己責任でお願いします。

仕様説明(sdram_ctrl.v)

 動作概要
   リセット解除後にSDRAMの初期化とモード設定を自動で行います。初期化完了後は定期的リフレッシュを実行しながら
 書込み、読出しのリクエストに応じて、SDRAMをリード/ライトします。初期化中やリフレッシュ中はリード/ライトができないので
 ステートマシンで制御しています。

 ブロック図
 

 入力信号
 clk:クロック入力/今回使用してたボードは150MHzです。
 reset_n:リセット入力 0でリセット

 SDRAM用信号
 ram_clk:SDRAM用クロック
 ram_clke:クロックイネーブル
 ram_cs_n:チップセレクト
 ram_cas_n:cas信号
 ram_ras_n:ras信号
 ram_we_n:ライトイネーブルう
 ram_dqml:データイネーブル dq[7:0]
 ram_dqmu:データイネーブル dq[15:8]
 ram_ba0:バンクアドレス0
 ram_ba1:バンクアドレス1
 ram_adr[11:0]:アドレス
 ram_dq_w[15:0]:書込みデータ
 ram_dq_r[15:0]:読出しデータ

 ユザーアクセス用信号
 u_wreq:ライトリクエスト
 u_wack:ライトアクノリッジ
 u_wr_da_en:ライトデータイネーブル
 u_wadr[19:0]:ライトアドレス
 u_wr_da[15:0]:ライトデータ
 u_rreq:リードリクエスト
 u_rack:リードアクノリッジ
 u_radr[19:0]:リードアドレス
 u_rd_da_en:リードデータイネーブル
 u_rd_da[15:0]:リードデータ

 詳細動作
 初期化
 SDRAMは、電源投入後に初期化とモード設定が必要です。初期化の手順はチップの仕様書にかいてあります。日本語の資料としては
 エピルータメモリの「SDRAMの使い方」が参考になります。
 今回紹介した回路では、ステートマシンのinitからmrsまでが初期化とモード設定になります。
 初期化が終了するとidleになり、ライトリクエストがあればライト動作(wr_act->wr1)、
 リードリクエストがあればリード動作(rd_act->rd1)、
 リフレッシュカウンタからリフレッシュリクエスト示されるとリフレッシュ(ref)が実行されます。
 ステートがidleでない場合は、ライト動作、リード動作、リフレッシュのいずれかが実行中なので、
 処理が終了してステートがidleへもっど後に、次の要求を処理します。
 ステートマシンの詳細はソースコードを参照してください。

 ステートマシン



  初期化、モード設定の動作
 
 sdram_ctrl:u0|stateがステート用レジスタ、init(0)→pall(4)→init_ref1(5)→init_ref2(6)→mrs(7)→idle(1)の順で遷移


 ライト動作
  
 u_wreq=1でライトリクエスト発生、u_wack=1で書込み開始


  リード動作
 
 u_wreq=1でリードリクエスト発生、u_wack=1で読出し許可、rd_de_en=1の時にSDRAMからのデータが有効


FPGAでの動作
 FPGAトップモジュール(camera_ap.v)
  第9回(その2)の回路のvramの部分を変更しています。また各種画像サイズのパラメータを変更してカメラから640×480の画像を取り込み
 640×480のサイズでモニタへ表示しています。詳しくは第9回(その1,その2)を参照してください。
  srma_ctrlはリクエストが直ぐに受け付けできない場合に備えて りクエスト・アクノリッジでハンドシェイクしてデータ転送を受付します。
 これに対処するために、camera_ifとsrma_ctrlの間には、linebif_inとline_buf_outを入れてデータ転送タイミングを調整しています。
 line_bif_inは、1ライン分のデータが蓄えられたらsrma_ctrlへ書込みリクエストを出します。line_bif_outは、1ライン分のデータ出力が完了すると次のラインのデータの
 読み出しリクエストを出し、次の1ライン分のデータを蓄えます。

 


 動作の様子
  FPGAボードとカメラモジュール、FPGAボートとPCをUSBケーブルで接続して動作確認しています。
 ディスプレイの解像度が800×600なので、中央に640×480のサイズでカメラの映像を表示しています。

 

紹介した回路を試す場合は、自己責任でお願いします。

次回は、”FPGAでステッピングモータを回してみる”を紹介する予定です。

リンクフリーです。
リンクされた場合はご連絡をいただけると嬉しいです。
メール:


変更履歴
(2012/1/17) 初版


TOPへ戻る