TK80/BSの
シンセシステムを復活/拡張したい〜
その22
VCFの修正、バイナリ表示器の修理
VivadoのMicroBlazeにDDSを組み込み
2018年
5月19日
この週は午後からガレージに来ました。先週の続きです。VCFのラダーコンデンサの交換です。残りの4台の交換が終了しました。
こちらも、先週の続きです。筐体内で音程CVをVCFのコネクタに接続します。8ch分、接続完了です。
VCFとディレイド・モジュレータを戻して、動作確認しました。良好です。
5月20日
前から気になっていたMC80+バスの信号を表示するバイナリ表示が点灯不良です。24ビット全ての入力がプルアップされているので、信号を接続しなければ全てのLEDが点灯するはずなのですが、4点ほど点灯しません。ドライバの4050が壊れているようです。手持ちの物と交換しました。
全て点灯するようになりました。
MSP430−USB−MIDI変換のTK80側のバスにプルアップ抵抗を追加しました。今まで上記のバイナリ表示器のプルアップ抵抗が効いていたのですが、HC245でMSP430のGPO側と切り替えているため、入力側にプルアップ抵抗が無くなっていました。データとアドレスで合計12個のプルアップ抵抗を追加しました。
ディレイドモジュレータの出力ジャックは1個しかなく不便なため、2個パラに修正します。パネル面に位置決してボール盤で6mmの穴を空けます。
ジャックを追加して8ch分完成しました。1つは常時DDSに、もう一つはVCF/VCAに接続します。
5月26日
友人SにDR4のMIDIインターフェースボードを貰いました。
これも貰ったロシア製のLEDです。ばらつきが大きいらしいです(笑)。
フルークの簡易波形表示付きテスタ(モデル867)も貰いました。ただ、交流/直流の電圧レンジしか動作しません。
フルークのWEBでサービスマニュアルがダウンロードできます。後ろに回路図があり、早速、機能切り替え周辺の回路を調べてみました。CPUはH8でロータリスイッチで抵抗分圧した電圧をA/Dに入れて、機能切替をしています。
A/Dの電圧を調べるために信号を引き出しました。
A/Dの電圧を計算してみます。カーボンパターンの部分を600オームで計算してみました。約0.46Vの電圧差で機能を切り替えているようです。いろいろと弄っていると、動作する機能が増えてきました(笑)。動作不良の機能のA/D電圧は理論値と異なっています。
ロータリスイッチは基板にカーボンパターンが印刷されていて、初め、カーボンパターンの接触不良と思ったのですが、違いました。なぜか分圧用の抵抗を再ハンダ付けしただけで、全ての機能が動作するようになりました。
0.44A/1000VのmAレンジの保護ヒューズです。ミニチュアヒューズが並列にハンダ付けされていました。mAレンジのヒューズはよく飛ばしますが、このヒューズは1000円近くします(笑)。交換してもすぐ飛ばしそうなので、このままで行きます。
コンポーネントテスト機能です。カーブトレーサです。スイッチングダイオードをテストすると下記のようなグラフが出ます。なかなか良いです。
リファレンス電源で確認してみます。電圧はぴったりでした。mAレンジもまずまずです。まあ、リファレンス電源の方も校正しているわけてばないので、どのくらい正確なのか不明ですが〜
5月27日
DDSを自作IPとしてMicroBlazeに組み込みます。以前に合成、インプリしただけで動作確認をしていませんでした。MicroBlazeのソフトウェアは”FPGAプログラミング大全”のタイマの割り込みでLEDを点灯させるテストコードが入っています。MicroBlaze側はタイマ、割り込み、GPO、UARTが正常に動作しています。DDS側は8ch分、正常動作しています。しかし、以前に組み込んだステータスLEDが消灯しません。単独の論理と同じものを組み込んでいるのに、不思議です。
合成時にワーニングが出ていて、LEDを消灯する20mSecのカウンタが消されているようです。
単独の方でも同じワーニングです。WEBで調べると、どうもVivadoの不具合のようで、実際には消されていないです。ここに質問があり、新しいバージョン2018.1では直っているようです。
回路図で確認するとステータスLEDを消灯するカウンタは実装されていました。回路図を調べていてると単独の時とIPとしてMicroBlazeに組み込んだ時でステータスLEDを保持しているFFの周辺の回路が異なっていることが分かりました。以下は単独の時です。ステータスLEDの保持用のFFの出力がバッファを通して、そのまま外のピンに接続されています。
続いて、MicroBlozeにIPとして組み込んだ時です。当然、ラッパーがあるので、外のピンには直接接続されていないのですが、なぜかLUTへ信号が戻っています。元は同じ論理ですが、他の論理との組み合わせで実装が変わるようです。これがステータスLEDが消灯しない原因かは不明です。
6月2日
DDSの論理を変更します。以下は一般的なDDSです。SIN波を出力します。
今までFPGAに実装していたDDSのブロックです。動作確認のために内部で三角波を生成して閾値でコンパレートして1ビットのデジタルクロックを生成していました。実は破線内は冗長です。
上記の冗長な部分を削除して、アドレスカウンタの最上位ビットをそのままDDSの出力クロックとして使用します。
データラッチ部も含めて、1ch分のDDSのブロック図を作り直しました。
Vivadoで合成、インプリしてデバイスを確認します。赤枠内がMicroBlazeで左側にDDSが移動し面積も小さくなっています。
使用率を確認しておきます。15%弱です。以前は50%強だったので、大分小さくなりました。
ステータスLEDのFFはDDS単独の時と同じように、そのまま上の階層に出る回路になっていました。
シミュレーションを行ったところ、約20mSecでステータスLEDが消灯しています。
変更した論理をFPGAに書き込んで、動作確認しました。MSP430のLEDと同様にステータスLEDが点灯/消灯することを確認しました。また、MicroBlazeのGPIOに設定しているボード上のLEDも点灯し、DDSとMicroBlazeが正常に動作してます。クリックすると短い動画を再生します。
ステータスLEDが無事動作したので、MicroBlazeにユーザインターフェース用のLCD、LED、スイッチを接続します。FPGAボードのSPIコネクタをレベル変換−クロックドライバボードまで延長します。
FPGAボードからLEDとスイッチのケーブルを引き出します。
SPIコネクタからLCDケーブルを延長します。
6月3日
SPIのプログラムはXilinxのSDKのSPIループバックのサンプルコードの”Xspi_Low_level_example.c”を修正して初期化と1バイトライト関数に変更して使います。
SPIコネクタにアナログディスカバリを接続してSPIの波形を確認します。
1バイト送信のテストプログラムを作成します。SPIのクロックは100MHzの128分周の約781KHzです。正常に動作しているようです。
LCDはMSP430のUSB−MIDIと同じST7565です。SPI信号の3ビットとは別にコマンドとデータを分別するA0信号が必要です。MicroBlazeのGPOをA0に割り当ててコマンドとデータのテストを行います。コマンド0x55、続いてデータ0xaaを出力します。良いようです。
波形は正しいようなので早速、LCDに接続しました。MSP430のUSB−MIDIのLCD制御プログラムの1バイトライトをパラレルからSPIに変更しました。正常動作しています。
両面テープでフロントパネルに固定してバックライトも接続しました。パネルのスイッチとLEDもMicroBlazeでアクセスできることを確認しました。
プログラムのデバッグ中に思った通りに動いたり動かなかったりすることがあり、WEBをしらべてると”Vivado のSDKのハードウェア・プラットフォームによる動作不良”というページがありました。このページで原因が分かりました。プログラムの”timer_led”は”xx_hw_platform_0”と紐付けされています。一方、FPGA側のロジックは変更するたびにxx_hw_platform_xが番号が0〜2と上がっていきます。本来、プログラムは最新のハードウェアプラットホームと組み合わせなければ正しく動作しないとうことのようです。なので、最新の”xx_hw_platform_2”のみ残して他は削除し、新しくハードウェアのエクスポートからやり直せば、正しく動作するようになります。下記の赤枠が多数のハードウェアプラットホームが生成されているSDKの図です。