FPGA(DE1-SoC)とDA変換IC(MCP4922)でアナログ出力

以前の記事でArduinoとDA変換(以下DAC) IC(MCP4922)を使って正弦波を発生する記事を書きました。

DAC ICをこのまま使わないのももったいないので、FPGA(DE1-SoC)で通信して波形出力する実験をしてみました。

SPI通信等触れたことなかったので良い勉強になりました。

用意したもの

ハードウェア

  • DE1-SoC(FPGA)
  • MCP4922(DAC)
  • 電源含むブレッドボードなど

ソフトウェア

  • Quartus II 15.0 (フリーのものです。シミュレーションも付属のAltera Modelsimで行ってます。)

回路図

DE1-SoCにはGPIOピンがたくさんついてるのでそれの一部を使ってます。

MCP4922の各種ピンは以下のように接続しています。

  • SCK => GPIO_0[0]
  • SDI => GPIO_0[1]
  • LDAC => GPIO_0[2]
  • CS => GPIO_0[3]
  • Vref => Vdd(3.3V)
  • Vouta => オシロのプローブ

MCP4922とのSPI通信の方法

MCP4922のデータシートは以下にあります。
http://ww1.microchip.com/downloads/en/DeviceDoc/22250A.pdf

データ列としては以下を用意する必要があります。

説明は以下のサイトで良くされていますので、参考にいたしました。ありがとうございます。
http://www.geocities.jp/zattouka/GarageHouse/micon/circuit/D_A.htm

今回は”A出力、バッファーモード、出力ゲインは1、シャットダウンはなし”とするので、

ヘッダ(15~12bit)としては、”4’b0111″をアナログ出力データごとに付加する必要があります。
(バッファはVrefのものですが、ハイインピーダンスになるということでバッファモード(“1”)とします(電源と接続しているので恐らくバッファモードにする必要はなし。Vrefの供給電力が低いときにバッファモードにするんだと思います)。シャットダウンは”0″とすると出力しなくなってしまうので”1″ですね。)

SPI通信で参考になるのが以下のFigure1-1です。

手順としては、

  1. CSをディアサート(LDACはアサート)
  2. SDIにMSBをセット(図ではSIになってますが)
  3. SCKの立ち上がりでSDI取り込み
  4. 2,3を残り15bit分繰り返し
  5. CSをアサート
  6. LDACをディアサート

以上が1出力分です(一つのアナログデータを出力ということ)。

Verilogにより実装した機能

上記手順で通信するにあたり以下の機能を実装しました。

  • SPI通信全体のカウンタ
  • 16bitシフトレジスタ(ヘッダ+データ)
  • アナログ出力データ用のカウンタ(今回はカウンタによるノコギリ波としました。12bitなので4096が最大値となります。)
  • スイッチ入力(カウンタの増分を変えることでノコギリ波の周波数を変えました)

実装には以下のwebページを参考にさせていただきました。
http://d.hatena.ne.jp/kazunori_279/20121208/1354977254

HDLコード全体

MCP4922のSPIクロック周波数はデータシートによると20MHzまでとあり、DE1-SoCのクロック周波数は50MHzなので半分以下にする必要があります。

今回は半分の25MHzにしていますが、うまく動いたのでそのまま実験してます。

テストベンチ

シミュレーション波形


想定通りのタイミング波形が得られています。
データ(11~0bit)の部分を見てみると、inc=10’d1なので1,2,3と変化しているのがわかります。
(初めのデータが0となっていないのはご愛敬ということで…)

ピンアサイン

上記HDLコードで実際にボードを動かすためにはピンアサインが必要ですが、

ベンダーが提供している”System Builder”なるものを使うと自動でピンアサイン情報を作ってくれます。

まず、以下のサイトにある”DE1SoC SystemBuilder(一番新しいもので良いと思います)”をダウンロードします。
http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=205&No=836&PartNo=4

toolsの中に”system builder”が入っていると思いますので、起動し以下の画像の状態にして”Generate”を押すとqpfファイルを出力してくれます。

qsfファイルを”Assignments => import assignments”にてインポートすればピンアサインしてくれます。

アナログ出力波形

カウンタ増分が1(inc=10’d1)の場合
周波数は340Hzくらいです。

カウンタ増分10(inc=10’d10)の場合
増分を10倍にしたので周波数も10倍となっています(3.45kHz)。

これであれば、スイッチに応じて周波数を変えてくれるので任意波形発生みたいなこともできるかもしれません。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です