Параметризуемые подтипы VHDL

Я знаю, что можно создать подтип определенного диапазона, например:

subtype ADDRESS is UNSIGNED range (32 downto 0);

Можно ли создать параметризуемый тип/подтип? По сути, значение «32» определяется пользователем при создании переменной типа ADDRESS. Например:

subtype ADDRESS is UNSIGNED range ( f(x) ) downto 0;

где f() — функция, предварительно определенная в другом пакете, а X — натуральное целое число, предоставленное пользователем при создании экземпляра ADDRESS.

В общем хочу сократить...

y : UNSIGNED(f(X) downto 0);

to

y : ADDRESS(X);

где X — натуральное число.


person neonriver123    schedule 07.03.2017    source источник


Ответы (2)


Ну да. Но нельзя писать:

subtype ADDRESS is UNSIGNED range ( f(x) ) downto 0;

потому что это неправильный VHDL. Вы должны написать:

subtype ADDRESS is UNSIGNED ( f(x) downto 0);

где x должно быть статическим. т.е. x должен быть литералом, константой или общим.

Вы можете использовать функции таким образом, чтобы определить значение констант и других статических значений. Все входные данные такой функции должны быть статическими. Интересно, что такая функция выполняется во время проработки, что может затруднить отладку. Если у вас возникли проблемы с отладкой такой функции, вы можете временно изменить цель возвращаемого значения функции на что-то нестатическое (например, на переменную); то функция будет выполняться по истечении времени 0, что упрощает отладку. Вот реальный пример:

package P is
  function F(I : integer) return integer;
end package P;

package body P is
  function F(I : integer) return integer  is
  begin
    if I > 16 then 
      return I - 1;
    else
      return (I * 2) - 1;
    end if;
  end function F;

end package body P;

library IEEE;
use IEEE.numeric_std.all;
use work.P.all;

entity E is
  constant X : integer := 16;
end entity E;

architecture E of E is
  subtype ADDRESS is UNSIGNED ( f(x) downto 0);
begin

  process
  begin
    report "ADDRESS'left= " & integer'image(ADDRESS'left);
    wait;
  end process;

end architecture E;

И вот оно на игровой площадке EDA.

person Matthew Taylor    schedule 07.03.2017

Ответ Мэтью Тейлора уже правильный, но я хотел бы ответить на ваш последний вопрос.

y : ADDRESS(X);

В C вы используете макрос, но в VHDL это невозможно. Потребуется, чтобы функция ADDRESS возвращала подтип-тип. IEEE1076-2008 определяет:

function_specification ::=
    [ pure | impure ] function designator
        subprogram_header
        [ [ parameter ] ( formal_parameter_list ) ] return type_mark

Где:

type_mark ::=
    type_name
  | subtype_name

т.е. тип возвращаемого значения должен быть уже определенным. Это не может быть новый [под]тип. Вы можете сделать что-то с определением подтипа, как объясняет Мэтью:

subtype ADDRESS_X is unsigned(f(X) downto 0);
signal new_signal : ADDRESS_X;
person JHBonarius    schedule 08.03.2017