2016-08-04 7 views
0

現在、私は12時間のデバッグセッションの最中です。私の人生の間、このこぶを渡すことはできません。VHDLの信号値を特定できません

私のコードの設定方法は、8ビットのstd_logic_vectorがDE2-115ボード上の8つのスイッチにマッピングされています。各ビットは、相対スイッチ(0または1)によって起動されるロジックレベルに腐食します。

目標は、タイマーを開始する前に8台のスイッチのいずれかがアクティブになるのを待機するようにすることです。

signal relative_time_enable   : STD_LOGIC := '0'; 
signal signal_in      : STD_LOGIC_VECTOR(7 downto 0); 

signal_inがマッピングされる:信号relative_time_enableは1の論理状態に設定されているときに信号が示すように、この変数は初期化され、それは最終的に0にリセットされることはありません1に設定されると、これは、活性化されます私のエンティティで宣言されていないポート、またはその逆のポートを使用することができます。しかし、signal_inはスイッチに腐食すると言われています。ここに私が今持っているコードがあります。

process(clk_1MHz_enable, signal_in)  
begin 
    if(clk_1MHz_enable = '1') then 

      if(relative_time_enable = '0') and (signal_in /= "00000000")then 
        relative_time_enable <= '1'; 
      end if; 
    end if; 
end process; 

私は、if文が常に真となっていることを問題として推測していると思います。まるでsignal_inが最初のサイクル内の複数の状態を通過しているので、値が直ちに1に設定されているように、私は正しい方向に向けることができるオンラインを見つけることができませんでした。

ここでは、 "00000000"を "11111111"、 "UUUUUUUU"、 "ZZZZZZZZ"、 "XXXXXXXX"に置き換え、それらのすべてがまだ通過することを含む値を実際に調べるためにすべてを試しました。

私も試してみました:

process(clk_1MHz_enable, signal_in)  
begin 
    if(clk_1MHz_enable = '1') then 

      if(relative_time_enable = '0') and (signal_in /= "00000000")then 

        for i in 0 to 7 loop 
          if(signal_in(i) = '1') then 
            relative_time_enable <= '1'; 
          end if; 
        end loop; 

      end if; 
    end if; 
end process; 

をこの方法では、それは「ダブルチェック」はずのように思えるが、何とかそれはどのスイッチが活性化される前に通り抜けると、その値を1に設定保持します。また、LCD上にsignal_inが表示され、スイッチを移動すると変更され、起動時にすべてが00000000と表示されます。

FYI:このFPGAとVHDLで2週間しか作業していないので、非常に基本的です。また、私はModelSIMでの自分のスキルに100%自信を持っておらず、どのように私が見ているものをコードの問題にどのように変換するのかはわかりません。

ご協力いただければ幸いです。コードをもう一度見る必要がある場合は、必要なものを投稿することができます。私はちょうどそれのすべてを置いていないので、このポストには関係のないLCDを制御するかなり長いステートマシンがあるからです。

また、次のコードは期待どおりに動作することを言及する必要がありますが、このコードの問題は、relative_time_enableを0に戻して戻すことです。私がこれを示している唯一の理由は、クロックを開始する前にスイッチがアクティブになるまで本質的に待機するためですが、スイッチを非アクティブにするとクロックが問題なく動作しなくなります。

process(clk_1MHz_enable, signal_in)  
begin 
    if(clk_1MHz_enable = '1') then 

      if(relative_time_enable = '0') and (signal_in /= "00000000")then 
        relative_time_enable <= '1'; 
      else 
        relative_time_enable <= '0'; 
      end if; 
    end if; 
end process; 

答えて

0

各ビットは'0'値または'1'値のいずれかを取るので、あなたのテストはbit_vectorで動作します。したがって、/= "00000000"は実際には少なくとも1つのビットは'1'です。しかし、std_logic_vectorを使用しているので、各ビットは9つの異なる値をとることができます(std_logicは9値の列挙型です)。したがって、/= "00000000"は、少なくとも1ビットが'1'であることを意味しません。これは、1ビットが'U'または'0'とは異なる他の値に設定されていることを意味します。あなたがそのように宣言しているためsignal_inは(初期化されていないためUスタンド)」を"UUUUUUUUで初期化されたシミュレーションの開始時。 '0'で初期化されます。だからあなたのテストはclk_1MHz_enableの最初の立ち上がりエッジで渡し、が'1'で立ち往生。ほとんどすぐ

クロック(変な名前が、なぜしない)clk_1MHz_enableをされたと仮定すると、あなたがエッジ・トリガDフリップフロップをしたい、次のコードは、この問題を解決:

process(clk_1MHz_enable)  
begin 
    if clk_1MHz_enable = '1' and clk_1MHz_enable'event then 
    for i in signal_in'range loop 
     if signal_in(i) = '1' then 
     relative_time_enable <= '1'; 
     end if; 
    end loop; 
    end if; 
end process; 

アンエッジトリガDフリップフロップの代わりにレベルトリガラッチが必要な場合はdを選択します。

process(clk_1MHz_enable, signal_in) 
begin 
    if clk_1MHz_enable = '1' then 
    for in in signal_in'range loop 
     if signal_in(i) = '1' then 
     relative_time_enable <= '1'; 
     end if; 
    end loop; 
    end if; 
end process; 
+0

Genuis! Bit_Vectorは美しく動作しました。お手伝いありがとう。 – Dylan