Dies Aliquanti

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

VerlogでA/Dコンバータ

PIC16F648の方は一応完成したのだが、とりあえず無視したUSRTも「なんとかなるかな?」と軽く考えてコーディングを始めたのがいけなかった。一応一通りコーディングを終えて、シンタクスエラーもとれていない状態だが、既に300行を超えている。PIC16のCPU単体では1000行にも満たないので、まあUSARTはそれくらい複雑ということ。。。

さて、せっかくVeritakの波形ビューアを拡張してもらったので、ちょっと使ってみることにした。題材はA/Dコンバータ(お約束)である。デルタ-シグマ変調方式の実験をしてみようと思う。デルタ-シグマ変調の原理そのものは、Wikipediaのデルタ-シグマ変調(ただし英語版の方がよい説明だ)でも見てください。この方式の面白いところは、同じ構成が、DA変換にもAD変換にも適用できるところ。
Veritakのチュートリアルの中にも、DA変換の例が載っています。また、Spiceシミュレータの一種である、SwCADを使った実験は、「ベルが鳴っています」の中にもあります。(余談ですが、このサイトほんとにCool)
これをディジタルシミュレータであるVerilogでやってみようという極めて、ムダかつ屈折した試みです(大笑)。

一次のΔΣ変換にすることにして、Verilogのmoduleを作ってみました。ANALOG.Hの中では、
`define ANALOG [63:0]
としているだけです。alwaysブロックが4つのシンプルなものですが、最初のalwaysブロックは、wireからrealへの変換、2番目は、加算、3番目は積分器、4番目はコンパレータと遅延回路をかねています。
積分器は(さくっと)差分式で、サンプルレートの1000倍のレートで計算しています。また、ゲインはどれくらいが適正なのかよくわかりませんので、適当に決めています(シミュレーションを動かして確認することにします)。実は、Veritakにはちゃんとルンゲ・クッタ(たぶんルンゲ・クッタ・ギル)式のタスクがあるのですが、今回は使い方をしらべるのがめんどうくさかったので使っていません。ただし、必ずしもいい加減というわけではなく、入力信号がクロックに対して十分に遅いので、差分法でも十分と考えました。
出力は遅延回路のあとから取っていますので、1サンプル分遅れますが実質的に同じです。出力digital_oは1ビットですので、一般的にはこのあとデシメーション・フィルタをかけて多ビット値に変えるのですが、そこはあとで考えることにしましょう。
---
本日の御託
毎日のようにさまざまな偽装の問題が報道されている。拙宅はへーベルハウスなのだが、早速昨夜旭化成ホームズからお詫びの電話があった。無料で修繕する(あたりまえだ!)が4万棟ほど対象があり、すべて終えるのに約2年程度かかるとの試算とのこと。改めて工事時期等の連絡があるらしい。
報道によれば、ニチアスに損害賠償をもとめるつもりらしい。2階の軒下もあるので、足場を組むことを考えると、職人さんが3人で三日くらいだろうか?大雑把に一棟当りの修繕工事費を、50万円とみても、ニチアスの昨期の営業利益を超えてしまいそう・・・


     1  //
     2  // (c) 2007 Bakaoyaji
     3  //
     4  `include "ANALOG.H"
     5 
     6  `timescale 1ns/100ps
     7 
     8 
     9  `define RESOLUTION (1.0)
    10  `define GAIN    (0.01)
    11  `define GAIN2   (0.00001)
    12  `define RELATIVE_GAIN (`GAIN * `RESOLUTION)
    13  `define RELATIVE_GAIN2 (`GAIN2 * `RESOLUTION)
    14 
    15  module sigma_delta_adc(
    16      input clk_i ,
    17      input `ANALOG analog_i ,
    18      output reg digital_o 
    19  ) ;
    20 
    21      real real_in , integ_in , delta, integral = 0.0 ,feedback = 1.0 ;
    22      real integral2 = 0.0 ;
    23 
    24      always@ * begin // converting `ANALOG to real
    25          real_in = $bitstoreal( analog_i) ;
    26      end
    27     
    28      always@ * begin // summing
    29          integ_in = real_in - feedback ;
    30      end // always
    31 
    32 
    33      always begin // integral
    34          # `RESOLUTION
    35          integral = integral + `RELATIVE_GAIN * integ_in  ;
    36      end
    37 
    38      always@( posedge clk_i) begin // comparater and delay
    39          if( integral >= 0.0 ) begin
    40              feedback <= 1.0 ;
    41              digital_o <= 1'b1 ;
    42          end
    43          else begin
    44              feedback <= -1.0 ;
    45              digital_o <= 1'b0 ;
    46          end
    47      end
    48  endmodule // sigma_delta_adc



コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://diesaliquanti.blog.fc2.com/tb.php/405-8ce4261b
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

まとめ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。