2011-06-23 9 views
0

std_logic_vector形式で格納されているバイナリ番号の場所の値を検出する際に問題が発生しています。たとえば、以下のコードでは、INST_SPEEDの値が0〜99 km/hの範囲内であることを確認しようとしています。コードは多くのif条件で本当に長いです。VHDLの問題std_logic_vector場所の値

if INST_SPEED > "0001001" and INST_SPEED < "0010100" then   -- if INST_SPEED > 9 & INST_SPEED < 20 

     UPPER10 <= "0000001";     -- UPPER10 = 1 
     TEMP <= std_logic_vector(unsigned(INST_SPEED) - 10); 
     UPPER1 <= TEMP;      -- LOWER10 = INST_SPEED - 10 
     elsif INST_SPEED > "0010011" and INST_SPEED < "0011110" then -- if INST_SPEED > 19 & INST_SPEED < 30 
     UPPER10 <= "0000010";     -- UPPER10 = 2 
     TEMP <= std_logic_vector(unsigned(INST_SPEED) - 20); 
     UPPER1 <= TEMP;      -- LOWER10 = INST_SPEED - 20 
     elsif INST_SPEED > "0011101" and INST_SPEED < "101000" then -- if INST_SPEED > 29 & INST_SPEED < 40 
     UPPER10 <= "0000011";     -- UPPER10 = 3 
     TEMP <= std_logic_vector(unsigned(INST_SPEED) - 30); 
     UPPER1 <= TEMP;      -- LOWER10 = INST_SPEED - 30 

ただし、0-999の範囲の値を検出するための同様のコードを書く必要があります。もし私がこの論理によって行くなら、それは90のそのような条件を意味するでしょう!

このプロセスについてもっと簡単に知的な方法を知っている人はいますか?これは本当に私を助けてくれるでしょう、事前に感謝!

答えて

0

問題を変更してください。あなたのバイナリ値を基数10の値に変換するためのモジュロ関数を実装するか(これは素早く更新する必要がない場合は非常に小さいかもしれません)、INST_SPEED値のBCDを使用する方が簡単かもしれません。

今のところコード化しているので、すべての条件付きでハードコードしようとしている除算/モジュロ関数が本当に必要です。ターゲットに応じて、「フリー」(つまり、使用しているFPGAに使用されていないハードウェア乗算器があるかもしれません)のためにこれを行うことができます。私は考えることができる

+0

ねえ、ええ、私は昨晩この問題を眠ろうと思っていました。私は順番にそれぞれの数字を100で分け、次に10で分ける方が簡単だと思います。 721、最初の分割の後、私は答えとして7を得るでしょう(百位の値)と残りの21。次に、残りを10で除算して2をテンション値、最後に1を単位または1の値とします。 –

+0

ヘルプスタッフのためのThx、本当にそれを感謝します! –

0

カップルオプション:ROMに格納されます大LUT(ルックアップテーブル)を作成する方法について

  1. どのように?アドレスはINST_SPEEDの値になり、出力はUPPER10またはTEMPになります。あなたはスクリプト(VHDLの外で)でROMの内容を生成し、それをあなたのコードに貼り付けることも、VHDLファイルIOをサポートするファイルから読み込むこともできます。
  2. 入力と出力の間には単純なパターンはありませんか?代わりに派生する数学関数ですか?
+0

努力のためのThx!私は解決策を見つけたと思う... –

関連する問題