0

私はこれに数え切れないほどの時間を費やしましたが、ついに本当に助けが必要だと判断しました..だからここにいます.

基本的に私がやっていることは、ADC から 8 ビットの入力を取得し、この値を BCD に変換して 7 セグメント ボードに表示することです。SO これまでの私のコードは次のとおりです。

Library IEEE ;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.all;
use IEEE.std_logic_unsigned.all;

entity Voltage_LUT is
  Port ( scaled_value : in  unsigned(7 downto 0);
         true_value : out  STD_LOGIC_VECTOR (15 downto 0)
  );
end Voltage_LUT;

architecture Behavioral of Voltage_LUT is

  function  divide  (a : UNSIGNED; b : UNSIGNED) return unsigned is
    variable a1 : unsigned(a'length-1 downto 0):=a;
    variable b1 : unsigned(b'length-1 downto 0):=b;
    variable p1 : unsigned(b'length downto 0):= (others => '0');
    variable i : integer:=0;
  begin
    for i in 0 to b'length-1 loop
      p1(b'length-1 downto 1) := p1(b'length-2 downto 0);
      p1(0) := a1(a'length-1);
      a1(a'length-1 downto 1) := a1(a'length-2 downto 0);
      p1 := p1-b1;
      if(p1(b'length-1) ='1') then
        a1(0) :='0';
        p1 := p1+b1;
      else
        a1(0) :='1';
      end if;
    end loop;
    return a1;
  end divide;

  signal  adj: unsigned(7 downto -2);    --adjusted to max 90
  signal  max_value: unsigned(7 downto 0):= "11111111" ;    --adjusted to max 90
  signal  MSB_int: integer;   -- integer form of MSB
  signal  LSB_int: integer;    --integer form of LSB
  signal  adj2: unsigned(15 downto 0);    --converted from adjusted integer to binary
  signal  LSB: STD_LOGIC_VECTOR (3 downto 0);    --BCD for LSB
  signal  MSB: STD_LOGIC_VECTOR (3 downto 0);    --BCD for MSB
  signal  OFF: STD_LOGIC_VECTOR (3 downto 0):="1010";    --defined to be segment OFF
  signal  V: STD_LOGIC_VECTOR (3 downto 0):="1011";    --defined to be letter V

begin

  adj <= divide ( scaled_value , max_value );
  adj2 <= adj* "00001001" ;

end Behavioral;    

基本的に私がやっていることは、ADC から 8 ビット値を取得し、それを最大値 (9) の一部として表現し、これを BCD に変換する必要があります... しかし、このコードを実行しているときは次のエラーが表示されます。

38 行目: インデックス値 <-2> が配列の [0:2147483647] の範囲外です

9 を掛けたときに正確になるように、除算の答えを 2 進数 (11001.110 などの 10 進数) にする必要があります...

4

1 に答える 1

1

問題のある行は次のとおりです。

signal  adj: unsigned(7 downto -2);

この型unsignedは負の範囲をサポートしていません。結果を小数部のある固定小数点値として扱いたい場合は、次のようないくつかの選択肢があります。

  • VHDL-2008 準拠のツールを使用している場合は、 でやろうとしたように、負のインデックスをサポートするieee.fixed_pkgタイプ を含むufixedを使用できます。unsigned

  • VHDL-2008 準拠のツールを持っていない場合は、仮想的に 2 進小数点をいつでも管理できます。つまり、次のように宣言します。

    signal  adj: unsigned(9 downto 0);
    

    残念ながら、この方法では、簿記を手動で行う必要があります。ただし、乗算と除算のみを行っているように見えるため、2 進小数点の位置合わせについて心配する必要はありません。値が「正確」であるかどうかは、後続のロジックでどのように使用するかによって異なります。

于 2014-11-19T15:00:29.490 に答える