5 |
CmodA7toPMODの評価 |
CmodA7toPMODV5/6のノイズ評価
それぞれのボードに部品を実装してノイズ評価を行いました。その結果以下のようなことが判明しました。
- 改版後のV6でもV5と同様にノイズが乗る。主にXADCに供給していた100MHzクロックが原因のようだ。
- 100MHzを落として8MHz程度にすると正しく動作し、かつスイッチONでのブー音が消えた。
- スペースインベーダーはXADCを使用していないので、どちらのボードでも画面縞は発生しない。
- 一方、XADCクロックを8MHzに落としても画面の斜め縞はV5/V6両方で発生する。
- XADCへの供給クロックを8MHzに落とした(上記)だけではなく、XADCの内部動作クロック設定も8MHzにしたが、斜め画面縞は変わらず原因不明。
実験によるフィードバック
V6基板においてVRを実際にADCに接続してJTAG経由で測定したところ、ADC入力電圧値は0.208~0.9804Vとなりました。LTSpiceの値とほぼ一致する結果です。
設計計算の変化点をマーカで表示します。ピンクは前記事との変化点であり、ブルーは最終結果としてソースコードに入れる値です。
- VRの全角度は300°
- VRの有効角はパラメータ化し、開始角a[°] (デフォルト値a=105)、範囲b[°] (デフォルト値b=90)
- VRの全角度の際のADC入力電圧は測定結果より、0.2~0.98[V]
再設計計算
これらより、ADC入力電圧は開始角$a$の値を$V_\text{a}$、終了角$a+b$の値を$V_\text{a+b}$として、 $\require{color} \definecolor{pink}{rgb}{1.0,0.8,1.0} \definecolor{blue}{rgb}{0.8,0.8,1.0}$
- $V_\text{L}=\colorbox{pink}{0.2}$, $V_\text{H}=\colorbox{pink}{0.98}$
- $V_\text{range}=V_\text{H}-V_\text{L}=\colorbox{pink}{0.78}$
- $V_\text{a}=\frac{V_\text{range}}{300}a+V_\text{L}$
- $V_\text{a+b}=\frac{V_\text{range}}{300}(a+b)+V_\text{L}$
次にAD変換後のデータDは入力全範囲0~1[V]を4096分割する。開始角の値を$D_\text{a}$、終了角の値を$D_\text{a+b}$として
- $D_\text{a}=4096V_\text{a}=\frac{4096V_\text{range}}{300}a+4096V_\text{L}=\colorbox{pink}{10.65}a+\colorbox{pink}{819.2}$
- $D_\text{a+b}=4096V_\text{a+b}=\colorbox{pink}{10.65}(a+b)+\colorbox{pink}{819.2}$
- $D_\text{range}=D_\text{a+b}-D_\text{a}=\colorbox{pink}{10.65}b$
一方、y座標の制約は以下のとおりであり、$y_\text{top}$(上限$y_\text{max}$+5%)と$y_\text{bottom}$(下限$y_\text{min}$-5%)の値でクリッピング。
- $y_\text{min}=\colorbox{pink}{44}, y_\text{max}=\colorbox{pink}{219}, Paddle_\text{h}=\colorbox{pink}{26}$
- $y_\text{bottom}=y_\text{min}-7=\colorbox{pink}{37}, y_\text{top}=(y_\text{max}-Paddle_\text{h})+7=\colorbox{pink}{200}$
- $y_\text{range}=y_\text{top}-y_\text{bottom}=200-37=\colorbox{pink}{163}$
これらからy座標を求めると、ADCのデータを$D$とすれば、
- $y=\frac{y_\text{range}}{D_\text{range}}(D-D_\text{a})+y_\text{bottom}=\frac{\colorbox{pink}{163}}{\colorbox{pink}{10.65}b}D-\frac{\colorbox{pink}{163}}{b}a-\frac{\colorbox{pink}{163}\cdot\colorbox{pink}{819.2}}{\colorbox{pink}{10.65}b}+\colorbox{pink}{37}\\ =\frac{\colorbox{pink}{244.9}}{b\ll4}D-\frac{\colorbox{pink}{163}}{b}a-\frac{\colorbox{pink}{12538}}{b}+\colorbox{pink}{37}=\frac{\colorbox{blue}{245}D-\colorbox{blue}{2608}a-\colorbox{blue}{200615}}{b\ll4}+\colorbox{blue}{37}$
y式中のシフトは固定小数点演算を行うために分母分子を16倍しているものです。さらに最小値$D_\text{a}$、最大値$D_\text{a+b}$で入力ADCデータのクリッピングを行います。
- $D_\text{a}=\colorbox{pink}{10.65}a+\colorbox{pink}{819.2}=(\colorbox{blue}{170}a+\colorbox{blue}{13107})\gg4$
- $D_\text{a+b}=\colorbox{pink}{10.65}(a+b)+\colorbox{pink}{819.2}=(\colorbox{blue}{170}(a+b)+\colorbox{blue}{13107})\gg4$
以上より、完成したBSVコードの変更点のみを以下に示します。
クリッピング値計算部分
// 座標の下限-5%と上限+5%に対応するADC値の計算
Bit#(20) adcMinValue = (170 * extendedA + 13107) >>4; // Min = 10.65A + 819.2
Bit#(20) adcMaxValue = (170 * (extendedA + extendedB) + 13107) >> 4; // Max = 10.65(A+B) + 819.2
ADCからy値計算部分
Bit#(24) coordinate = ((zeroExtend(clippedAdcValue) * 245
- zeroExtend(extendedA) * 2608 - 200615 + 915)
/ zeroExtend(extendedB) >> 4) + 37;
+915は途中計算がアンダーフローして値が最大値にならないように調整するものです。この例のように小数点演算において0をわずかに割った場合、負数は正の最大値となるため、非常に大きな誤差が起こります。
FSM中でのパドルの可動範囲$y_\text{min}=\colorbox{blue}{44}$、$y_\text{max}-Paddle_\text{h} + 1=219-26 + 1=\colorbox{blue}{194}$でクリッピングすることを忘れないように注意します。