Veryl registryAkiyukiOkayasu/gndless-sample-rate-conversion-veryl · gndless_sample_rate_conversionSource ↗

Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

HalfbandUpsampler::<COEFFICIENT_SET>

複数channelのframe vectorを1個のMACでTDM処理する2x halfband upsampler。

sampleはQ4.23、係数はQ1.17。module境界はQ4.23で統一し、±1.0の信号を±8.0の範囲で扱う。 出力もQ4.23のまま。補間によって+/-1.0を超える場合もある。 入力はQ4.23上で+/-1.0以内(Q1.23相当)であることを前提とする。even phaseの係数の絶対値和は約1.346なので、 出力は最大+/-1.35程度、pair_sum(対称tapの和)は最大+/-2.7程度になり、どちらもQ4.23(±8)の範囲に収まる。 この前提を外れる入力(Q4.23上で±4.0を超える両端)ではpair_sumが27bitでwrapし、乗算前に破損するため、 producer側で入力が+/-1.0以内に収まることを保証すること。 入力frameはinput_valid && input_readyで受理し、処理中はinput_readyをLowにする。 出力はeven phase、odd phaseの順にchannel vectorを1回ずつ出力する。 output_validoutput_samplesは1クロックの出力レジスタを経由する。各出力は対応する状態に入ってから 1クロック後に現れ、ちょうど1クロックの間保持される。2x upsamplerのため入力frame 1つにつき even/oddの2出力frameを2クロック連続のburstとして出力するので、output_validは2クロック連続でHighになる。

historyはSRAM推論のためresetで初期化しない。起動直後の内容は不定であり、最初のHISTORY_LENGTH frame分の出力には不定値が含まれる。ストリームが進めば即座に実データへ置き換わるため、 消費側は起動過渡の値を要求しないこと。 historyは循環アドレス方式(書き込み位置のみが前進し、タップkは書き込み位置からk前の位置にある)で、 left/rightの2タップを同時に読むため同じ内容を2コピー持つ。書き込みは入力受理後に1 channelずつ行う。 MACはSRAMの同期読み出し(登録アドレス、1clkレイテンシ)をprefetchパイプラインで吸収し、 1 pair/cycleを維持する。SRAMの書き込みと読み出しは別状態で行うためread-during-writeは発生しない。

係数はfull tap列ではなく、halfbandの対称pair係数を実装した HalfbandCoefficientSet packageから受け取る。MAC自体はchannelと係数pairの 両方向へ時分割共有する。

COEFFICIENT_SETは係数set prototypeHalfbandCoefficientSetを実装したpackageで、デフォルトはHalfband103Q1_17。 Tap数が少ないHalfband39Q1_17も用意している。tap数が少ないと周波数特性は悪化するが、MACの処理時間は短くなる。

Generic Parameters


COEFFICIENT_SET HalfbandCoefficientSet

Parameters


CHANNELS u8 channel数。1つのMACでTDM処理する。ステレオを想定して2をデフォルトとする。

Ports


clk input clock system clock
rst input reset reset
input_valid input bbool input frame vector valid
input_ready output bbool input frame vector ready
input_samples modport gndless_fixedpoint __FixedPointValue__gndless_fixedpoint_Q4_23 input_port [CHANNELS] Q4.23 input frame vector
output_valid output bbool output vector valid
output_samples modport gndless_fixedpoint __FixedPointValue__gndless_fixedpoint_Q4_23 output_port [CHANNELS] Q4.23 output frame vector