当类型可以被约束时,子类型有什么意义?
What is the point of a subtype when a type can be constrained?
使用从 here
定义的 VHDL 子类型
signal ShortInt: integer range 0 to 255;
subtype SHORT integer range 0 to 255;
我会像这样使用 short:
signal ShortInt: SHORT;
为什么我不把范围放在信号上而完全忽略子类型?
signal ShortInt: integer range 0 to 255;
我看到这里回答了关于子类型及其作用的问题,但我还没有找到像我想问的那样头脑简单的人,为什么要使用子类型?
创建常量集非常方便:
package UartPkg is
subtype UartAddrType is std_logic_vector(2 downto 0) ;
constant UartTxAddr : UartAddrType := "000" ;
constant Uart...
end package UartPkg ;
然后你可以在实体界面上使用它:
use work.UartPkg.all ;
entity UART is
port (
Addr : UartAddrType ;
. . .
现在考虑一下如果 UART 中的可寻址位置的数量需要增加到 4 位对设计的影响?如果你做对了,你只需要修改你的包。请记住,您的范围可能是“4 到 2”而不是“2 到 0”。
子类型主要是为了清楚和便于以后修改。但是除了 Jim 的回答之外,使用 VHDL 2008 您还可以创建部分约束的子类型,当您有复杂的记录时可以使用它。拿这个:
type reg_if_t is record
valid : std_logic;
addr : std_logic_vector;
data : std_logic_vector;
end record;
在每个端口上限制它可能有点麻烦。
entity ent1 is
port (
reg_if0 : in reg_if_t( addr( 7 downto 0), data(31 downto 0) );
reg_if1 : in reg_if_t( addr(15 downto 0), data(15 downto 0) )
)
end entity;
为什么不在包中声明常用的子类型:
subtype reg_if_a8_t is reg_if_t( addr(7 downto 0), data(open) ); -- data length unconstrained
subtype reg_if_a8_d32_t is reg_if_t( addr(15 downto 0), data(31 downto 0) );
subtype reg_if_a16_d16_t is reg_if_t( addr(15 downto 0), data(15 downto 0) );
subtype reg_if_d32_t is reg_if_t( addr(open), data(31 downto 0) );
现在,有了一个体面的命名约定,用户可以清楚地了解类型的意图:
entity ent1 is
port (
reg_if0 : in reg_if_a8_d32_t;
reg_if1 : in reg_if_a16_d16_t
)
end entity;
而且因为它们是相同的基本类型,所以它们都可以使用相同的函数。将其扩展到像 AXI4 接口这样的大总线,您将声明大量子类型!
使用从 here
定义的 VHDL 子类型signal ShortInt: integer range 0 to 255;
subtype SHORT integer range 0 to 255;
我会像这样使用 short:
signal ShortInt: SHORT;
为什么我不把范围放在信号上而完全忽略子类型?
signal ShortInt: integer range 0 to 255;
我看到这里回答了关于子类型及其作用的问题,但我还没有找到像我想问的那样头脑简单的人,为什么要使用子类型?
创建常量集非常方便:
package UartPkg is
subtype UartAddrType is std_logic_vector(2 downto 0) ;
constant UartTxAddr : UartAddrType := "000" ;
constant Uart...
end package UartPkg ;
然后你可以在实体界面上使用它:
use work.UartPkg.all ;
entity UART is
port (
Addr : UartAddrType ;
. . .
现在考虑一下如果 UART 中的可寻址位置的数量需要增加到 4 位对设计的影响?如果你做对了,你只需要修改你的包。请记住,您的范围可能是“4 到 2”而不是“2 到 0”。
子类型主要是为了清楚和便于以后修改。但是除了 Jim 的回答之外,使用 VHDL 2008 您还可以创建部分约束的子类型,当您有复杂的记录时可以使用它。拿这个:
type reg_if_t is record
valid : std_logic;
addr : std_logic_vector;
data : std_logic_vector;
end record;
在每个端口上限制它可能有点麻烦。
entity ent1 is
port (
reg_if0 : in reg_if_t( addr( 7 downto 0), data(31 downto 0) );
reg_if1 : in reg_if_t( addr(15 downto 0), data(15 downto 0) )
)
end entity;
为什么不在包中声明常用的子类型:
subtype reg_if_a8_t is reg_if_t( addr(7 downto 0), data(open) ); -- data length unconstrained
subtype reg_if_a8_d32_t is reg_if_t( addr(15 downto 0), data(31 downto 0) );
subtype reg_if_a16_d16_t is reg_if_t( addr(15 downto 0), data(15 downto 0) );
subtype reg_if_d32_t is reg_if_t( addr(open), data(31 downto 0) );
现在,有了一个体面的命名约定,用户可以清楚地了解类型的意图:
entity ent1 is
port (
reg_if0 : in reg_if_a8_d32_t;
reg_if1 : in reg_if_a16_d16_t
)
end entity;
而且因为它们是相同的基本类型,所以它们都可以使用相同的函数。将其扩展到像 AXI4 接口这样的大总线,您将声明大量子类型!