FlexRIOとDRAMの使い方

NI FlexRIOとDRAMを使用した経験から得たFlexRIOとDRAMの特徴と使い方を紹介します。

  • FlexRIO:FPGAを搭載したプログラム可能な計測用回路
  • DRAM:半導体メモリの一種

FPGAにおけるデータの保持の仕方

  • 定数
  • レジスタ
  • ハンドシェイク
  • メモリ
    • ルックアップテーブル(スライス)
    • ブロックメモリ(ブロックRAM)
    • DRAM
  • FIFO(DMAFIFO含む)
    • フリップフロップ(スライス)
    • ルックアップテーブル(スライスLUT)
    • ブロックメモリ(ブロックRAM)

定数

  • 初期値(定数)のみ設定可能(書き換え不可能)
  • 1つのクロックサイクルからのみアクセス
  • スライス消費

レジスタ

  • 初期値設定可能、書き換え可能
  • 複数クロックサイクルからアクセス可能
  • カスタム制御器設定可能(クラスタや固定サイズの配列が設定可能)
  • 1レジスタにつき、値は1つのみ設定
  • FIFOに比べて消費スライスが少なくて済む(スライスを消費する)
レジスタ

ハンドシェイク

  • 初期値設定不可能
  • 要素数1のキューのような動作(一度書いた要素は読み取る以外に書き換え不可能)
  • 一度読み取るとデータが消えるので、読み取りは1か所からのみ可能
  • 複数クロックサイクルからアクセス可能
  • カスタム制御器設定可能(クラスタや固定サイズの配列が設定可能
  • FIFO(フリップフロップ)に比べて消費スライスが少なくて済む
ハンドシェイク

FIFO

  • 初期値設定不可能
  • キューのように後入れ先出のメモリ
    ※ハンドシェイクと異なり書き込み、読み取りともにタイムアウト設定が可能。(タイミングループ内に実装する場合にはタイムアウトは0に設定する必要がある)
  • 一度読み取るとデータが消える
  • 複数クロックサイクルからアクセス可能(一部モード)
  • カスタム制御器設定可能 (クラスタや固定サイズの配列が設定可能)
  • フリップフロップ式、ルックアップテーブル式、ブロックメモリ式の3種がある
  1. フリップフロップ式:スライスを使ってデータを保存するため、もっとも読書き速度が速い。100Byte未満のデータ用
  2. ルックアップテーブル式:ルックアップテーブル(LUT)を使ってデータを保存する。100~300Byte程度のデータ用
  3. ブロックメモリ式:ブロックメモリを使ってデータを保存する。300Byte以上のデータに用いる 唯一異なるクロック領域間で使用可能

メモリ(ルックアップテーブル)

  • 初期値設定可能
  • アドレスを指定してデータを書き込む/読み込む
  • メモリを書き換えない限り、同じアドレスから何度でも同じデータを読み出せる
  • 異なるクロックのタイミングループからのアクセス不可(書き込んだデータは次のクロックから読み出し可能)
  • カスタム制御器設定可能(クラスタや固定サイズの配列が設定可能)
  • スライスを消費する。(要素数に比例)

LUT(ルックアップテーブル)実装の様子

LUT(ルックアップテーブル)実装の様子

メモリ(ブロックメモリ)

  • アドレスを指定してデータを書き込む/読み込む
  • メモリを書き換えない限り、同じアドレスから何度でも同じデータを読み出せる
  • 異なるクロックサイクルからアクセス可能
    (異なるクロックのタイミングループからアクセスすると、読み出したデータに不確定性が生じる)
    (書き込んだデータは次のクロックから読み出し可能)
  • カスタム制御器設定可能(クラスタや固定サイズの配列が設定可能)
  • スライスをほとんど消費しない。(ブロックメモリを消費する)

メモリ(DRAM)

  • 初期値設定不可能
  • アドレスを指定してデータを書き込む/読み込む
  • メモリを書き換えない限り、同じアドレスから何度でも同じデータを読み出せる
  • 複数クロックサイクルからアクセス可能
    ※書き込み読み込みに癖があり、アクセス速度を一定に保つのは難しい
  • カスタム制御器設定可能(クラスタや固定サイズの配列が設定可能)
  • スライスをほとんど消費しない。(DRAMを消費する)
メモリ(DRAM)実装の様子