FrontPage

2009/05/01からのアクセス回数 11618

実際にプログラミングしてみると雑誌や本に書かれていないことがわかるものです。

今回は、

のがよいことが分かりました。(とてもいい収穫でした)

また、Verilogシミュレーションについても追記しましたが、

はじめに

トランジスタ技術2006年4月付録のMAX IIと12月号から連載された「実験で学ぶロジック回路設計」 の教材だったHDL-CQ1を使ってCPLDのプログラミングをしてみます。

特集では、

の順で説明していますので、それにそって試してみます。

HDL-CQ1では、SELECTOR信号で7セグメントLEDを切り替えているため、 特集の第4章の例題は1個の7セグメントLEDを使うようにしました。

開発環境

AlteraのQuartus II の最新のver.9.1は、Windows2000をサポートしていないので、開発環境ではVM Ware上にVer.7.1をインストールしました。

Ver.8.1より以前のQuartus IIではMacアドレスを送ってライセンスをAlteraから取得しますので、VM Ware のMacアドレスを固定にする必要があります。

VMイメージのvmxファイルをテキストエディタで開いて、以下の行を追加・変更します。

ethernet0.addressType = "static"
ethernet0.address = "00:50:56:00:43:88"

Macアドレスは、00:50:56までは固定で、残りは自由に設定してもよいそうです。

また、以下のツールもインストールしました。

回路図の作成

回路図の書き方は、特集の記事にそってButtonCount_topを以下のように書きました。

top_layout.jpg

コネクタの配置は、

を参照し、以下のようにピンの配置をしました。

pin_setting.jpg

通常ですと、チャタリング除去のために、入力スイッチ回路にシュミット・トリガ・インバータIC を入れるのですが、Quartus IIではPCLD内部で処理することができます(ちょっと驚きました)。

同様にButtonCountを配置します。

回路の74160, 7447は、ロジックICの型番で、

で、 Quartus IIのライブラリに入っているものをそのまま使っています。

このように、既存のロジックICを組み合わせた回路なら、とても簡単にCPLDで代用することが できます。

ButtonCount_Layout1.jpg

シミュレーション

WaveFormを使って、できあがった回路をシミュレーションします。

WaveForm1.jpg

波形だけなので、セグメントLEDの表示がいまいち理解しづらいです。

動作確認

Programmerで書き込んで、動作確認をします。

写真は、MANCLKのスイッチでカウントアップしている途中の様子です。

Counter.jpg

VHDLで書き替える

つぎに、ロジックICの回路をVHDLで記述し、

としました。

VHDLで記述した部品を回路図で使えるようにする

作成した BCDCounter.vhd, Decode7Segment.vhdを回路図で使えるように シンボルを生成します。

CreateSymbol_Menu.jpg

回路図からVHDLを作る

先に作成したButtonCountの回路をBCDCounter.vhd、Decode7Segment.vhdを使って、 以下のように書き直します。

CounterVHDL_Layout.jpg

次に、回路図を表示した状態でFile->Create/Update->Create HDL Design File for Current Fileメニュー を選択します。

CreateHDL_Menu.jpg

これでButtonCount.vhdが生成されました。どうようにBUttonCount_top.vhdも作成します。

Verilogとの相互変換

これで、VHDLで記述した部品を組み合わせ、すべてのVHDLを作成することができました。

しかし、このままではQuartus IIを使わなくて、部品を作ったり、それをシミュレーションする ことができません。

そこで、フリーのVerilogシミュレーションを使うために、VHDLからVerilogに変換します。

Verilog-VHDL translator

フリーのVerilog-VHDL translatorが、 http://www002.upp.so-net.ne.jp/morioka/v2v.html に公開されています。 いろいろ探しましたが、Verilog→VHDLの変換ツールは少なく、フリーのソフトはこれのみでした。

また、VerilogからVHDLへの逆変換もサポートしており、ソースが公開されているので安心です。

Verilogへの変換

VHDLからVerilogへの変換はとても簡単です。

ターミナルから

vhdl2verilog 変換するVHDLファイル名

を指定するだけです。

$ vhdl2verilog BCDCounter.vhd 
VHDL2Verilog ver1.00(2004/05/06)  Copyright(c) S.Morioka (http://www02.so-net.ne.jp/~morioka/v2v.htm)

Input file: BCDCounter.vhd

Complete.
$ 

vhdl2verilogの障害

vhdl2verilogで生成されたファイルには、モジュール名の大文字小文字はそのままなのに、 インスタンス化する場合には、すべて小文字になっている障害がありました。 これらを修正し、完成したファイルは以下のとおりです。

フリーのVerilogシミュレータGPL Cverのインストール

マックにもVerilogのシミュレータがあると便利なので、GPL Cverをインストールします。

MacPortを使ってcver ver.2.12a をインストールします。

$ sudo port install gplcver

テストベンチの作成

ButtonCountのテストベンチを作成します。

module ButtonCount_tb();
    reg  clk;
    wire a, b, c, d, e, f, g; 

    ButtonCount ButtonCount(clk, a, b, c, d, e, f, g);

    initial begin
	ButtonCount.b2v_inst.counter <= 0;
        $monitor("%t: %b, %b, %b, %b, %b, %b, %b, %b", $time, clk, a, b, c, d, e, f, g);
    end

    initial begin
        repeat(11) begin
	  clk <= 1'b1;
	  #10
	  clk <= 1'b0;
          #10
            if(!a) $write(" --¥n"); else $write("¥n");
            if(!f) $write("|  ");   else $write("   ");
            if(!b) $write("|¥n");   else $write("¥n");
            if(!g) $write(" --¥n"); else $write("¥n");
            if(!e) $write("|  ");   else $write("   ");
            if(!c) $write("|¥n");   else $write("¥n");
            if(!d) $write(" --¥n"); else $write("¥n");
            $write("¥n");
        end
        $finish;
    end

endmodule

ベンチマークの実行結果

実行結果は、

$ cver Decode7Segment.v BCDCounter.v ButtonCount.v ButtonCount_tb.v
GPLCVER_2.12a of 05/16/07 (Mac OSX).
Copyright (c) 1991-2007 Pragmatic C Software Corp.
  All Rights reserved.  Licensed under the GNU General Public License (GPL).
  See the 'COPYING' file for details.  NO WARRANTY provided.
Today is Sun May  3 16:31:43 2009.
Compiling source file "Decode7Segment.v"
Compiling source file "BCDCounter.v"
Compiling source file "ButtonCount.v"
Compiling source file "ButtonCount_tb.v"
Highest level modules:
ButtonCount_tb

                   0: 1, 1, 0, 0, 1, 1, 1, 1
                  10: 0, 1, 0, 0, 1, 1, 1, 1

   |

   |


                  20: 1, 0, 0, 1, 0, 0, 1, 0
                  30: 0, 0, 0, 1, 0, 0, 1, 0
 --
   |
 --
|  
 --

途中省略
                 180: 1, 0, 0, 0, 0, 0, 0, 1
                 190: 0, 0, 0, 0, 0, 0, 0, 1
 --
|  |

|  |
 --

                 200: 1, 1, 0, 0, 1, 1, 1, 1
                 210: 0, 1, 0, 0, 1, 1, 1, 1

   |

   |


Halted at location **1.v(205) time 220 from call to $finish.
  There were 0 error(s), 0 warning(s), and 8 inform(s).

と無事期待通りの出力となりました。

Veritakで同様の結果と波形が出力されました。

VeritakWave.jpg

コメント

この記事は、

選択肢 投票
おもしろかった 2  
そうでもない 0  
わかりずらい 0  

皆様のご意見、ご希望をお待ちしております。


(Input image string)

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc