2017年4月17日月曜日

FPGAでΔΣ型DACを実装してみる

最近遊んでいるAlteraのFPGA MAX10にはADCが搭載されているモデルがありますが、DACは搭載されていません。
マイコンやFPGAで実装するDACとしてよく使われる方式としてPWM方式がありますが、今回は将来的なADCへの応用も考えΔΣ方式としてみました。


実装したΔΣ型DACの構成

構成としては非常に簡単です。
誤差フィードバック構造と呼ばれる構成で、MSB以外のデータを誤差として入力にフィードバックする形となっています。
図中の遅延素子(Z^-1)は単なるDFFとしています。
FPGA上に実装したΔΣ変調器の出力は高い周波数成分を含むものになるため、外部にLPFを接続してアナログ信号を取り出します。


CQ出版のMAX10のFPGAボードに上記のDACを実装し、8kHz程度(周波数は適当です(^^;))の正弦波信号を生成してみました。
手元にあった1kΩの抵抗と0.01uFのセラコンでカットオフ周波数16kHzのLPFを簡単につくり、所望の正弦波が得られるかを実験します。
ΔΣ変調器のクロック(内部遅延素子のDFFのクロック)は50MHz、正弦波のデータは8bitとしました。

実験回路


ブレッドボードで実装(今回使ってない部品もたくさん載っています...)

出力波形

雑音がのっているものの、正弦波信号が出力されていることを確認しました。
今回はブレッドボードで回路を構成しましたが、基板を起こせばもっとSNRを向上できるかもしれません。

ひとまずこれで簡単なDACを使用できるようになりました。
少ない外付け部品で実装できるのは魅力ですね。

ADCと併せて音声信号処理でもやってみようかと思います。



今回実装したΔΣ型DACのVerilogコード

module DSM_8bit(
    input res,
    input clk,
    input [7:0] data,
    output reg mod
    );
  
    wire [7:0] pcm_sig;
    wire [8:0] add_sig;
    reg [7:0] dse_reg;
  
    assign pcm_sig = data;
    assign add_sig = {1'b0,pcm_sig} + {1'b0,dse_reg};
  
    always @(posedge res, posedge clk)
    begin
        if(res) begin
            dse_reg <= 8'h00;
            mod <= 1'b0;
        end else begin
            dse_reg <= add_sig[8:0];
            mod <= add_sig[8];
        end          
    end
  
endmodule

0 件のコメント:

コメントを投稿