2016-06-24 36 views
0

私は基本的には配列の最初の値をインクリメントするunsignedと配列の配列を持っています。これは、配列の要素を0に設定するasynchronosリセットを実装するまでうまくいきました。奇妙なことは、asynchronosリセットのコードに決して到達していなくても、残りのコードはもう動作しなくなります。ここに私のコードは次のとおりです。VHDLの奇妙な行動配列

use work.datentyp.all; 

library IEEE; 
    use IEEE.std_logic_1164.all; 
    use IEEE.numeric_std.all; 
entity vektoruhr is 
    port (

     clk, reset : in std_logic ; 
    ); 
end vektoruhr; 
architecture v1 of vektoruhr is 

    signal internal_stamp : vektor := (others => (others => '0')); 

begin 

process(clk) 
    begin 
     if(rising_edge(clk)) then 
      internal_stamp(0) <= internal_stamp(0) + 1; 
     end if; 
    end process; 

    process(reset) 
    begin 
    if(rising_edge(reset)) then 
     report "reset triggered"; 
     -- internal_stamp <= (others => (others => '0')); 
     alarm <= '0'; 
    end if; 
    end process; 
end v1; 

あなたが見ることができるように、ライン

-- internal_stamp <= (others => (others => '0')); 

がコメントアウトされています。このように、すべてうまく動作します。しかし、 - を削除すると、最初の要素の値は最初に00になり、次に最初のインクリメントの後に0xに変更され、2番目のインクリメントの後にxxに変更されます。その後、それはxxにとどまります。リセット入力は最初から「0」に設定され、決して変更されません。

+1

を、あなたが最初にあなたの質問をしたときに、私たちは答えている可能性がすべてこのコードを掲載いましたそれははるかに迅速に。 –

+0

コードは分析されません。ポート宣言では、余分なセミコロン(ポートインターフェイスオブジェクトの宣言の後の宣言区切り記号)があります。 vektorのためのタイプ宣言はありません(たぶんパッケージ 'datentyp'がありません)。信号割当対象の「アラーム」は宣言されていない(質問には必要ない)。かなり[MCVE](http://stackoverflow.com/help/mcve)ではなく、複数のドライバを表示するのに十分です。 IEEE Std 1076-2008を参照してください。14.7.2ドライバ「プロセスステートメントのすべての信号割り当てステートメントは、特定のスカラー信号用のドライバのセットを定義します。 – user1155120

+0

パッケージnumeric_stdのソース([-2008](http://standards.ieee.org/downloads/1076/1076-2008/)、[以前のリビジョン](http://standards.ieee.org/downloads/1076) /1076.2-1996/))は、タイプunsignedが解決されたシグナルのサブタイプまたはタイプであることを示します。 4.6分解能パラ3分解された信号に関連する分解能関数は、複数の供給源からの入力集合の関数として信号の分解された値を決定する。解像度関数 '解決済み 'は、パッケージstd_logic_1164にあります。 – user1155120

答えて

2

VHDLはハードウェア記述言語です。各プロセスはハードウェアを表します。シグナルinternal_stampを2つのプロセスから駆動しています。あなたは短絡回路を持っています。あなたが行

internal_stamp <= (others => (others => '0')); 

をコメントアウトするとinternal_stampこの結果は、唯一のプロセスから駆動されています。従って、短絡はなく、「X」値もない。

シーケンシャルロジックをコーディングする場合は、テンプレートに固執する必要があります。ここでは、すべての合成ツールを理解しておく必要があり、非同期リセット、との順序論理のための1つのようなテンプレートは次のとおりです。

process(clock, async_reset) -- nothing else should go in the sensitivity list 
begin 
    -- never put anything here 
    if async_reset ='1' then -- or '0' for an active low reset 
     -- set/reset the flip-flops here 
     -- ie drive the signals to their initial values 
    elsif rising_edge(clock) then -- or falling_edge(clock) 
     -- put the synchronous stuff here 
     -- ie the stuff that happens on the rising or falling edge of the clock 
    end if; 
    -- never put anything here 
end process;   

ここでは、非同期リセットせずに順序論理のためのテンプレートは次のとおりです。

ので
process(clock) -- nothing else should go in the sensitivity list 
begin 
    if rising_edge(clock) then -- or falling_edge(clock) 
     -- put the synchronous stuff here (including the reset) 
     -- ie the stuff that happens on the rising or falling edge of the clock 
    end if; 
    -- never put anything here 
end process;   

、あなたがすべき2つではなく1つのプロセスを使用してロジックをコーディングします。しかし

process(clk, reset) 
    begin 
     if reset = '1' then 
      report "reset triggered"; 
      internal_stamp <= (others => (others => '0')); 
      alarm <= '0'; 
     elsif(rising_edge(clk)) then 
      internal_stamp(0) <= internal_stamp(0) + 1; 
     end if; 
    end process; 

、あなたが同期リセットたい場合:あなたは非同期をリセットしたいと仮定すると、

process(clk) 
    begin 
     if(rising_edge(clk)) then 
     if reset = '1' then 
      report "reset triggered"; 
      internal_stamp <= (others => (others => '0')); 
      alarm <= '0'; 
     else 
      internal_stamp(0) <= internal_stamp(0) + 1; 
     end if; 
    end process;