[[FrontPage]] #contents 2009/05/01からのアクセス回数 &counter; 実際にプログラミングしてみると雑誌や本に書かれていないことがわかるものです。 今回は、 - VHDLのテストベンチは記述量が多く、使いにくい - 部品の結合は、VHDLでなく、回路図で行って、ツールを使ってVHDLに変換する のがよいことが分かりました。(とてもいい収穫でした) また、Verilogシミュレーションについても追記しましたが、 - 最初からVerilogで記述すれば、VHDLへの変換は不要です。 - しかしVHDL-Verilog相互変換という意味でVHDLからの変換を加えました。 ** はじめに [#ncabc079] トランジスタ技術2006年4月付録のMAX IIと12月号から連載された「実験で学ぶロジック回路設計」 の教材だったHDL-CQ1を使ってCPLDのプログラミングをしてみます。 特集では、 - 回路図からの設計 - VHDLでの設計 の順で説明していますので、それにそって試してみます。 HDL-CQ1では、SELECTOR信号で7セグメントLEDを切り替えているため、 特集の第4章の例題は1個の7セグメントLEDを使うようにしました。 ** 開発環境 [#h8ec36ef] AlteraのQuartus II の最新のver.9.1は、Windows2000をサポートしていないので、開発環境ではVM Ware上にVer.7.1をインストールしました。 Ver.8.1より以前のQuartus IIではMacアドレスを送ってライセンスをAlteraから取得しますので、VM Ware のMacアドレスを固定にする必要があります。 VMイメージのvmxファイルをテキストエディタで開いて、以下の行を追加・変更します。 #pre{{ ethernet0.addressType = "static" ethernet0.address = "00:50:56:00:43:88" }} Macアドレスは、00:50:56までは固定で、残りは自由に設定してもよいそうです。 また、以下のツールもインストールしました。 - ModelSim-Altera 6.1g Web Edition - Veritak-Lite Ver. 2.05A7 (CQ版) ** 回路図の作成 [#u0045637] 回路図の書き方は、特集の記事にそってButtonCount_topを以下のように書きました。 &ref(top_layout.jpg); コネクタの配置は、 - MAX II付録ボードの配置は、&ref(BoardAndPinLayout.pdf); - HDL-CQ1の回路は、&ref(HDL-CQ1.pdf); を参照し、以下のようにピンの配置をしました。 &ref(pin_setting.jpg); 通常ですと、チャタリング除去のために、入力スイッチ回路にシュミット・トリガ・インバータIC を入れるのですが、Quartus IIではPCLD内部で処理することができます(ちょっと驚きました)。 同様にButtonCountを配置します。 回路の74160, 7447は、ロジックICの型番で、 - 74160はカウンタIC - 7447は、セグメントLED表示用IC で、 Quartus IIのライブラリに入っているものをそのまま使っています。 このように、既存のロジックICを組み合わせた回路なら、とても簡単にCPLDで代用することが できます。 &ref(ButtonCount_Layout1.jpg); ** シミュレーション [#x8420f68] WaveFormを使って、できあがった回路をシミュレーションします。 &ref(WaveForm1.jpg); 波形だけなので、セグメントLEDの表示がいまいち理解しづらいです。 ** 動作確認 [#ja02af85] Programmerで書き込んで、動作確認をします。 写真は、MANCLKのスイッチでカウントアップしている途中の様子です。 &ref(Counter.jpg); ** VHDLで書き替える [#ndd56d67] つぎに、ロジックICの回路をVHDLで記述し、 - 74160は、&ref(BCDCounter.vhd); - 7447は、&ref(Decode7Segment.vhd); としました。 *** VHDLで記述した部品を回路図で使えるようにする [#ld125d23] 作成した BCDCounter.vhd, Decode7Segment.vhdを回路図で使えるように シンボルを生成します。 - ProjectNavigatorでVHDLファイルを選択し - 右クリックでポップアップメニューを表示し、「Create SYmbol Fiels for Current File」を選択する &ref(CreateSymbol_Menu.jpg); ** 回路図からVHDLを作る [#caf2ec03] 先に作成したButtonCountの回路をBCDCounter.vhd、Decode7Segment.vhdを使って、 以下のように書き直します。 &ref(CounterVHDL_Layout.jpg); 次に、回路図を表示した状態でFile->Create/Update->Create HDL Design File for Current Fileメニュー を選択します。 &ref(CreateHDL_Menu.jpg); これでButtonCount.vhdが生成されました。どうようにBUttonCount_top.vhdも作成します。 - &ref(ButtonCount.vhd); - &ref(ButtonCount_top.vhd); ** Verilogとの相互変換 [#b620ae8c] これで、VHDLで記述した部品を組み合わせ、すべてのVHDLを作成することができました。 しかし、このままではQuartus IIを使わなくて、部品を作ったり、それをシミュレーションする ことができません。 そこで、フリーのVerilogシミュレーションを使うために、VHDLからVerilogに変換します。 *** Verilog-VHDL translator [#r70ab37a] フリーのVerilog-VHDL translatorが、 http://www002.upp.so-net.ne.jp/morioka/v2v.html に公開されています。 いろいろ探しましたが、Verilog→VHDLの変換ツールは少なく、フリーのソフトはこれのみでした。 また、VerilogからVHDLへの逆変換もサポートしており、ソースが公開されているので安心です。 *** Verilogへの変換 [#kacb79f3] VHDLからVerilogへの変換はとても簡単です。 ターミナルから vhdl2verilog 変換するVHDLファイル名 を指定するだけです。 #pre{{ $ 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の障害 [#rf4d3319] vhdl2verilogで生成されたファイルには、モジュール名の大文字小文字はそのままなのに、 インスタンス化する場合には、すべて小文字になっている障害がありました。 これらを修正し、完成したファイルは以下のとおりです。 - &ref(Decode7Segment.v); - &ref(BCDCounter.v); - &ref(ButtonCount.v); ** フリーのVerilogシミュレータGPL Cverのインストール [#xd4c9ac3] マックにもVerilogのシミュレータがあると便利なので、GPL Cverをインストールします。 MacPortを使ってcver ver.2.12a をインストールします。 #pre{{ $ sudo port install gplcver }} ** テストベンチの作成 [#z00aa6cd] ButtonCountのテストベンチを作成します。 - BCDCounter内部のcounterが初期化されていないため、最初に正常に動作しませんでした - セグメントLEDの表示をキャラクタで表し、HDL-CQ1ボードの負理論に合わせました #pre{{ 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 }} ** ベンチマークの実行結果 [#q565aac3] 実行結果は、 #pre{{ $ 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で同様の結果と波形が出力されました。 &ref(VeritakWave.jpg); ** コメント [#s330924c] この記事は、 #vote(おもしろかった,そうでもない,わかりずらい) 皆様のご意見、ご希望をお待ちしております。 #comment_kcaptcha