TK80/BSの

シンセシステムを復活/拡張したい〜

その29

EGとLFOの実験、DCAの追加
2018年
9月29日
先週からのエンベロープジェネレータの続きです。浮動小数点の部分をすべて固定小数点に変更し、アタック、ディケイ、サスティーン、リリースを
引数設定できるようにしました。下はテストベンチです。


最適化指示は色々と試したところ、同時に動作する乗算を1個に制限すると、リソースが少なくなりました。その他は効果ありませんでした。


合成後、リソースを確認します。DSP48E7個使用しています。


C/RTLシミュレーションの結果をグラフにしました。動作良好です。


上記のエンベロープジェネレータは戻り値が無く、出力結果はポインタ渡しの変数に逐次、代入されます。これではタイミングが制御しにくいので、ラダーフィルタと同じく、出力結果を戻り値で返し、外部からタイミングを制御できるようにap_ctrl_chainインターフェースに変更します。この変更により、関数は1回づつ、戻り値を持って戻るように修正します。


テストベンチでは前後にゲートオフの部分を挟んで、ゲートオンで関数を複数回呼んでテストします。


合成後、タイミングを確認しておきます。サスティーン中は計算が少ないためか、レイテンシが1〜60と幅が大きいです。


波形を確認します。戻り値をアナログ表示してみました。動作良好です。


9月30日
エンベロープジェネレータが良さそうなので、続いてLFOを作ってみます。SIN波はリソースを食いそうなので、三角波矩形波のみ実装してみます。三角波と矩形波はmode引数で切り替える仕様で、同時には出力できません。慣れてきたので、cygwinのCでプログラムせず、初めからHLSの固定小数点で作ります(笑)。


シミュレーション結果をオープンオフィスで波形にして確認します。振幅は+1.0〜−1.0です。周波数の設定は引数のstepで設定します。


mode引数矩形波の閾値兼用)でモード矩形波にしてみます。矩形波では閾値を変えてPWMもできます。右は閾値0.5の時です。


リソースを確認すると、乗算器でした。


こちらも、エンベロープジェネレータと同じく、外部からタイミングが制御できるように、ap_ctrl_chainインターフェースに変更します。


合成後、タイミングを確認しておきます。主に、加算器とコンパレータなので、レイテンシが0インターバルが1です。


波形を確認します。出力はfix20_12の合計32ビットの+1.0〜−1.0で符号付です。小数点部の下位しか動かないため、アナログ表示は変な表示になっています。


データを詳しくみると、小数点部インクリメントされていて正常のようです。ap_ctrl_chainインターフェースの各ハンドシェイク信号レイテンシが0、インターバルが1のためか、関数を呼んだ分のパルスが出ず、1個になっています。この日は台風接近のため、午後4時にガレージを出ました。アパートでは音出しはできませんが、アナログディスカバリを使って簡単なテストはできるので、ラダーフィルタの論理にエンベロープジェネレータLFOを追加して動作確認する予定です。



10月6日
LFOEGの出力をSPI−DACへデバッグ出力して確認します。EGはゲートを疑似的に入力してテストします。双方とも小数点部をシフトして、SPI−DACに出力します。LFOの出力がオーバフローしています。


最大値を1.0から0.992Vに少し小さくしました。HLSのシミュレーション波形では最大値は1を超えていないです。


IP組み込み後にVivadoデバッグ用のロジックアナライザでいろいろと調べると、を超えていると時があります。不思議です。


10月7日
とりあえず、LFOの振幅を0.5〜−0.5に小さくして、再IP化しました。


SPI−DACへのデバッグ出力して、再確認します。当然ですが、LFOもオーバフローせず、正しく出力されています。


10月8日
EGのADSRに対応させるためにXADCに接続している、ボリューム4個にしました。プッシュボタンでラダーフィルタとEGとLFOを切り替えて、パラメータを設定します。


ロジックを修正して、ラダーフィルタをLFOEGで変調できるようにしました。下はLFOで変調した時です。


続いて、EGで変調した時です。カットオフレベルを低めにして、EGで大きく変調すると、DCA的な動作になります。


EGLFOミックスしてみます。ただし、オーバアンダフロー未対応のため、設定によっては、異常値になります。これは対策が必要です。


以前のグラスに続いて、今回は100円ショップの200円の耐熱カップTK80ロゴサンドブラストします。


完成しました。カップ底のμCOM−80のロゴはミラー反転させ、上から覗いた時に、普通に見えるようにしました。沸騰したお湯を入れて割れないことを確認しました。


HLSでDCAを作成してIP化後、パラメータの設定も共にロジックに追加しました。DCAは出力、入力、CVともfix20_12フォーマットの単純な乗算器です。LFOで変調してみます。


続いて、EGで変調します。ラダーフィルタと同様にLFOとEGをミックスできます。


現状で基本動作しているFPGA内のシンセモジュールはDDS/DCO(方形波のみ)、DCF(ラダーフィルタ)EGLFODCAです。リソースの内、当初から不足気味の DSP4822個/chです。35TデバイスのDSP48E数は90個なので、4ch分しか入りません。100Tデバイス240個で足りそうです。


リソースをグラフで確認しておきます。


ソースウインド内の階層ライブラリの現状です。


以下、追加予定の機能です。

<DDS/DCO>
 ・LFO変調
 ・ノコギリ波を追加
 ・方形波を廃止してPWMに変更(LFO、EGで変調可)
 ・1/2、1/4.1/8分周波の生成と上記ノコギリ、PWMとのミックス
 ・外部入力用のSPI−ADC追加、DCO信号とのミックス

<LFO>
 ・
ゲートシンクロディレイドLFO

<パラメータ入力SPIインターフェース>
 
・MSP430制御のロータリエンコーダ128x64ドットLCD

10月10日
アパートのPCで作業します。ラダーフィルタDCA
制御値がアンダーフローしないように対策します。下はダラーフィルタの動作です。左は未対策、右は対策後です。予めLFOの加減算を行い、アンダーフローが発生していたら、クリップさせます。






back