2

VHDL内のキャストエラーを解決しようとしてきた過去数日間、私はかなり困惑しています。私のコードは以下に添付されています。

if ステートメントは適切に評価されますが、最小変数または最大変数に新しい値が割り当てられません。関数のさまざまな側面をコメントアウトしてテストしたので、これを知っています。

参考までに。typeには、以下の関数で比較している電圧t_battery_dataの配列が含まれています。std_logic_vectors(15 downto 0)

なぜこのように実行しているのかわかりません。オンラインで検索して見つけたのは、ieee.numeric_std私が行ったライブラリを含めることだけでした。

まだ困惑しています。どんな提案でも大歓迎です。ありがとう!

function cell_delta_voltage_counts(
    bat_data: t_battery_data
) return integer is

    constant POS_INFINITY: integer:= 2 ** 16 - 1;
    constant NEG_INFINITY: integer:= 0;

    variable min: integer range 0 to 2 ** 16 - 1:= POS_INFINITY-5;
    variable max: integer range 0 to 2 ** 16 - 1:= NEG_INFINITY;

begin

    for i in 0 to NUM_CELLS-1 loop

        if (to_integer(unsigned(bat_data.cell_readings(i).voltage)) < min) then
            min := to_integer(unsigned(bat_data.cell_readings(i).voltage));
        end if;

        if (to_integer(unsigned(bat_data.cell_readings(i).voltage)) > max) then
            max := to_integer(unsigned(bat_data.cell_readings(i).voltage));
        end if;

    end loop;

    return max - min;

end function cell_delta_voltage_counts;
4

2 に答える 2

1

ここには何も問題はありません。コードを試してみましたが、Modelsim DE 10.1c で動作します。どのシミュレーターを使用していますか?

関数を試すときに使用したコードは次のとおりです。

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity test is
end entity;

architecture sim of test is

   constant NUM_CELLS : integer := 2;

   type t_reading is record
      voltage : std_logic_vector(15 downto 0);
   end record t_reading;

   type t_readings is array(natural range <>) of t_reading;

   type t_battery_data is record
      cell_readings : t_readings(0 to NUM_CELLS-1);
   end record t_battery_data;

   function cell_delta_voltage_counts(
     (...)
   end function cell_delta_voltage_counts;
begin

   process
      variable v_battery_data : t_battery_data;
      variable v_result : integer := 0;
   begin
      v_battery_data.cell_readings(0).voltage := x"000a";
      v_battery_data.cell_readings(1).voltage := x"001a";

      v_result := cell_delta_voltage_counts(v_battery_data);
      report "result: " & integer'image(v_result);

      wait;
   end process;

end architecture;

あなたが投稿したとおりに機能を使用しました。シミュレーションの出力は、予想どおり「result: 16」です。

于 2012-09-24T15:57:33.277 に答える
1

私は多くの関数を使用しませんが、IIRC で最小値と最大値が呼び出し間の状態を「記憶」することを期待する場合は、関数の外側でそれらを宣言し、関数を非純粋として宣言する必要があります。

variable min: integer range 0 to 2 ** 16 - 1:= POS_INFINITY-5;
variable max: integer range 0 to 2 ** 16 - 1:= NEG_INFINITY;

impure function cell_delta_voltage_counts(
...
于 2012-09-21T21:11:58.253 に答える