1

2 つの数値を追加する次の簡単な手順があります。

  procedure add_elements
  (
    x : in  std_logic_vector(31 downto 0);
    y : in  std_logic_vector(31 downto 0);   
    r : out std_logic_vector(31 downto 0)
  )
  is

  begin

   r := a + b;

  end;

次のようなプロセスでこの手順を利用したいと思います。

  test: process (....)
    variable inp1 : std_logic_vector(31 downto 0);
    variable inp2 : std_logic_vector(31 downto 0);
    variable res : std_logic_vector(31 downto 0);
  begin

    ...
    inp1  := some_value_a;
    inp2  := some_value_b;
    add_elements(inp1, inp2, res);
    ...
  end

ただし、コンパイルしようとすると、Modelsim はサブプログラム "add_elements" の実行可能なエントリがないと教えてくれます

ここで何がうまくいかなかったのか、add_elements プロシージャの署名に何か問題がありますか?

どうもありがとう!

4

3 に答える 3

3

なぜ2つの数字を足す手続きが必要なのですか? すぐに追加してみませんか?

-- std_logic_vectors が数値を表すと仮定していることに注意してください。 --

std_logic_vectors を unsigned または signed first ( use ieee.numeric_std.all) にキャストし、"+" 演算子を使用することをお勧めします。問題がuse ieee.std_logic_unsigned.all発生するだけです。

于 2011-02-02T19:48:17.770 に答える
3

このようなセットアップが必要になると思います (いくつかのタイプミスに気付きました)。

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

ここで、std_logic_unsigned の使用を避け、numeric_std の使用に移行することをお勧めします...先に進みます...ここでは興味深いものは何もありません:

entity top is
    port (
    clk : in std_logic;
    x : in std_logic_vector(31 downto 0);
    y : in std_logic_vector(31 downto 0)
    );
end top;

アーキテクチャでは、プロシージャを宣言します。タイプミスがあったと思います。(x と y 対 a と b)。

architecture top_arch of top is
 procedure add_elements
  (
    x : in  std_logic_vector(31 downto 0);
    y : in  std_logic_vector(31 downto 0);   
    r : out std_logic_vector(31 downto 0)
  )
  is
  begin
   r := x + y;
  end;

begin

実際のプロセスは次のとおりです。

  test: process (clk)
    variable inp1 : std_logic_vector(31 downto 0);
    variable inp2 : std_logic_vector(31 downto 0);
    variable res : std_logic_vector(31 downto 0);
  begin
    inp1  := x;
    inp2  := y;
    add_elements(inp1, inp2, res);
  end process;
end architecture top_arch;

以上です。おそらくライブラリが不足しているか、タイプミスがある可能性があります。

編集:再利用の目的で必要な場合は、手順を別のパッケージに入れることができる(そしてそうする必要がある)ことにも言及する必要があります。次に、「use」ステートメントを使用してパッケージを含める必要があります。

于 2011-02-02T14:00:53.853 に答える
1

実は問題は「+」の署名にあります。標準の VHDL では、 で定義された演算はありませんstd_logic_vector

他の人がほぼ示唆しているように、代わりにunsignedor signedfromを使用することを検討してください。IEEE.numeric_std

完全を期すために、VHDL-2008 は で演算を行う標準パッケージを追加しているようですstd_logic_vector。ただし、非標準パッケージと同様に、数値の解釈 (符号付きまたは符号なし) は使用するパッケージによって異なります。私はそれが好きではありません。

于 2011-02-02T23:31:32.313 に答える