2015年1月12日月曜日

ZYBO 18 ( I2S コントローラの作成 9 )

初回動作が旨く行かない場合がある件は、I2Sコーデックの初期化の問題とRTLのバグだった。
また、リミットサイクルについては正弦波テーブルの値を若干小さくしてみることにした。
具体的には本来の値を0.9999999倍した。

以下はテーブルのデータを生成するプログラム。

生成されるデータ ROMの初期値としてロードするため、32bit floatをhex形式で出力している。
左が本来の値で、右が縮小値



今のところこのテーブルで旨くいっている。

現状のプロジェクトのアーカイブを以下に置いた。
https://drive.google.com/folderview?id=0BynL4T1Zsl44UFBsMFVLZWRGVTQ&usp=sharing

https://github.com/BravoFpga/I2S-control-IP-for-ZYBO-zynq-

リポジトリをGitHubに変えました。 (2015/1/31)


2015年1月4日日曜日

ZYBO 17 ( I2S コントローラの作成 8 )

AXI マスタ側は一応動作するのだが、初期化の部分に問題があるようで初回動作が異常(ノイズ混じりの音になったり、再生スピードが遅く感じる)な場合がある。問題の発生頻度は起動直後が高く、一度正常に再生すると以降は安定になる。リセット周りに原因があるような気がしている。

正常動作時

前回まではwavファイルのデータをテキストに変換しCプログラムの配列としてハードコードしていたのだが、この方法は何かと不便だ。何か良い方法は無いか調べたところ、xilffsというドライバを使うとOSのないベアメタル環境でもFATフォーマットのSDカードの読み書きが出来ることが判った。そこで、 wav ファイルをFATフォーマットのSDカードに入れておいて、そこから順次メモリに読み込んで再生するように変更した。
xilffsを使うためには以下のようにBSPを設定する。


xilffsの使い方は、Vivado_SDKのインストールフォルダ下にexampleがある。


これを参考にして以下のようなプログラムにした。

この様にして色々な曲調のデータを再生させてみている。
表示されるスペクトルの変化と音の変化がほぼ完璧に同期している。また、これは思い込みかも知れないけど、スペクトルの変化具合・・・というか絵から受ける印象も曲調に一致しているようで、なかなか面白い。

そんな感じで色々な曲を連続再生して見ていたら問題が見つかった。
前回dft_ip作成時に発生した現象と似た現象が発生している。多分これは、リミットサイクルノイズだと思う。実機と同じように複数のwavファイルをCモデルで処理させたところ同様の結果になった。単精度浮動小数演算器で計算しているとは言っても量子化ノイズは完全にゼロになる訳ではないのでこうなるのは当たり前かも知れない。アキュレータで積算するときに若干の縮小係数を掛けるとか、一定サイクルでアキュムレータをクリアするとか、ある閾値以下の場合に0にするとか何らかの対策が必要なようだ。ただ、闇雲にやっても仕方ないので、当面は1曲毎にアキュムレータをリセットすることにした。




自作CPUで遊ぶ 25

まだ制御ソフトが完成していないので今まではスピンドルを移動するために一々簡単なプログラムを書いて移動させていたのだが、非常に面倒なのでCNCペンダント的なものを作ることにした。 右側の縦に2つ並んでいるスイッチ...