Synchronous and asynchronous sample-rate converters for Veryl.
Modules
format付きvalue interfaceを使う連続線形ASRC
| FORMAT |
gndless_fixedpoint SignedFixedPointFormat |
| PHASE_WIDTH |
u32 |
位相入力のbit幅
|
| INPUT_DEPTH |
u32 |
入力FIFOの深さ
|
| STARTUP_LEVEL |
u32 |
出力開始に必要な未消費FIFO word数
|
| clk |
input |
clock |
|
| rst |
input |
reset |
|
| input_valid |
input |
bbool |
|
| input_ready |
output |
bbool |
|
| input_sample |
modport |
gndless_fixedpoint FixedPointValue input_port |
|
| input_level |
output |
logic<$clog2(INPUT_DEPTH+1)> |
|
| phase |
input |
logic
|
| advance |
input |
bbool |
|
| output_active |
output |
bbool |
|
| output_sample |
modport |
gndless_fixedpoint FixedPointValue output_port |
|
| underflow |
output |
bbool |
|
|
format付きvalue interfaceを使うCubic Lagrange ASRC
| FORMAT |
gndless_fixedpoint SignedFixedPointFormat |
| PHASE_WIDTH |
u32 |
`ratio`の小数部bit幅
|
| INPUT_DEPTH |
u32 |
入力FIFOの深さ
|
| clk |
input |
clock |
|
| rst |
input |
reset |
|
| input_valid |
input |
logic |
|
| input_ready |
output |
logic |
|
| input_sample |
modport |
gndless_fixedpoint FixedPointValue input_port |
|
| output_tick |
input |
logic |
|
| output_ready |
output |
logic |
|
| output_valid |
output |
logic |
|
| output_sample |
modport |
gndless_fixedpoint FixedPointValue output_port |
|
| ratio |
input |
logic
|
|
2段のhalfband補間と連続線形ASRCを接続した1ch 4倍オーバーサンプラ
入力1サンプルから論理的に4サンプルを生成し、後段のSTD FIFOへburstで受け渡す。FIFOの読み出しと50MHz出力の位相進行はContinuousLinearAsrcが担当するため、HBF自身は入力受理と2サンプルburstのready/validだけを扱う。
input → Halfband 2x (stage 1) → Halfband 2x (stage 2)
→ 4-sample burst → FIFO → continuous linear ASRC → output
HBFのburstでFIFOをSTARTUP_LEVELまで満たしてからoutput_activeになる。
以後は毎クロック補間値を出し、advance時だけFIFOから次の窓を補充する。
| FORMAT |
gndless_fixedpoint SignedFixedPointFormat |
| PHASE_WIDTH |
u32 |
位相入力のビット幅
|
| INPUT_DEPTH |
u32 |
出力側入力FIFOの深さ
|
| clk |
input |
clock |
システムクロック
|
| rst |
input |
reset |
リセット
|
| input_valid |
input |
bbool |
入力サンプル有効
|
| input_ready |
output |
bbool |
入力受理可能
|
| input_sample |
modport |
gndless_fixedpoint FixedPointValue input_port |
入力sample
|
| phase_increment |
input |
logic
| 毎クロックの位相増分
|
| output_active |
output |
bbool |
連続出力が有効
|
| output_sample |
modport |
gndless_fixedpoint FixedPointValue output_port |
補間後の出力sample
|
| input_level |
output |
logic<$clog2(INPUT_DEPTH+1)> |
入力FIFOのワード数
|
| underflow |
output |
bbool |
入力不足のstickyフラグ
|
|
format付きvalue interfaceを使う分数比線形ASRC
| FORMAT |
gndless_fixedpoint SignedFixedPointFormat |
| PHASE_WIDTH |
u32 |
`ratio`の小数部bit幅
|
| INPUT_DEPTH |
u32 |
入力FIFOの深さ
|
| clk |
input |
clock |
|
| rst |
input |
reset |
|
| input_valid |
input |
logic |
|
| input_ready |
output |
logic |
|
| input_sample |
modport |
gndless_fixedpoint FixedPointValue input_port |
|
| output_tick |
input |
logic |
|
| output_ready |
output |
logic |
|
| output_valid |
output |
logic |
|
| output_sample |
modport |
gndless_fixedpoint FixedPointValue output_port |
|
| ratio |
input |
logic
|
|
サンプル到着周期からASRC用の位相増分を生成する推定器
SampleRateTrackerで平滑化した入力サンプル周期から、システムクロックあたりの入力位相進行量を求める。
phase_incrementはQ0.PHASE_WIDTHで、値が1.0未満となるサンプルレート比で使用する。
RATE_MULTIPLIER_SHIFTを2にすると、4倍オーバーサンプリング経路用の位相増分を生成できる。
除算は逐次演算で行い、入力サンプル周期より短いDIVIDEND_WIDTHクロックで完了する必要がある。
除算中に新しい周期を観測した場合は最新の周期を保持し、現在の除算完了後に再計算する。
TIMEOUT_PERIODを有効にすると、入力停止時は古い位相増分を無効化して新しい到着列を再測定する。
| PERIOD_WIDTH |
u32 |
サンプル周期の整数部ビット幅
|
| PERIOD_FRACTION |
u32 |
平滑化周期の小数部ビット幅
|
| PHASE_WIDTH |
u32 |
位相増分の小数部ビット幅
|
| FILTER_SHIFT |
u32 |
周期平滑化IIRの右シフト量
|
| LOCK_COUNT |
u32 |
位相増分の計算を始める測定回数
|
| RATE_MULTIPLIER_SHIFT |
u32 |
位相増分に掛ける2のべき乗倍率のシフト量
|
| STEP_THRESHOLD_SHIFT |
u32 |
即時追従する周期差の比率を表す右シフト量、0で無効
|
| TIMEOUT_PERIOD |
u32 |
入力停止とみなすクロック数、0で無効
|
| clk |
input |
clock |
システムクロック
|
| rst |
input |
reset |
同期リセット
|
| sample_valid |
input |
bbool |
入力サンプル到着パルス
|
| phase_increment |
output |
logic
| ASRC用Q0位相増分
|
| locked |
output |
bbool |
位相増分が有効
|
| range_error |
output |
bbool |
位相増分が1.0以上となる設定または入力を検出
|
|
入力サンプルの到着周期測定と低域通過周期推定値の出力
このモジュールはASRC全体ではない。sample_validの時刻列から、生の周期と平滑化した周期を作るだけに責務を限定する。
位相累積、補間、FIFOレベル制御は後段のモジュールで行う。
FILTER_SHIFTが大きいほど追従は遅くなるが、valid時刻の量子化やサンプル間ジッターを位相増分へ伝えにくくなる。
STEP_THRESHOLD_SHIFTを有効にすると、平滑化周期との差がその2のべき乗分の1以上となった周期変更は即時に取り込む。
TIMEOUT_PERIODを有効にすると、入力停止時にlockを解除して次の入力から測定をやり直す。
filtered_periodはPERIOD_WIDTH.FRACTION_WIDTHの固定小数点値である。
最初のsample_validは基準時刻を記録するだけで、次の到着からmeasured_periodを更新してperiod_validを1クロックだけHighにする。
有効な測定がLOCK_COUNT回に達するとlockedを保持する。
| PERIOD_WIDTH |
u32 |
整数周期のビット幅
|
| FRACTION_WIDTH |
u32 |
平滑化周期の小数部ビット幅
|
| FILTER_SHIFT |
u32 |
周期平滑化の右シフト量
|
| LOCK_COUNT |
u32 |
lock判定に必要な有効測定回数
|
| STEP_THRESHOLD_SHIFT |
u32 |
即時追従する周期差の比率を表す右シフト量、0で無効
|
| TIMEOUT_PERIOD |
u32 |
入力停止とみなすクロック数、0で無効
|
| clk |
input |
clock |
システムクロック
|
| rst |
input |
reset |
リセット
|
| sample_valid |
input |
bbool |
入力サンプル到着パルス
|
| measured_period |
output |
logic
| 測定した整数周期
|
| period_valid |
output |
bbool |
周期更新パルス
|
| filtered_period |
output |
logic
| 平滑化した固定小数点周期
|
| locked |
output |
bbool |
lock状態
|
| timed_out |
output |
bbool |
入力停止によるlock解除パルス
|
|
|
1段のhalfband補間と連続線形ASRCを接続した1ch 2倍オーバーサンプラ。
phase_incrementは入力サンプルレートを基準にしたQ0.PHASE_WIDTH値で受け取る。
halfbandで入力を2倍へ補間してからFIFOへ格納するため、内部のNCOには位相増分を
2倍して渡す。呼び出し側の推定器は48/44.1kHzなど元のADATレートの増分をそのまま
接続できる。
input → Halfband 2x (COEFFICIENT_SET=1)
→ 2-sample burst → FIFO → continuous linear ASRC → output
HBFはナイキスト付近のスペクトルイメージ成分を抑えるため、短いset2ではなくset1を使う。
STARTUP_LEVELまでFIFOを満たしてから出力を開始し、入力欠落はunderflowへ
stickyに記録する。
| FORMAT |
gndless_fixedpoint SignedFixedPointFormat |
| PHASE_WIDTH |
u32 |
入力レート基準の位相増分幅
|
| INPUT_DEPTH |
u32 |
線形ASRC FIFOの深さ
|
| clk |
input |
clock |
システムクロック
|
| rst |
input |
reset |
リセット
|
| input_valid |
input |
bbool |
入力サンプル有効
|
| input_ready |
output |
bbool |
入力受理可能
|
| input_sample |
modport |
gndless_fixedpoint FixedPointValue input_port |
入力sample
|
| phase_increment |
input |
logic
| 入力レート基準のQ0位相増分
|
| output_active |
output |
bbool |
連続出力が有効
|
| output_sample |
modport |
gndless_fixedpoint FixedPointValue output_port |
補間後の出力sample
|
| input_level |
output |
logic<$clog2(INPUT_DEPTH+1)> |
ASRC FIFOのワード数
|
| underflow |
output |
bbool |
入力不足のstickyフラグ
|
|