コンテンツにスキップ

Red Pitaya ASG で任意周波数波形を作るための基本原理と設定方法

このドキュメントは Red Pitaya ASG (Arbitrary Signal Generator) において、任意の波形を生成するために必要な

  • 波形テーブル長(size)
  • 位相ステップ量(step)

をどのように決定し、

  • なぜその式になるのか(理解)
  • ハードウェア実装上の補足知識

をまとめたものです。

ASG の動作原理を正しく理解し、任意の周波数の信号を安定して生成することを目的とします。


1. ASG の基本構造

ASG は以下のように動作します。

  1. RAM(バッファ)に波形データを格納する
  2. DAC クロックごとにバッファの読み出しアドレスを前進させる
  3. 読み出した値を DAC に出力する

ここで、読み出しアドレスは 「整数 + 小数部(16bit)」で構成される固定小数点の位相アキュムレータ(phase) として扱われます。

RSZは Red Pitaya 標準 ASG では 14ビット で、テーブル長は最大 16384 点。


2. 出力周波数からパラメータを導出する考え方

ここでは、目標とする出力周波数のために、パラメータはどう設定すべきなのか、順を追って説明します。

● 2-1. クロックから見る周期

DAC クロック周波数を f_clk 周期を T_clk、出力周波数を f_out 周期を T_outとします。

出力の1周期に必要なクロック数は:

T_out = T_clk * clk_per_cycle
clk_per_cycle = f_clk / f_out

● 2-2. 波形テーブルから見る周期

テーブル長を size(点数)とし、1クロックごとに位相を step 分進めるとします。

phase が size 分進むと 1周期読み終わるので、

clk_per_cycle = size / step

● 2-3. 両者をつなぐ

f_clk / f_out = size / step

波形からsizeを決めると、stepは以下のようになります。

step = size * (f_out / f_clk)

決定するパラメータは以上のように考えられます。

● 2-4. 一般的な DDS の式

ここで、sizeは実際には14bit(RSZ=14)の整数アドレスと16bitの小数で表現されます。これを phase として、以下のように書くと、一般的な DDS の式は下記となります。

f_out = (step / phase) * f_clk

phase について、次節で詳説します。

3. Red Pitaya 実装上の注意:fixed-point (整数 + 小数)

Red Pitaya ASG では、アドレス(位相)を 整数 + 小数 の組み合わせで管理します。 これにより、1クロックで整数 1 点進むのではなく、小数点を含んで細かく進めることができます。 そのため最終的に任意周波数(1.234 MHz など)を作ることができます。

● 3-1. 位相(phase)の内部表現

ASG の位相は 30bit(RSZ=14 なので 14+16)で構成されています:

[ 上位14bit : バッファアドレス ]
[ 下位16bit : 小数部分 ]

つまり、位相は

phase = 整数部(14bit) . 小数部(16bit)

という 固定小数点(14.16形式) です。

● 3-2. size(テーブル長)が <<16 される理由

バッファの「整数アドレス部分」は上位 14bit です。 しかしレジスタ set_size は 整数14bit + 小数16bit に合わせた 30bit の形式で書く必要があります。

そのため、テーブル長 N(整数)をそのまま書くのではなく、小数部を 0 にした固定小数点へ変換するために、

set_size = N << 16

とします。小数を扱えることで、 1 MHz ちょうど の周波数を作ることができます。プログラムとして書く場合は下記のような式になります。

set_step = (size << 16) * f_out / f_clk

4. 具体例

1 MHz 正弦波を例に、計算の例を以下にします。

  • DAC クロック f_clk = 250 MHz
  • テーブル長 size = 16384

set_sizeは以下になります。

set_size = 16384 << 16
          = 0x40000000

よってstepは

step = (16384 << 16) * (1 MHz / 250 MHz)
     = 4,294,967.296

整数値で表現するため、最終的に

set_step = 4,294,967

これで 1 MHz の正弦波が生成されます。

5. 実装時の補足事項

● 5-1. wrap / once の設定

  • set_wrap = 1 : 最後まで行ったら最初へ戻る(連続再生)
  • set_once = 0 : 1回だけで止めない

● 5-2. ofs(開始オフセット)

通常先頭から読むので:

set_ofs = 0

● 5-3. 振幅スケーリング

set_amp = 0x2000  // 1.0倍ゲイン

● 5-4. トリガ

  • trig_src でソフト or 外部を選ぶ
  • ソフトトリガなら trig_sw = 1 を1回書く

● 5-5. バッファ書き込み

16384点分の波形データを:

addr = 0〜16383
wdata = 14bit signed

で書き込む。

6. まとめ

ASG の設定は本質的に「2つだけ」:

  1. テーブル長をどうするか?(size)
  2. 1クロックでどれだけ位相を進めるか?(step)

式としては

set_size = (テーブル長 << 16)
set_step = set_size * (f_out / f_clk)

となります。