使用从here定义的VHDL子类型
signal ShortInt: integer range 0 to 255;
subtype SHORT integer range 0 to 255;
我会这样简短吗?
signal ShortInt: SHORT;
为什么我不将范围放到信号上并完全忽略子类型?
signal ShortInt: integer range 0 to 255;
我已经看到这里回答了有关亚型及其作用的问题,但是我还没有找到一个像我要问的那样头脑简单的人,为什么要使用亚型?
答案 0 :(得分:1)
大多数子类型用于简化和以后的修改。但是,除了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接口之类的大型总线,您将拥有大量声明的子类型!
答案 1 :(得分:0)
创建常量集非常方便:
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”。