コンテンツにスキップ

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, 上位 14b dc。リセット時 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 空間から参照できる。動作中の位置確認やデバッグ用。