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種がある
- フリップフロップ式:スライスを使ってデータを保存するため、もっとも読書き速度が速い。100Byte未満のデータ用
- ルックアップテーブル式:ルックアップテーブル(LUT)を使ってデータを保存する。100~300Byte程度のデータ用
- ブロックメモリ式:ブロックメモリを使ってデータを保存する。300Byte以上のデータに用いる唯一異なるクロック領域間で使用可能
メモリ(ルックアップテーブル)
- 初期値設定可能
- アドレスを指定してデータを書き込む/読み込む
- メモリを書き換えない限り、同じアドレスから何度でも同じデータを読み出せる
- 異なるクロックのタイミングループからのアクセス不可(書き込んだデータは次のクロックから読み出し可能)
- カスタム制御器設定可能(クラスタや固定サイズの配列が設定可能)
- スライスを消費する。(要素数に比例)
LUT(ルックアップテーブル)実装の様子
メモリ(ブロックメモリ)
- アドレスを指定してデータを書き込む/読み込む
- メモリを書き換えない限り、同じアドレスから何度でも同じデータを読み出せる
- 異なるクロックサイクルからアクセス可能
(異なるクロックのタイミングループからアクセスすると、読み出したデータに不確定性が生じる)
(書き込んだデータは次のクロックから読み出し可能) - カスタム制御器設定可能(クラスタや固定サイズの配列が設定可能)
- スライスをほとんど消費しない。(ブロックメモリを消費する)
メモリ(DRAM)
- 初期値設定不可能
- アドレスを指定してデータを書き込む/読み込む
- メモリを書き換えない限り、同じアドレスから何度でも同じデータを読み出せる
- 複数クロックサイクルからアクセス可能
※書き込み読み込みに癖があり、アクセス速度を一定に保つのは難しい - カスタム制御器設定可能(クラスタや固定サイズの配列が設定可能)
- スライスをほとんど消費しない。(DRAMを消費する)