Передача переменных в процедуру в VHDL - PullRequest
1 голос
/ 02 февраля 2011

У меня есть следующая простая процедура добавления двух чисел:

  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?

Большое спасибо!

Ответы [ 3 ]

3 голосов
/ 02 февраля 2011

Зачем вам нужна процедура для добавления двух чисел? Почему бы вам просто не добавить их сразу?

- Обратите внимание, что я предполагаю, что std_logic_vectors представляют числа .--

Я рекомендую привести std_logic_vectors к неподписанному или подписанному первому (use ieee.numeric_std.all) и использовать оператор "+". Вы никогда не должны use ieee.std_logic_unsigned.all, это только доставит вам проблемы.

3 голосов
/ 02 февраля 2011

Я думаю, вам понадобится такая установка (я заметил несколько опечаток).

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;

В архитектуре мы объявляем процедуру.Я думаю, что у вас была опечатка.(х и у против а и б).

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».

1 голос
/ 03 февраля 2011

На самом деле проблема в сигнатуре "+".В стандартном VHDL нет арифметики, определенной с std_logic_vector.

. Как уже почти предлагали другие, рассмотрите возможность использования unsigned или signed из IEEE.numeric_std.

Для полноты,Похоже, что VHDL-2008 добавляет стандартные пакеты для арифметики на std_logic_vector.Однако, как и в случае нестандартных пакетов, числовая интерпретация (со знаком или без знака) зависит от того, какой пакет используется.Мне это не нравится.

...