FC2カウンター FPGAの部屋 EDAツールについて
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

数学ガールのsin(x)のテイラー展開をMaximaで検証

私は数学ガールという本を近頃読んでいる。言ってみれば数学の萌え本だ。
いつもは読む気になれない数学の証明を萌え本形式で書いている。だいたいなるほどと思うところがあるが、よくわからないところは読み飛ばしている。
その中でそうなのか~と思ったのはsin(x)のテイラー展開だった。(232ページ~233ページ)
sin(x)のテイラー展開の部分和を徐々に加えていくと、徐々にsin(x)のグラフに近づいて行くというのが予想していなかったので面白かった。それじゃということで、私が大学のころはなかった文明の利器を使って検証してみた。
使ったのは数値計算のためのソフトウェア。初めはOctaveを使おうと思ったんだけど、どうもよくやり方が分からなくて断念。前から使っていたMaximaを使うことにした。このMaximaは娘に2次方程式を聞かれたときに、答え合わせ用に使っていたものだ。これで検証してみることにした。
作ったファイル (sin_taylor.wxm) を下に示す。

F(x) := sin(x);
G(x) := x/1;
H(x) := x/1 - x*x*x/(1*2*3);
I(x) := x/1 - x*x*x/(1*2*3) + x*x*x*x*x/(1*2*3*4*5);
J(x) := x/1 - x*x*x/(1*2*3) + x*x*x*x*x/(1*2*3*4*5) - x*x*x*x*x*x*x/(1*2*3*4*5*6*7);
plot2d([F,G,H,I,J],[x,-7,7],[y,-10,10]);


このファイルをwxMaximaからOpenするとwxMaxmaの画面はこうなる。
Maxima_1_090606.png

そしてMaximaによって書かれたグラフが下。
Maxima_2_090606.png

最初の部分和 F(x)は y=x で、これはsin(x)を微分したcos(x)のx=0の時の値に等しいので、sin(x)のx=0の時の接線になっている。そこから部分和を追加ていくごとにsin(x)に近づいて行くのが分かる。これはよくわかるのではないだろうか?
面白そうなのでもう少しやってみた。

K(x) := x/1 - x*x*x/(1*2*3) + x*x*x*x*x/(1*2*3*4*5) - x*x*x*x*x*x*x/(1*2*3*4*5*6*7) + x^9/9!;
L(x) := x/1 - x*x*x/(1*2*3) + x*x*x*x*x/(1*2*3*4*5) - x*x*x*x*x*x*x/(1*2*3*4*5*6*7) + x^9/9! - x^11/11!;
plot2d([F,K,L],[x,-7,7],[y,-10,10]);


下がそのグラフ。
Maxima_3_090606.png

だいぶsin(x)に近づいてきた。このように部分和の数を増やしていくと、x=0の点から段々とsin(x)に近づいてくるとは思わなかった。面白い。。。

数学ガールも読み物としては面白いが、もう1冊買ったのだった。”やり直しのための工業数学”という本を買った。こちらは、CRCや暗号、フーリエ変換などが書いてある。こっちを勉強することにしようと思う。特にCRCやハフマン符号化。

#こんなにsin(x)の近似していないところの発散がひどいのでは近似式として使えないなと思ったけど、考えてみたら-π~πまで近似していれば、後は-π~πに折り返せばいいのか? そうすると9の階乗の部分和くらいまででいいのかな?
  1. 2009年06月06日 19:28 |
  2. EDAツールについて
  3. | トラックバック:0
  4. | コメント:3

Graphvizでステートマシンの図を書いてみた

ブログをFPGAキーワードで検索していたら、Graphvizで仕事用の図を書いているというブログを見つけた。(すみません。どなたのブログかわからなくてしまいました)
Graphvizってもしかして、doxygenをインストールしたとき入れたソフトだなと思い、調べてみると、いろいろな図を書けるということが分かった。(バージョンは2.22です)
そのブログに書いてあったGraphviz チュートリアルのページに詳しく書いてある。ダウンロードはGraphviz本家から。
Graphviz チュートリアルのページによると、テキストファイルで図を各コマンドを書いていけば自動的に図にしてくれるとのこと。
.dotファイルを作って、コマンドプロンプトの窓の中でサンプルを作り、dotコマンドを使って、やってみたがPATHが通っていない。。。
WindowsのスタートからGraphviz 2.22のフォルダを見てみると、Dotty.exeとGVedit.exeがある。
まずはDotty.exeを立ち上げてみる。Dotty.exeを起動すると真っ白な何もない画面が出る。
Dotty_1_090520.png

左クリックすると楕円が表示されるがどうやって図を書くのかよくわからない。右クリックをするとメニューが表示される。
Dotty_2_090520.png

右クリックメニューのコマンドでalf.gvを選んで表示したのがこれ。
Dotty_3_090520.png

こんな風に書ければ良いが、とりあえずやり方が良く分からない(マニュアルはあるのだが、読むのが面倒だし、マウスの真ん中(ホイールクリック)ボタンがうまくいかない)。(ホイールクリックはマウスのせいみたいです。マウスを変えたら線は書けたのですが、楕円の中にステートを書く方法が分かりません)

次にはGVedit.exeを使ってみることにした。
GVeditは、FileメニューからNewを選んで開いた、Graphviz Layoutにコマンドを書いて、GraphvizメニューからRunするとステート図にしてくれる。こんな感じ。
Dotty_5_090520.png

ステート図にするには、Graphvizメニューからsettingsを選んで設定する。
Dotty_4_090520.png

Layout Engine はdotにしたほうが良いようだ。私はPNGファイルを出力するようにしている。

さっそく、Graphviz チュートリアルのページを参考に、今作っているDDR2 SDRAMのコマンドを出力するステートマシンを書いてみたが、条件が多すぎて、あまりうまく書けない。条件を単純化して書いてみたソースがこれ。

digraph ddr2_cmd {
    graph [ranksep = 3, nodesep = 1.0, rankdir = LR];
    NOP -> PALL [label = "pall1_init"];
    NOP -> PALL [label = "pall2_init"];
    NOP -> PALL [label = "refresh and actived banks"];
    NOP -> PALL [label = "not equal_active_bank"];
    NOP -> EMRS [label = "emr2s_init"];
    NOP -> EMRS [label = "emr3s_init"];
    NOP -> EMRS [label = "emrs_dllena_init"];
    NOP -> EMRS [label = "emrs_ocd_def_init"];
    NOP -> EMRS [label = "emrs_ocd_exit_init"];
    NOP -> MRS [label = "mrs_dllrst_init"];
    NOP -> MRS [label = "mrs_init"];
    NOP -> REF [label = "ref1_init"];
    NOP -> REF [label = "ref2_init"];
    NOP -> REF [label = "refresh and not active banks"];
    NOP -> ACT [label = "not addr_fifo_empty and not active_bank"];
    NOP -> READ [label = "read_writex='1' and equal_active_bank"];
    NOP -> WRIT [label =  "read_writex='0' and equal_active_bank"];;
    NOP -> NOP;
    PALL -> NOP;
    EMRS -> NOP;
    MRS -> NOP;
    REF -> NOP;
    ACT -> NOP;
    READ -> NOP;
    WRIT -> NOP;
}


これをGraphzivで図にするとこうなった。
ddr2_cmd_090520.png

Graphzivはいろいろな図を書けそうなので、もっと勉強してみたい。VHDLやVerilog-HDLのステートマシン記述から自動的にGraphzivのフォーマットに直してくれるパーサ?があればいいんだけど。。。

2009/06/03 : 追記
Graphzivの記事をどなたのブログで見たかがわかりました。”日曜プログラマがダラダラ書く”さんの”2009-04-06”でした。
  1. 2009年05月21日 04:29 |
  2. EDAツールについて
  3. | トラックバック:0
  4. | コメント:0

QUCSを使ってみた

検索していたらQUCS(Quite Universal Circuit Simulator)が見つかった。日本語も対応しているし、GPLライセンスだし、回路シミュレータとしてなかなかよさそうだったので使ってみた。今回はWindowsをインストールしたが、Ubuntuでもパッケージマネージャーから探して、インストールすることができた。
まずはQucs projectのページ。VHDLシミュレータもVerilogシミュレータも統合して論理シミュレーションもできる感じ。スクリーンショットを見るといろんなことができそう。
日本のサイトでは山梨大学のQUCS入門ぐうたらの部屋 電子回路部Qucs(電子回路シュミレータ)によく書いてあった。
鳥取大学の電気電子工学実験Ⅰでは実験に使っているようだ。電気回路シミュレータQucs説明書としてPDFの詳細なマニュアルもある。
とりあえず、ぐうたらの部屋 電子回路部、Qucs(電子回路シュミレータ)のページに載っていたサンプルを入力してみた。サンプル回路はダウンロード出来たが、ツールになれるために自分で下のように積分回路(ローパスフィルタ)を入力してみた。
qucs_1_080415.png

しかし、載っていた波形のようにはならずに、下の様な波形になってしまった。
qucs_2_080415.png

ぐうたらの部屋 電子回路部、Qucs(電子回路シュミレータ)のページからサンプルファイルをダウンロードしてどこが違うか確かめてみると、自分で回路図を入力したものは、トランジット解析のプロパティのステップ数が11しかなかった。
qucs_3_080415.png

これを300に変えるとちゃんと波形が出てきた。
qucs_4_080415.png

ソース元部品を2kHzのAC電圧源に変更した時の、トランジェント解析とACシミュレーションの結果を下に示す。
qucs_5_080415.png

qucs_6_080415.png

なかなか面白そう。。。VHDLファイルやVerilogファイルを読ませるとポートを判別してシンボルを作ってくれる。

  1. 2009年04月16日 21:50 |
  2. EDAツールについて
  3. | トラックバック:0
  4. | コメント:4