ASG (Arbitrary Signal Generator) 設定ガイド
Red Pitaya の ASG コア (src_hdl/red_pitaya_asg-250-orig.v) の主なパラメータと決め方をまとめる。WebUI経由で波形出力を制御する際の参考にする。
基本構造
- CHA/CHB それぞれに 14bit 波形バッファ (最大 16384 サンプル、32bit ワード書き) を持つ。
- 位相アキュムレータでテーブルを読出す。ステップ幅は Q16 形式 (
step)、必要なら下位 32bit 拡張 (step_lo) も加算される。 - 再生モードは wrap(ループ) と once(1 周) を持つ。
ncyc/rnum/rdlyで繰り返し制御できる。 set_amp/set_dcでスケーリング、set_zero/set_talmで強制ゼロ出力。
主なレジスタと意味
- 0x00 制御:
wrap/once(A/B),rstパルス,zero,rgate,trig_src,sw trig(bit0/16)。 - 0x04/0x24 振幅/DC: 下位 14b
amp, 上位 14bdc。リセット時 amp=0x2000, dc=0。 - 0x08/0x28 size: テーブル長
sample_count << 16。 - 0x0C/0x2C ofs: 再生開始オフセット (通常 0)。
- 0x10/0x30 step: 位相ステップ Q16。
step ≈ size * f_out / f_clk。 - 0x4C/0x50 step_lo: ステップ下位拡張 (2^-32 刻み)。細かい調整用。通常 0。
- 0x18/0x38 ncyc: 1周期の中の周回回数 (0=無限)。
- 0x1C/0x3C rnum: 繰り返し回数。
- 0x20/0x40 rdly: 繰り返し間隔 (クロック数)。
- 0x68/0x6C first: 再生開始前の出力値 (通常はテーブル先頭と同じ)。
- 0x44/0x48 last: 終端値 (通常はテーブル末尾と同じ)。
- 0x70/0x74 last_len: 終端値を保持するサンプル長 (通常
sample_count-1)。 - 0x54 deb_len: 外部トリガのデバウンス長。
- 0x78/0x7C seed, 0x80/0x84 rand_en: LFSR 擬似ランダム出力。使わなければ無効のまま。
- バッファ: CHA 0x10000, CHB 0x20000 に 14bit サンプルを書き込む。
周波数とステップの決め方
- 1 周に要するクロック数
M = f_clk / f_out。 - size =
sample_count << 16。 - step =
round(size / M) = round((sample_count << 16) * f_out / f_clk)。 - 実際の 1 周クロック数 ≈
size / (step + step_lo/2^32)。 - 周波数を可変にしたいときはテーブル長を大きめに固定し、
stepだけ変えると扱いやすい (正弦波向け)。 - パルスのように周期が先に決まる場合は、
period * f_clkを周期クロック数としてstep = size / period_clocksにする。
テーブル長 (sample_count) の指針
- 正弦波: 波形精度と周波数分解能を高めるため、可能なら大きめ (RAM 上限に近い値) にし、周波数は
stepで調整。 - 低周波やパルス: 周期クロック数に近い長さにすると
stepが 1 に近づき直感的。RAM 上限を超えそうならクリップした上でstepで補正。
first / last の使い方
- 境界条件を明示するためのレジスタ。通常はテーブル先頭/末尾と同じ値を入れる。
- 先頭値を開始前に出しておきたい、終端値を一定サンプル保持したい場合に
last_lenと組み合わせる。
LFSR 擬似ランダム
rand_enを有効にするとテーブル再生の代わりに LFSR 出力を DAC に送る簡易ノイズ源。seedで初期値、rand_init書き込みでリシード。決定論的な擬似乱数なのでテスト信号用途。
読み出しポインタ
buf_*_rpnt_rdに現在の読出し位置をラッチし、0x1zzzz/0x2zzzzの sys 空間から参照できる。動作中の位置確認やデバッグ用。