2007年08月09日

イベントとトランザクション

VHDLにはトランザクションという陰の存在がある。
イベントもトランザクションの一部で、イベントを伴うトランザクションと伴わないトランザクションがあると考える事が出来る。

イベントは値が変化した場合に発生する。しかしトランザクションは値の代入が行われるだけで発生する。
以下の例では信号Aに対してイベントは発生しないがトランザクションは発生する。
しかし信号Bはイベントもトランザクションも発生しない。これは、Bへの代入が発生するためには信号Aに対してトランザクションでは無くイベントが必要になるためである。


    process begin
        wait for 1 ns;
        A <= '1'
    end process;
    B <= A;


もう少し複雑な例をModelSimでシミュレーションして動作を見てみることにする。
以下にサンプルソースを紹介する。
これは、単純な2入力のORで1本の入力は'1'固定、もう1本は5ns毎に'1'/'0'を繰り返している。ただし'1'の固定値もトランザクションを発生させるために5ns毎に代入を繰り返している。
そして各信号のイベントとトランザクションをカウントして変化を確認する。

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;

entity test is
end test;

architecture behavior of test is

    signal  DATA1       : std_logic := '1';
    signal  DATA2       : std_logic := '1';
    signal  DATA3       : std_logic := '1';
    signal  DATA1_TR    : integer := 0;
    signal  DATA1_EV    : integer := 0;
    signal  DATA2_TR    : integer := 0;
    signal  DATA2_EV    : integer := 0;
    signal  DATA3_TR    : integer := 0;
    signal  DATA3_EV    : integer := 0;

begin

    process begin
        wait for 5 ns;
        DATA1 <= '1' after 1 ns;
        wait for 5 ns;
        DATA1 <= '1' after 2 ns;
        wait for 5 ns;
        DATA1 <= '1' after 1 ns;
        wait for 5 ns;
        DATA1 <= '1' after 2 ns;
    end process;

    process begin
        wait for 5 ns;
        DATA2 <= '0' after 1 ns;
        wait for 5 ns;
        DATA2 <= '1' after 2 ns;
        wait for 5 ns;
        DATA2 <= '0' after 2 ns;
        wait for 5 ns;
        DATA2 <= '1' after 1 ns;
    end process;

    DATA3 <= DATA1 or DATA2;

    -- トランザクション発生でカウントアップ
    process begin
        wait on DATA1'transaction;
        DATA1_TR <= DATA1_TR + 1;
    end process;
    process begin
        wait on DATA2'transaction;
        DATA2_TR <= DATA2_TR + 1;
    end process;
    process begin
        wait on DATA3'transaction;
        DATA3_TR <= DATA3_TR + 1;
    end process;

    -- イベント発生でカウントアップ
    process begin
        wait on DATA1;
        DATA1_EV <= DATA1_EV + 1;
    end process;
    process begin
        wait on DATA2;
        DATA2_EV <= DATA2_EV + 1;
    end process;
    process begin
        wait on DATA3;
        DATA3_EV <= DATA3_EV + 1;
    end process;

end behavior;


これの結果は、

delta_out.gif

 

 

 

 

 

この様になる。一つずつ見ていくと、
DATA1とDATA3のイベントは変化がない。これは先ほどの説明の通り。
DATA2のイベントとトランザクションは同じで、これは通常の動作。
DATA1とDATA2のトランザクションはディレイ値は違うが代入時に変化する。
DATA3のトランザクションはDATA2のイベントが発生した時に代入が発生するのでそのタイミングで変化する。
頭が混乱しそうになるがじっくり考えると理解できるとおもう。



投稿時刻(22:10)│コメント(2)VHDL 

この記事へのコメント

1. Posted by marsee   2007年08月11日 05:56
こんにちは。
結局、トランザクションはVHDLコードで、値は変化しないかもしれないが代入されたとき発生。イベントは値が変化したときに発生。ということであっていますでしょうか?
論理シミュレータの構成に関することですね?トランザクションを時間順に実行していって、イベントがあればその時間でイベント処理をする。ということだと理解しました。
2. Posted by たーぼ   2007年08月13日 13:13
こんにちは、今年は新盆で色々忙しくblogの更新が滞ってます...コメント遅れてすいません。

トランザクションは私もmarseeさんと同じ理解をしています。
私はVHDLのLRMをきちんと読んだことが無いので疑問点があったらとりあえず作ってModelSimで確認する様にしています。なのでModelSimがバグっていると私の理解にもバグが生まれてしまいます。

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 
最新コメント
ブログ内検索
カテゴリ別表示
月別表示
問い合わせ・連絡先
ta_bo__@livedoor.com

本サイトは以下のアクセス解析を使用しております。
基礎化粧品