Types 可参数化VHDL子类型

Types 可参数化VHDL子类型,types,vhdl,subtype,Types,Vhdl,Subtype,我知道可以创建定义范围的子类型,例如: subtype ADDRESS is UNSIGNED range (32 downto 0); 是否可以创建可参数化的类型/子类型?本质上,在创建ADDRESS类型的变量时,将“32”的值留给用户定义。例如: subtype ADDRESS is UNSIGNED range ( f(x) ) downto 0; 其中f()是另一个包中预定义的函数,X是用户在创建ADDRESS实例时提供的自然整数 基本上我想缩短 y : UNSIGNED(f(X)

我知道可以创建定义范围的子类型,例如:

subtype ADDRESS is UNSIGNED range (32 downto 0);
是否可以创建可参数化的类型/子类型?本质上,在创建ADDRESS类型的变量时,将“32”的值留给用户定义。例如:

subtype ADDRESS is UNSIGNED range ( f(x) ) downto 0;
其中f()是另一个包中预定义的函数,X是用户在创建ADDRESS实例时提供的自然整数

基本上我想缩短

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


其中X是一个自然值。

嗯,是的。但你不能写:

subtype ADDRESS is UNSIGNED range ( f(x) ) downto 0;
因为这不是正确的VHDL。你必须写:

subtype ADDRESS is UNSIGNED ( f(x) downto 0);
其中
x
必须是静态的。ie
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;

现在开始了

马修·泰勒的答案已经是正确的,但我想回答你的最后一个问题

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
即,返回类型必须是已定义的类型。它不能是新的[子]类型。 您可以使用子类型定义执行某些操作,如Matthew解释的:

subtype ADDRESS_X is unsigned(f(X) downto 0);
signal new_signal : ADDRESS_X;
subtype ADDRESS_X is unsigned(f(X) downto 0);
signal new_signal : ADDRESS_X;