可以约束类型的子类型有什么意义?

时间:2020-05-19 16:11:17

标签: vhdl

使用从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;

我已经看到这里回答了有关亚型及其作用的问题,但是我还没有找到一个像我要问的那样头脑简单的人,为什么要使用亚型?

2 个答案:

答案 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”。

相关问题