2012-02-21 4 views
2

私はこのVHDLコードを2日間デバッグしようとしていましたが、どこにエラーがあるのか​​分かりません。信号と定数の警告のための1ビットラッチが見つかりました

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.STD_LOGIC_ARITH.ALL; 
use IEEE.STD_LOGIC_UNSIGNED.ALL; 


entity SSDDriver is 
    Port (cp : in std_logic; 
       iin : in std_logic; 
       an : buffer std_logic_vector (3 downto 0); 
       --7=a, 6=b ... 
       segments: out std_logic_vector (7 downto 0)); 
end SSDDriver; 

architecture Behavioral of SSDDriver is 
    signal cpo : std_logic; 
    --broj BCD znamenki 
    constant BCD_NUMBERS : integer := 4; 
    --broj bitova ulaznog broja 
    constant BITS : integer := 14; 
    --broj kodiran BCD-om 
    signal BCDNumber : std_logic_vector (BCD_NUMBERS*4-1 downto 0) := (others => '0'); 
    signal BCDForDecoder: std_logic_vector (3 downto 0); 
    signal number: integer range 0 to 9999; 
begin 
    decoder: entity BCDToSSD port map (bcd => BCDForDecoder, segm => segments (7 downto 1)); 
    counter: entity djelitelj generic map (COUNTTO => 25000) port map (cpIn => cp, CpOut=> cpo); 
    --tocka je uvijek ugasena 
    segments(0) <= '1'; 

    process (iin) 
    begin 
     if iin='1' then 
      number<=3245; 
     else 
      number<=1111; 
     end if; 
    end process; 

    SwitchDisplay: process (cpo) 
    begin 
     if rising_edge(cpo) then 
      if an="0111" then 
       an<="1011"; 
       BCDForDecoder<=BCDNumber(11 downto 8); 
      elsif an="1011" then 
       an<="1101"; 
       BCDForDecoder<=BCDNumber(7 downto 4); 
      elsif an="1101" then 
       an<="1110"; 
       BCDForDecoder<=BCDNumber(3 downto 0); 
      else 
       an<="0111"; 
       BCDForDecoder<=BCDNumber(15 downto 12); 
      end if; 
     end if; 
    end process SwitchDisplay; 

    DoubleDabble: process (number) 
     variable num : std_logic_vector (BITS-1 downto 0); 
     variable bcd : std_logic_vector (BCD_NUMBERS*4-1 downto 0) := (others => '0'); 
     variable old_number: integer range 0 to 9999; 
    begin 
     if number/= old_number then 
      num := conv_std_logic_vector(number, BITS); 

      for i in 0 to BITS-1 loop 
       bcd(BCD_NUMBERS*4-1 downto 1) := bcd(BCD_NUMBERS*4-2 downto 0); 
       bcd(0) := num(BITS-1); 
       num(BITS-1 downto 1) := num(BITS-2 downto 0); 
       num(0) :='0'; 

       if(i < BITS-1 and bcd(3 downto 0) > "0100") then 
        bcd(3 downto 0) := bcd(3 downto 0) + "0011"; 
       end if; 

       if(i < BITS-1 and bcd(7 downto 4) > "0100") then 
        bcd(7 downto 4) := bcd(7 downto 4) + "0011"; 
       end if; 

       if(i < BITS-1 and bcd(11 downto 8) > "0100") then 
        bcd(11 downto 8) := bcd(11 downto 8) + "0011"; 
       end if; 

       if(i < BITS-1 and bcd(15 downto 12) > "0100") then 
        bcd(15 downto 12) := bcd(15 downto 12) + "0011"; 
       end if; 
      end loop; 
      BCDNumber <= bcd; 
     else 

     end if; 

     old_number := number; 
    end process DoubleDabble; 
end Behavioral; 

そして、ここでは、生成された警告:

警告:XSTで:ここにコードがある2734 - プロパティ "USE_DSP48" この 技術には適用されません。警告:Xst:1780 - 信号>が使用されていないか、 が割り当てられています。警告:Xst:737 - 信号の1ビットラッチが見つかりました。 警告:Xst:737 - 信号用の1ビットラッチが見つかりました。 警告:Xst:737 - 信号用の1ビットラッチが見つかりました。 警告:Xst:737 - 信号用の1ビットラッチが見つかりました。 警告:Xst:737 - 信号用の1ビットラッチが見つかりました。 警告:Xst:737 - 信号用の1ビットラッチが見つかりました。 警告:Xst:737 - 信号用の1ビットラッチが見つかりました。 警告:Xst:737 - 信号用の1ビットラッチが見つかりました。 警告:Xst:737 - 信号用の1ビットラッチが見つかりました。 警告:Xst:737 - 信号用の1ビットラッチが見つかりました。 警告:Xst:737 - 信号用の16ビットラッチが見つかりました。 警告:Xst:737 - 信号用の1ビットラッチが見つかりました。 警告:Xst:737 - 信号用の1ビットラッチが見つかりました。 警告:Xst:737 - 信号用の1ビットラッチが見つかりました。 警告:Xst:737 - 信号用の1ビットラッチが見つかりました。 警告:Xst:737 - 信号用の1ビットラッチが見つかりました。 警告:Xst:2734 - プロパティ "use_dsp48"はこの テクノロジには適用されません。警告:Xst:1426 - FF /ラッチbcd_0の値init は、ブロックSSDDriverの定数クリーニングを妨げます。警告:Xst:1293 - FF /ラッチのブロック内の定数値は0です。警告:Xst:1293 - FF /ラッチのブロック内に一定値の があります。警告:Xst:1293 - ブロック内のFF /ラッチの値が0である です。警告:Xst:1293 - FF /ラッチ のブロック内の定数値は0です。 警告:Xst:1293 - ブロックでFF /ラッチの定数値が0になっています。警告:Xst:1293 - ブロック内のFF /ラッチの定数は です。警告:Xst:1293 - FF /ラッチ のブロック内の定数値は0です。警告:Xst:1293 - FF /ラッチのブロック内の定数値は0です。 警告:Xst:1293 - ブロックでFF /ラッチの定数値が0になっています。警告:Xst:1293 - ブロック内のFF /ラッチの定数は です。警告:Xst:1293 - FF /ラッチ のブロック内の定数値は0です。警告:Xst:1293 - FF /ラッチのブロック内の定数値は0です。 警告:Xst:1293 - ブロックでFF /ラッチの定数値が0になっています。警告:Xst:1293 - ブロック内のFF /ラッチの値が0である です。警告:Xst:1293 - FF /ラッチ のブロック内の定数値は0です。 警告:Xst:1293 - ブロックでFF /ラッチの定数値が0になっています。警告:XSTで:1710 - FF /ラッチ

のように...

は、これらの警告の結果、唯一の0000は4 7セグメントディスプレイに表示され、私はそのモジュールを実装したときに、私が取得します。

このVHDLコードは整数変数(0〜9999の範囲)を取り、4個の7セグメント表示を使用してその番号を表示する必要があります...

答えて

4

同期設計に変換する代わりに、ロジックを真に非同期にすることもできます。

DoubleDabbleプロセスでは、最も外側のifステートメントをコメントして、BCD変換ロジックが常に実行されるようにしてください。あなたのロジックは以前の整数値(old_number)を必要とせず、シンセサイザを適合させるのは "if number/= old_number"の比較(クロック信号と同期ロジックを使用せず)です。

+0

私は一番外側のif文を削除しましたが、今実装することができますし、ちょっと動作します:)最後の数字は正しく動作しますが(1つは数字を表す)、他のものは正しく動作します3は急速に変化しています。また、私はbcdシグナルがコンビナトリアルループであることを私に伝える「コンビナトリアルループを形成する次のシグナル」という警告を得る。なぜそれがどのようなアイデアと私はそれを解決することができますか?ありがとう:) – xx77aBs

+2

おそらく、あなたは決して知られている値に設定していないので、forループを開始します。シンセサイザーは、前のサイクルの結果を持ち越したいと考えています。 –

+0

OMG!私はこれが問題だとは信じられません:)あなたが私に言ったように、意味があります:)私はこれを "bcd:=(others => '0'); forループの前にそれが動作します。どうもありがとうございました !!!! – xx77aBs

4

BCD変換処理全体を非同期で行うことに決めた理由はありますか?これはあなたのラッチング問題のすべてが(ダブルダブルプロセス)から来ている場所です。

私は、同期プロセスに変換すると、 "一定のクリーニング"と "ラッチ"の警告を取り除くべきであるということはほぼ肯定的です。

"一定のクリーニング"警告はすべてのラッチを初期値にトリミングします。なぜなら、常にゼロが表示される理由です。

イベントやインスタンスに登録する必要がある場合は、ほとんど常に時計を使用する必要があります。その信号が真となってからクロックが高くなっても私が信じている時から、時間がナノ秒になるかもしれません。クロックに合わせることで、将来多くの問題を救えるでしょう。

+0

ありがとう:)このプロセスを同期に変換するために何をすべきか教えてください。私はちょうど初心者なので、私は何をすべきか分かりません。 – xx77aBs

+1

まだ同期応答が必要かどうかは不明です。あなたはあなたの解決策を見つけましたか? –

+0

私はそれを非同期で動作させました。しかし、できれば、私がどのように同期できるか教えてください。 – xx77aBs

関連する問題