NP1003応用例A へぇ〜しっく (HASIC)

発表日 2004年1月9日

2004年1月9日 発表
2004年1月11日 キャプチャしたサンプル音声を掲載
                       HuMANDATA社製XSP006-200に対応
                       FFTスペクトラム測定

へぇ〜しっくとは

 「へぇ〜しっく」はFPGAワンチップで構成するへぇボタンです。
 USBにつないだ瞬間、あるいはプッシュボタンを押したり、USBからデータを送るたびに圧電サウンダから「へぇ〜」と脱力感のある音が鳴ります。

 「へぇ〜しっく」の音を聞く (he-captured.wav 205kB)
         ※圧電素子ではなく、PCのライン入力から取り込んだ音声です。

img1.jpg
写真1 へぇ〜しっくの外観

 なお、「へぇ〜しっく」の語源ですが、FPGAは広義のASICといえますので、「へぇ〜」とASICをかけて、HASICと名づけています。

機能概要

 FPGA内のブロックRAMを波形ROMとして使用し、FPGA内にDelta-Sigma型1ビットDACを構成して、FPGAのI/Oから直接アナログ信号を出力します。
 へぇボタンは、多数連続で押したときに、「へへへぇ〜」とならずに、

へぇ〜〜
 へぇ〜〜
   へぇ〜〜
       へぇ〜〜

 と、重なり合って聞こえます。「へぇ〜しっく」ではこの重なり合い機能を4多重まで実装しています。
 なお、押しボタンには、50msの不感時間を設けてチャタリングを除去しています。

実体配線図

 以下に、「へぇ〜しっく」の作り方を示します。

 これだけで、圧電サウンダが「へぇ〜」と言います。

電源投入で「へぇ〜」がなるということ -コンフィグROM-

 NP1003はコンフィグROMがオンボードで標準搭載されているため、USBケーブルを挿入と同時に「へぇ〜」を発声でき、すぐに楽しめます。
 もし、基板上にコンフィグROMがなく、いちいちPCからダウンロードしなければ「へぇ〜」が鳴らないようでは面白さが半減してしまうでしょう。

Delta Sigma 1ビットDACのしくみ

 簡単に申しますと、1と0を高速に切り替えて、その密度で中間値を出すというものです。

 簡単なイメージ図で、PWMと比較してみましょう。

img1.png

図2 PWM出力の波形

img1.png

図3 Delta Sigma 1ビット DAC出力の波形

 PWMもDelta Sigmaも1と0の密度で中間値を表現する方法なのですが、Delta Sigmaの方がきめ細かい出力が可能です。波形はどちらもギザギザしていますが、周波数成分で見ると、次のように大きな差があります。

img1.png

図4 PWM出力のスペクトラム

img2.png

図5 Delta Sigma 1ビット DAC出力のスペクトラム

 PWMは低い周波数成分に高い周波数成分にもだいたい一様なノイズを持ちますが、Delta Sigmaではそのノイズが高い方へと押しやられてしまい、低い周波数成分は綺麗なスペクトルになります。実際、耳に聞こえるのは20kHzくらいまでなので、数百〜数MHzにあるノイズは耳に聞こえず、クリーンな音が聞こえるのです。

 なお、本来はDACの出力にローパスフィルタをつなげるべきです。
 ローパスフィルタをいれないと、高周波成分がそのまま出力されてしまいます。したがって、圧電素子はおそらく超音波を撒き散らしています。もちろん耳には聞こえません。また、配線が長くなると、配線がアンテナとなって電磁的ノイズを周囲に撒き散らします。パワーMOS FETなんかをつないで、バチバチON/OFFしたら、高周波電流で負荷が燃えるかもしれません。

 このため、Delta Sigma DACの出力にはローパスフィルタを入れることを強くおすすめします。しかし、CR型のフィルタはエネルギを消費しますので、エネルギが勿体無いだけでなく、パワーMOS FETの大きなアンプでは発熱しそうですね。このため、最終段階でLC型のフィルタを使うのが一般的だそうです。コイルとコンデンサではエネルギを消費しませんので。

 Delta Sigma DACの実装については、XILINXのアプリケーションノート XAPP155がとても簡単な方法を紹介しています。

 なお、Sigma Delta 1ビットADCといのもあります。これを使えば、FPGA単体でADCとDACが構成できます。速度はあまり速くはないのですが、数10k sample/sec、10ビットくらいのDACやADCは簡単につくれてしまいます。
 それはそれで、また別の機会に。

波形の測定

 Sigma Delta DACでは、その波形を見てもとてもアナログには見えません。

写真3 Delta Sigma 1ビット DAC出力の波形

 より拡大していくとこのように密度の差が見えてきます。

写真4 Delta Sigma 1ビット DAC出力の波形波形

 圧電サウンダをつなぐと、FPGAのI/Oピンがなぜかハイパスフィルタのような波形になりました。圧電素子に短時間の間にエネルギが蓄積されたり開放されたりを繰り返すのでしょうか?
 FPGAのためにも、周囲の環境のためにもあまり良いとはいえないのかもしれません。

写真5 圧電サウンダ上の電圧

 LPFをつなぐと、このようにアナログ信号が取り出せます。なお、写真6は「へぇ〜」を、「へぇ〜 へへへぇ〜」の要領で4回鳴らしています。

写真6 LPFを通した場合の電圧波形

 

 「へぇ〜」の音をPCのマイク入力から入力し、測定したスペクトラムです。

今後の方針

 一般に、「へぇ〜」の音声は、10kHzくらいまでの成分を含んでいるので、サンプリング周波数が低いと曇った音になってしまいます。しかし、サンプリング周波数を上げると、FPGA内の(ブロックRAMでつくる)ROMの容量が足りなくなります。そこで、音声を圧縮してROMに記憶し、それをリアルタイムに展開して発声するのがベストかと思います。音声圧縮には、ADPCMやCELPなどいろいろあり、また、メーカー系のADPCMのアルゴリズムはいろいろとライセンスがあると思うので、G.726のアルゴリズムを探しているのですが、ネットで簡単には落ちていません。G.726を使って音声を圧縮し、サンプリングレートを少なくとも20kHzくらいまでは上げられれば、音質がとてもよくなると思います。

 あと、NP1003だけでなく、ヒューマンデータさんのXSP006でも動くと思います。押しボタンと圧電サウンダがあるので、「へぇ〜しっく」がすぐに構成できそうです。しかも、7セグのLEDがあるので、カウンタにもなりそうです。
XC2S200ならば、もう少し長い音声も入りそうです。
できました。

 今回の記事は、Sigma Deltaの理論的な部分には深入りせずにさらっと書きました。私もSigma Deltaを勉強して、そのうち高度な解説ができるようにします。

ソースコード

NP1003用

  1. VHDLソース main.vhd ・・・メインのソースコード
  2. VHDLソース dac.vhd  ・・・1ビット SigmaDelta DACのソースコード
  3. VHDLソース usbif.vhd ・・・USBインタフェースのソースコード
  4. UCFファイル main.ucf ・・・ピン配置とブロックRAMの初期値 

上のソースから最終的に出来上るファイルは、次のbitファイルです。
 BITファイル hasic.bit ・・・コンフィグROMに書き込むファイル (XC2S100,クロック28.63636MHz用)
 ※28.63636MHz以外の周波数でご使用の場合は、main.vhdの最初にあるGeneric文を修正してください。

HuMANDATA社製、XSP-006-200用

 圧電素子のサイズが小さいためか、低音がよい音で鳴りません。アンプとスピーカーをつなぐととても良い音が楽しめます。また、7セグメントLEDによって999999へぇまで数えることができます。

 


戻る