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
必须是静态的。iex
必须是文字、常量或泛型
可以以这种方式使用函数来定义常量值和其他静态值。此函数的所有输入必须是静态的。有趣的是,这样的函数在精化过程中执行,这会使调试变得困难。如果调试此类函数时遇到问题,可以暂时将函数返回值的目标更改为非静态的(例如变量);然后,该函数将在时间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;