« DAC8基板が動いたけど・・ | トップページ | DACの出力波形を綺麗にする »

2022.07.14

CORDIC法でSINとCOSを生成

Cosmo-ZのDACから正弦波を出すため、CORDIC法のIPコアを使って正弦波づくりに再チャレンジしています。

過去にCORDICコアを使ったことは何回かありました。

過去の自分の記事を参考にします。

XILINXのCORDICコアで、位相と出力を16bitにします。

Cordic

入力の位相はScaled Radiansにします。そうすると符号1bit+整数部2bit+小数点以下13bitになります。Scaled Radiansでは-1~+1が-π~+πに相当するので0xe000~0x1fffまでスキャンすれば[-π,π)の範囲をスキャンできることになります。

出力は16bitにしていますが、SINとCOSで32bit幅で出てきます。なお、AXI Streamは8bit単位なので、位相を18bitにするとバス幅は24bitになります。ほしい精度が14bitなので入力のビット幅をそんなに増やしても意味はないので、16bit入力16bit出力くらいでちょうどよいのではないかと思われます。

こうやって作った正弦波なのですがシミュレーションしてみると、SINとCOSの最大値最小値のところですこしギザギザしているような感じがします。

例えば下の波形は、CORDIC法が出すSINの値に着目したものです。0x3fff(0.999に相当)と0x4000(1.000に相当)をいったりきたりしています。

Cordic3

別のインプリメンテーションでは下1bitは正しく変化していないように見えます。

Cordic4

CORDICは下2bitくらいはブレがあるように見えるので、2~3bit多めに生成して切り捨てるくらいにしたほうがよさそうな感じです。

下の波形はCORDIC法の出力結果に0xffffを乗算して下位ビットを切り捨てて0x8000を足したものです。つまり0x0000~0xffffの正弦波を作っているのですが、最大値の部分(黄色のトリガ)も含め最下位ビット[0]は正しく変化していないように見えます。

Cordic2

というわけで、CORDICで16bitで生成した値を0xffffと乗算して、上14bitだけ切り取ることで、0x0000~0x3fffの綺麗な正弦波が作れました。

Cordic5

Cordic6

下2bitはやはり使えません。2bitくらい多めの精度のCORDICコアを生成して切り捨てるくらいの覚悟で作りましょう。

この正弦波をDACから出してオシロで測ってみました。綺麗なつるつるの正弦波に見えますが・・

Cordic7

オーディオアナライザを使って測ってみるとTHDは-81dBとのこと。

Cordic8

惜しい。

FFTしてみると確かに高調波が-80dBくらいで見えています。

Cordic9

使っているDACのSFDRは10MHzで-84dBcだし、初段の差動アンプは-115dBc、集団のアンプも-89dBcクラスなので、もうすこしいけるはず!

Cordic10

 

|

« DAC8基板が動いたけど・・ | トップページ | DACの出力波形を綺麗にする »

コメント

コメントを書く



(ウェブ上には掲載しません)




« DAC8基板が動いたけど・・ | トップページ | DACの出力波形を綺麗にする »