TK80/BSの
シンセシステムを復活/拡張したい〜
その58
USB−MIDI変換の
ベロシティパッチユニットの作製
Rep_Dmaの作製
2020年
9月26日
USB−MIDI変換のベロシティのパッチユニットを作製します。近くのホームセンタで艶消し黒の缶スプレーを購入しました、
9月27日
USB−MIDIパラレル変換用のベロシティパッチのケースは大分前に購入してありました。パラレル変換と同じサイズの色違いです。パラレル変換フロントパネルをレーザ加工機でレタリングするため、艶消し黒で塗装しました。エンベロープジェネレータとパラレル変換のベロシティの対応はこの辺に出てきます。
ベロシティパッチのフロントパネルのレタリング原稿をQCADで入力します。CHARが文字レイヤ、LINEが線レイヤ、CENTERが3.5mmジャックのセンタポンチレイヤです。
HeeksCNCでレタリング文字のCHARレイヤを選択し、スケッチに変換します。その後、ポケット加工でGコードを生成します。
レーザ加工用に変換後、NCVCでパスを確認します。線分で作った三角がうまく変換できていませんでした。直ぐに忘れるので、備忘録として書いておきます。
CHARレイヤだけでスケッチに変換してもダメでした。
LINEレイヤも選択してスケッチに変換する必要がありました。変換したスケッチを全て選択して、ポケット加工します。
再度、NCVCでパスを確認します。今度は正しく変換できました。線分で作った閉じた図形はスケッチに変換する必要があります。
レーザ加工機で文字レタリングとセンタポンチを刻印しました。
センタポンチの刻印にポンチを打って、ボール盤で穴開けします。
3.5mmジャックを取り付けて、GNDと共通線を半田付けしました。
内部にはUSB−MIDIのベロシティ信号を分岐する簡単基板が入っています。片側はエンベロープジェネレータに分岐し、もう片側をフロントパネルに配線します。
10月7日
ベロシティパッチの内部配線を追加しました。
10月18日
HLSのDMAの続きです。外部のテストポイント経由では早い信号を見られないので、VivadoのILAを使って動作を確認します。ブロックデザイン内の信号線を選んでデバッグマークを付けるだけでILAに登録できます。また、ゲート信号の代わりにボード上のスライドスイッチを使うようにmyIPを修正しました。
DMAの設定はスタートアドレスが0x88000000(DDR)、リピートスタート=255、リピートエンド=511に設定します。この設定で先頭部が256ワード、リピート部も同じく256ワード転送になるはずです。
上記の設定した後でRep_Dma2_Startでブレイクします。
ハードウェアマネージャを開くと、ILAウインドが出てきます。トリガを無条件にしてILAをスタートします。FIFOのDMAに対するTREADYがイネーブルになっています。FIFOが受け入れ可能になったことが分かります。
FIFOの読み出しに使う64倍の音程クロックでトリガをかけてからILAをスタートします。音程クロックはフリ―ランしているので直ぐにトリガが成立し、1パルス幅の64倍音程クロックが出ていることが分かります。この信号は幅が10nSecしかないので、外部に接続したアナログディスカバリでは測定できない信号です。
トリガをゲート信号に設定し、ILAをスタートさせて、SDKを継続実行し、DMAをスタートさせます。トリガ待ちになるので、ボード上のゲート信号の代わりのスイッチをイネーブルにすると、トリガが成立し、以下の波形になりました。DMAのFIFOに対するTVALIDが間欠でイネーブルになっています。間欠になっているのは先頭部の256ワード、以降リピート部の256ワードが出力されているためと思われます。FIFOの深さは2048ワードなので、256ワードが8個入るはずです。良否は別にして、データ転送がゲート信号で開始されているようです。
ゲート信号のスイッチをディゼーブルに戻してから、再度、トリガを無条件にしてILAをスタートします。FIFOのDMAに対するTREADYはディゼーブルになっています。一方、FIFOの出力のデルタシグマDACに対するTVALIDとDMAのFIFOに対するTVALIDはイネーブルのままになっています。ILAは非常に便利ですが、サンプリングクロックが100MHzで今回は1024サイクル長なので、今回のようにFIFOの読み出しクロックが遅い場合には、全体を見通せません。外部のアナログディスカバリと併用して動作確認するようにしてみます。
10月21日
HLSのDMAの続きです。ボード上のスイッチに連動してDMAが開始されているようなので、デルタシグマの出力を確認してみます。DDR上に作った波形データを確認しておきます。先頭部とリピート部共に方形波で、振幅は下側が0x1000、上側が0xe000です。先頭部はリピート部の2倍の周波数に設定してあります。上限を0xf000にした方が良かったです。
デルタシグマの出力をアナログディスカバリのオシロで測定します。フィルタを入れなくてもF特が悪いので、オーディオ波形として測定できます。シングル動作でトリガをかけ、ボード上のゲート信号のスイッチをイネーブルにすると、DDRに設定したデータの通り、先頭部に続き、リピート部は連続して出力されています。波形データがDDRー>DMA−>FIFO−>デルタシグマに正しく出力されていることが分かります。
ただ、現状ではボード上のゲート信号のスイッチをディゼーブルにしても波形は止まりません。DMAの転送が終了して、FIFOに入っているデータが無くなれば波形は止まるはずです。
以下のように、リピート部のループ条件にゲート信号が1の時という条件は入っています。
ただ、C合成時にforループが無限ループになるというワーニングが出ています。
先頭部でゲート信号が1になるのを待っている部分はスイッチに連動して動いています。もう少し調査が必要です。
10月25日
先週の続きです。ゲート信号が下がっても、転送が止まらない原因が分かりました。gate変数にvolatile属性が付いていなかったので、ゲート信号の変化がロジックに伝わっていませんでした。早速、修正します。
アナログディスカバリのオシロでゲート信号とデルタシグマDAC出力を確認しました。赤枠がスタート部、赤ラインがリピート部、青ラインがFIFOに溜まっていたデータです。ゲートが下がって、FIFOに入っている最後のデータが出た後に、波形が止まることを確認しました。
10月26日
アパートに帰ってきました。方形波ではつまらないので、サイン波にしてみます。cygwin上のCプリグラムでスタート部とリピート部のcsvデータを生成し、結合してオープンオフィスのCALCで波形を確認します。先頭部は16ビットのフル振幅で、リピート部の振幅は80%で周波数は2倍にしました。
マイクロブレーズの制御プログラムにスタート部とリピート部を配列として入れ、DDRの初期化後にテーブル先頭にコピーします。
オシロで波形を確認します。スタート部の波形が1回、リピート部が複数回出力されていることを確認しました。赤枠がスタート部、赤ラインがリピート部、青ラインがFIFOに溜まっていたデータです。今後の課題としてはゲートが下がったら、FIFOをクリアするようにロジックを修正する必要があります。
FIFOをクリアするロジックを考察してみます。ゲートの立ち上がりを検出して、DMAを停止し、続いてFIFOをクリアします。その後DMAをスタートします。楕円内のようなタイミングで短時間で行います。ゲートがOFFの時はエンベロープジェネレータのリリースを使って減衰させます。
10月31日
先週の続きです。FIFOクリア信号を追加しました。アナログディスカバリのロジアナでタイミングを確認します。DMAゲートを約15uSec、FIFOクリアを5uSecにしました。
アナログディスカバリのオシロでゲート信号とデルタシグマDAC出力を確認します。ゲートの立ち上がりまで、前のリピート部が出力され、赤ラインの立ち上がり検出で、スタート部が出力されることを確認しました。
11月1日
立ち上がり検出を短くしてみます。以下のように、DMAゲートと、FIFOクリアを同時に行い、全体の長さを約10uSecにします。
ロジアナでタイミングを確認します。同時にDMAのゲート信号でDDSもクリアして、FIFOクリア中にDDSからのFIFOの読み出しを禁止します。赤丸はFIFO読み出し信号です。
ゲートの立ち上がり部を拡大してみます。DDSをクリアしたので、赤丸のスタート部の先頭のタイミングはゲートの立ち上がりからの時間が一定になります。
11月7日
HLSのDMA用の5V−>3.3Vレベル変換をアマゾンで購入しました。4ビットが6セットです。
レベル変換用にユニバーサルボードを切り出し、26ピンのMC80バスのコネクタを取り付けました。
FPGAボードの下側にはすでにピンヘッダが付いているので、ユニバーサルボードを下側に配置します。
1月8日
ユニバーサルボードに8ビット(データ)と4ビット(アドレス)のレベル変換を実装します。
ユニバーサルボードの裏に配線を追加していきます。
データとアドレスの配線が終了しました。
11月15日
HLSで作成したカスタムDMAが1チャンネルで動作しているようなので、2チャンネルにしてみます。DMAを追加すには接続するAXIポートを増やす必要があります。ブロックデザインでAXIインターコネクトのプロパティを確認します。現在はスレーブが2、マスターが8です。
スレーブ、マスタともそれぞれ1チャンネル追加し、スレーブを3に、マスタを9にしました。
その後、ブロックデザイン内でDMAとFIFO、デルタシグマをコピー&ペーストし、必要な配線を追加します。
アドレスエディタで追加したDMAをマップします。
追加したDMAはプログラムで初期化と設定をする必要があります。HLSのユーザガイドUG902でAPIの初期化関数を確認しておきます。xxx_LookupConfigの引数でIDを設定すれば良さそうです。
因みに、現行のソースではXrep_dma2_LookupConfigの引数は即値で0を入れています。
2チャンネルに追加した後でSDKを起動し、SDKのBSP下を1チャンネルの時と比較しました。xparameters.hで差分が見つかり、以下のようにインスタンスが1つ増えて、IDが追加されていました。