2017-02-20 3 views
0

私自身の研究を通して、シグナルをプロセス内に割り当てると、プロセスの後でシグナルが更新されることを理解しています。さて、出力を直接割り当てると、処理後に更新されますか? 単純な例として2つのバージョンを添付して、私の意図を実証します。プロセス内部のシグナルの割り当てと実際の出力の割り当ての違い

バージョン1:今すぐ

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

entity testing is 
port(
    clk : in std_logic; 
    a : in std_logic; 
    b : in std_logic; 
    c : out std_logic 
); 

end testing; 

architecture arch of testing is 

signal temp: std_logic; 

begin 

process(clk) 

begin 

    if(rising_edge(clk)) then 

     if(a = '1' and b = '1') then 

      temp <= '1' 

     end if; 

    end if; 

end process; 

c <= temp; 

end arch; 

他のバージョン:

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

entity testing is 
port(
    clk : in std_logic; 
    a : in std_logic; 
    b : in std_logic; 
    c : out std_logic 
); 

end testing; 

architecture arch of Intermediate is 

begin 

process(clk) 

begin 

    if(rising_edge(clk)) then 

     if(a = '1' and b = '1') then 

      C <= '1'; 

     end if; 

    end if; 

end process; 

end arch; 

は、ここではタイミングの違いはありますか? Cは、最初のバージョンと比較して2番目のバージョンですぐに高くなりますか?

答えて

0

Cは、2番目の例で最初に割り当てられた(少し)早めに割り当てられます。また、2番目の例で中間レジスタ(temp)がないため、使用するリソースが少なくなります。

は、あなたの最初の例では、tempは、クロックの立ち下がりエッジで割り当てられます、そしてCは、同時割り当てである(すなわち。とすぐtemp変更、C変更など)。しかし、実際には、信号の伝搬のために、tempが変更された後に、この割り当てが「わずかな時間」発生します。

第2の例では、立ち下がりクロックエッジで発生するCに直接割り当てています。

は、私はあなたが提供している例はやや不自然ですけど、あなたが同じ達成できる:

process(clk) 
begin 
    if rising_edge(clk) then 
     c <= a and b; 
    end if; 
end process; 
0

シミュレーションサイクルは、待機により中断されるまで、それぞれを実行するすべてのプロセスを再開します。現時点の更なる事象はデルタサイクルを引き起こし、さもなければシミュレーション時間は次の予定された事象に進む。シミュレーションサイクルは、イベントがなくなるか停止するまで続きます。

同時実行文には、同等のプロセスまたはブロックとプロセスがあります。精巧な設計階層は、信号イベントを介して通信するプロセスの集合である。

cは、遅れが介在しない連続的な信号割り当てのために、第1の例では1デルタサイクル後に発生する可能性がある。デルタサイクルは、simulation timeを消費せず、むしろ順次ステートメントの並行性の象徴を生成する。

バージョン1は、同時信号割り当てステートメントからの第2のプロセスを持ち、追加の信号を使用して、モデルの実行時間が長くなり、より多くのリソースを使用します。バージョン1は、それ自体で重大な負担を表すものではありません。多数のこのようなプロセスまたは多数のイベントにわたって、モデル実行時間およびメモリ使用の違いを測定することができる。

通常、中間信号は、ポートの駆動に加えて信号値がローカルで評価される場所です。あなたはモードのインターフェイス信号の値を読み取ることはできません。 (ポート単位はポート協会の形式を表しています)

IEEE Std 1076-2008を参照してください(実際には、 11.同時のステートメント10.5.2単純なシグナル割り当てステートメント。 10。2待機ステートメント。 14.精緻化と実行;特に14.5陳述部分の精緻化と14.5.5その他の同時陳述; 14.7モデルの実行、特に14.7.5モデルの実行。 6.5.2インタフェースオブジェクトの宣言。 6.5.7.3ポートマップの側面。 14.3.5ポートマップの側面。

1

まず次はかなり正確ではありませんが、ほとんどのRTLプロセスのために正しいです:

プロセス内の信号が

実際のルールを終了 工程後まで更新されません。 :

信号は次のデルタサイクルまで更新されません。

WRTプロセスは、プロセスが待機時に中断するか、機密性リストで終了して中断しない限り、デルタサイクルが通過することを許可しません。ほとんどのRTLプロセスは感度リストを持っているか、最上位にwaitステートメントが1つしかないので、RTLコードでは「あまり真実ではありません」ということになります。 Cへのあなたの割り当てに

WRT:

c <= temp; 

デルタサイクルがその割り当てにまだあります。それが助け場合は、言語は次の変換を経由して同時割り当ての実行を定義します。

process (temp) is 
begin 
    c <= temp; 
end process ; 

これは、あなたがWRTに何が起こっているか、あなたの簡単なRTLのルールを理解するのに役立ちます。

関連する問題