Verilog 例

Verilog

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2023/12/30 18:20 UTC 版)

簡単な2フリップフロップの例を以下に示す。

module toplevel(clock,reset);
  input clock;
  input reset;

  reg flop1;
  reg flop2;

  always @ (posedge reset or posedge clock)
    if (reset)
      begin
        flop1 <= 0;
        flop2 <= 1;
      end
    else
      begin
        flop1 <= flop2;
        flop2 <= flop1;
      end
endmodule

Verilogにおける"<="演算子は、普通の手続き型言語とは異なる、ハードウェア記述言語としてのもう1つの側面である。この演算子は「ノンブロッキング」代入文として知られ、alwaysブロックが実行されるまでアクションは登録されない。つまり、代入文を書いた順序は無関係であり、必ず同じ結果が生じる。そのため、flop1とflop2はクロックごとに値がスワップされることになる。

もう1つの代入演算子である"="は、ブロッキング代入文と呼ばれる。"="による代入が行われると、代入先の値は即座に更新される。もし上の例で"<="の代わりにブロッキング演算子の"="を使用したとすると、flop1とflop2の値はスワップされず、手続き型プログラミング言語のように、コンパイラはflop1の値をflop2の値にセットするのだと解釈する(その結果、flop2とflop1の値にセットするという冗長な論理は無視されることになる)。

モジュールはキーワードmoduleで始まる。その後のDiv20xが名前を示し、続く括弧内は端子リストである。6個の端子があり、それぞれの端子の入出力方向はモジュール中のポート宣言(inputとoutput)で指定される。最後のendmoduleでモジュールの終了である。モジュール内には、パラメータ宣言、ポート宣言、レジスタ宣言、イベント宣言、ネット宣言、ステートメントなどを記述する。

// 
// 表題 イネーブル付20段カウンター
// 
module Div20x (
    // ポート宣言(外部から本モジュールへの接続を定義する)
    input clock,  // クロック
    input reset,  // リセット(正論理, ハイアクティブ)
    input cet,    // カウンターとTC出力のイネーブル
    input cep,    // カウンターのみのイネーブル
    output reg [size - 1:0] count,   // 束線を示す。この場合5bit幅
                                     // alwaysまたはinitialブロックでドライブする信号は
                                     // reg型でなければならない
    output tc);                      // regと明記していない、他の信号はwire型。
                                     // ポート宣言したwire型信号のネット宣言は省略可能であり、省略することも多い。

    // パラメータ宣言
    parameter length = 20; // カウント段数
    parameter count_zero = 5'b00000; // 5bit幅,2進数の0を表す 
    parameter count_one  = 5'b00001; // 5bit幅,2進数の1を表す
    parameter size = 5;   // bit幅,基数の指定を省略すると32bit,10進数になる。

    // always文。resetやclock信号の変化に同期し並列に実行される
    always @ (posedge clock or posedge reset) begin                             
        if (reset) begin // 非同期リセット
            count <= count_zero;
        end else begin
            if (cet || cep) begin // イネーブル
                if (count == length - 1) begin
                    count <= count_zero;
                end else begin
                    count <= count + count_one;
                end
            end
        end
    end

    // assign文。tcの値は実行中、継続的に値が与る
    assign tc = (cet && (count == length - 1));
endmodule

ポート宣言やレジスタ宣言での[a:b]のような形式は、束線(多くはバス)を示す。例えば[3:0]であれば配線が4本あることになる。always節は、括弧内の信号を指定した条件に変化があったときに実行される。posedgeは信号が0から1に変化した場合を指定する。orは括弧内の信号のどれか1つでも変化した場合を指定する。上記のように、resetに合わせてreg型を初期化するのが基本的なデザインパターンである。

ディレイの例は以下の通りである。

...
reg a, b, c, d;
wire e;
...
always @(b or e)
  begin
    a = b & e;
    b = a | b;
    #5 c = b;
    d = #6 c ^ e;
  end

上記のalways節は、もう1つの使い方を示している。たとえば、上の例では、リストに含まれる要素(bまたはe)が変化したタイミングでいつでもalways節が実行される。いずれかの変数が変化すると、即座に新しい値がaに代入される。ブロッキング代入文を使用しているため、bにはその代入後に(aの新しい値を用いて)新しい値が代入される。5単位時間のディレイの後、cbの値が代入されると同時に、c ^ eの値が計算され、見えない保管場所に一時的に保存される。6単位時間後、保管されていた値がdに代入される。

プロセス内(initialまたはalwaysブロック内)で操作される信号は、reg型を持つ必要がある。また、プロセスの外で操作される信号はwire型を持たなければならない。この時使われるregという名前は、必ずしもハードウェアのレジスタを意味するわけではない。








固有名詞の分類


英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「Verilog」の関連用語

Verilogのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



Verilogのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアのVerilog (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。

©2024 GRAS Group, Inc.RSS