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


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

セミナ開催します。
"実習・MAX10 NiosIIプロセッサ活用超入門”
2017年8月23日(水)、CQ出版社セミナルーム
DE10-Liteを使ってMAX10上でNisoIIを動かします.
詳しくはこちらへ


第5回 入力信号の変化をRAMへ保存して、LEDをチカチカさせてみる

 今回は、FPGAの内蔵RAMを使ったサンプルを紹介します。第2回で紹介したLEDをチカチカさせる回路
機能追加して、スイッチの変化(256回目まで)をRAMへ記録して、スイッチの操作を再現してLEDをチカチカさせてみます。
また、xilinxのツールでのRAMモジュールの作り方を紹介します。


入力信号の変化をRAMへ保存するLEDチカチカ回路ソース(zip圧縮してあります)
 led_control_ram.zip
 led_control_ram.v Verilo-HDLソース
 test_led_control_ram.v テストベンチ
 led_control_ram.ucf  ピン配置指定(ターゲットボード:MFPGA_SPAR3E
 ※デザインを完成するためにはRAMモジュールが必要です。作成方法はこちら
 ※ソースコードが長いのでダウンロードして中身を見てください。

仕様説明

 動作概要
  プッシュスイッチ(push_sw)の値の変化タイミングをRAMへ保存、一定時間の間にスイッチの値に
 変化がなければ、RAMへの保存を終了して、保存してある値に従ってLED(led_0)を点灯、消灯させます。

 
 mem_mode=1の範囲でで入力値の変化パタンを記録、mem_mode=0で変化パタンを繰り返して再生します。


 入力信号
  clk:クロック入力/今回使用してたボードは40MHzでした。
  push_sw:LED点灯、消灯のタイミング入力

 出力信号
  ed_0:LED制御信号/今回使用したボードでは0で点灯です。

 レジスタ
  push_sw_dff1:push_sw入力のりタイミング用DFF 1段目
  push_sw_dff2:push_sw入力のりタイミング用DFF 2段目
  push_sw_dff3:push_sw入力のりタイミング用DFF 3段目
  push_sw_dff4:push_sw入力のりタイミング用DFF 4段目
  push_sw_fall:push_sw立下り検出
  init_sig:初期化信号
  rec_sig:変化タイミング記録信号
  mem_mode:記録モード:1 表示モード:0
  led_0:LED制御レジスタ
  mem_cnt:記録回数
  mem_adr:メモリアドレス
  mem_wd:メモリ書込みデータ
  led_cnt:LED点灯タイミングカウント
  led_cnt_max:LED点灯タイミングカウント最大値

 パラメータ
  df_max:push_swが変化なった場合に表示モードへ移行する時間設定
      3秒のカウンタ値が設定されています。
      コメントアウトしてある値は、シミュレーション実行時間を短くするための周期を短くした設定です。

RAMの作り方
 led_control_ramでにはRAMを使用しています。xilinxのデバイスでツールを使ってRAM生成したモジュールを使っています。
 ここではRAMの作り方を紹介します。操作方法の詳細はISEの説明書を参考してください。

 ISEのメニューからProject->NewSource...を選択します。
 

 
 "File name"へ作成するモジュール名を入力
 ”IP(CORE Generator..."を選択して"Next"をクリック
 
 

 ”MenoryType”で”Simple Dual Port RAM”を選択して”Next”をクリック 
  
 

 ”Write Wiidth”,”Read Wiidth”へデータの幅を指定、今回は32
 ”WriteDepth”へ保存するデータの個数を指定、今回は256
 "Next"をクリック
 
 

  デフォルト設定のままで"Next"をクリック
 

 デフォルト設定のままで"Next"をクリック
   

 デフォルト設定のままで"Generate"をクリック
 

 プロジェクトフォルダ/ipcore_dirにデータが生成されます。
 作成したモジュールをled_control_ram.v内でインスタンスすることで論理合成時に組み込まれます。

内部動作
 プッシュスイッチが押されてpush_swが0になるとmem_modeを1にして記録モードへ移行 
 led_cntを0にして記録用にカウントを開始します。
 

 push_swの値が変化すると、rec_sigが1になり、led_cntの値を変化タイミングとしてメモリへ保存します。
 次にled_cntを0して次のpush_swの変化までカウントを続けます。
 

 led_cnt==df_maxとなるまで、push_swが変化しない場合はmem_mode=0として、表示モードへ移行、
 led_cntを0戻してカウントします。
 

 led_cntとメモリから読み出した値(led_cnt_mx)が一致するとled_0を反転する。
 


紹介した回路を試す場合は、自己責任でお願いします。
次回は、”I2Cで色々なICと接続してみる”を紹介する予定です。

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


変更履歴
(2010/10/06) 初版
(2010/10/16) 項目の先頭にを追加


TOPへ戻る