Red Pitaya ASG で任意周波数波形を作るための基本原理と設定方法
このドキュメントは Red Pitaya ASG (Arbitrary Signal Generator) において、任意の波形を生成するために必要な
- 波形テーブル長(size)
- 位相ステップ量(step)
をどのように決定し、
- なぜその式になるのか(理解)
- ハードウェア実装上の補足知識
をまとめたものです。
ASG の動作原理を正しく理解し、任意の周波数の信号を安定して生成することを目的とします。
1. ASG の基本構造
ASG は以下のように動作します。
- RAM(バッファ)に波形データを格納する
- DAC クロックごとにバッファの読み出しアドレスを前進させる
- 読み出した値を 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つだけ」:
- テーブル長をどうするか?(size)
- 1クロックでどれだけ位相を進めるか?(step)
式としては
set_size = (テーブル長 << 16)
set_step = set_size * (f_out / f_clk)
となります。