日記帳だ! with Tux on Libserver

二度目の大改造!! 日記帳…か?を継承し、より柔軟でパワフルなBlogに変身しました。

RSSに対応しています。リンク・コメント・トラックバックは自由にしていただいてほぼ問題ありません。
RSS購読方法、僕のリンク・コメント・トラックバックについての考えを読むことをおすすめします。

JavaScriptを有効にし、Cookieを受け入れ、以下のブラウザを使うことで完全なコンテンツが楽しめます。
Mozilla Firefox 3.0(Get Firefox)・Opera 9.6・Safari 3.2・Lunascape 4/5(Gecko)・Lunascape 5(WebKit)
Internet Explorer 7/8とそれを使うIEコンポーネントブラウザ(Lunascape・Sleipnirなど)

<< 過去

未来 >>

HDLをテストしてみる

今日は授業の合間を縫って、研究室のマシンにXilinxのFPGAの開発環境といろいろソフトウエアを入れてた。

いややっぱりMozilla Thunderbirdはいいですね。


さて、昨日の続きでVerilog HDLのテストの話。

その入れたXilinxの開発環境はISE WebPackとModelSimという2つのソフトウエアなんだが、

このうちModelSimの方でHDLの段階でのテストができる。

ということはわかったのだが、Xilinxの環境がx64には入らない。

すなわち家のマシンには入らんと。これじゃあ遊べんじゃないか。


というわけで Icarus Verilog を導入。完全に無償なのでなにかと気楽。

Windowsの人はここからもリンクがあるように Icarus Verilog for Windows からexeでダウンロードするといい。

インストールしてパスを通しておく。


昨日作ったJK-FFのテストジュールを作る。

module JKFFTest;
  reg J,K;
  wire Q;
  reg CK=1'b1;
  JKFF JK1(.J(J), .K(K), .CK(CK), .Q(Q));
  always begin
    #500	CK=~CK;
  end
  initial begin
    $monitor ("%t: J=%b K=%b Q=%b", $time, J, K, Q);
    $dumpfile("dump.vcd");
    $dumpvars(0,JK1);
           J=1'b1; K=1'b0;
    #1000  J=1'b0; K=1'b1;
    #1000  J=1'b0; K=1'b0;
    #1000  J=1'b1; K=1'b1;
    #1000  J=1'b1; K=1'b1;
    #1000  $finish;
  end
endmodule

とりあえずこんな感じ。

与える入力信号をreg、受け取る出力をwireで書く。

クロックの類は適当に用意する。always文を使うといいでしょう。

#500というのは500ステップ待ってという意味で、500ステップ待ってCKを反転させてとやる、すなわち1000ステップ周期のクロックができる。

それでテストする正味の内容もinitial文で書く。

テストの時は入力信号へ代入するのは=、順序論理回路の設計では<=を使うのだけどね。

それでいろいろ書いて最後に$finish;とする。


その結果を見るためのが$monitor・$dumpfileのあたり。

$monitorはシミュレーションの時に値の変化を表示してくれるの。

$dumpfileは波形をgtkwaveで見える形式で出力するの。

$dumpvarsの第二引数には観察するモジュールの名前とか変数とか書く。


それでIcarus Verilogでもシミュレーションの仕方ですが、

> iverilog -o JKFF -s JKFFTest JKFF.v JKFFTest.v
> vvp JKFF
> gtkwave dump.vcd

iverilogコマンドでコンパイルする。-sで動かすモジュールを決める。そしてvvpで動かす。

これで波形を書き出したらgtkwaveで見ればいい。


これで見てると昨日のJK-FFはJ=1かつK=1のときの動作を書き忘れてたことに気付いた。

module JKFF(J,K,CK,Q);
  input J,K,CK;
  output Q;
  reg Q;
  always @(posedge CK) begin
    if(J==1'b1 && K==1'b1)
      Q <= ~Q;
    else if(J==1'b1)
      Q <= 1'b1;
    else if(K==1'b1)
      Q <= 1'b0;
  end
endmodule
こんな感じですかね。

HDLの時点でいろいろ試すことができるのはいいですね。


Author : hidemaro
Date : 2010/04/21(Wed) 23:57
研究・実験 | Comment | trackback (0)
blog comments powered by Disqus

トラックバック

トラックバックURL取得

Tools