VHDL:使用std_logic数组与使用std_logic_vector子类型

时间:2017-09-13 12:55:36

标签: types vhdl subtype

我有多个输入属于一起(在相同的时钟等处采样)但在逻辑上不是我需要修改的现有代码中的向量(即非并行总线)。
以前,它们被定义为

type my_type is array (my_width - 1 downto 0) of std_logic;
signal my_signal : my_type;

到目前为止,为此目的,我总是使用它:

subtype my_subtype is std_logic_vector(my_width - 1 downto 0);
signal my_signal : my_subtype;

对于大多数意图和目的,数组和向量可以处理几乎相同,所以我的问题是:
这两种做法都有什么好处吗?有首选/标准方式吗?

1 个答案:

答案 0 :(得分:1)

存在差异,这与strong typing有关。

使用您的第一段代码,您可以创建一个新类型。它是独立的,与其他类型不兼容。只需考虑下一段代码:

entity e is end entity;
library ieee;
architecture a of e is
    use ieee.std_logic_1164.all;
    type slv1_t is array (15 downto 0) of std_logic;
    signal slv1 : slv1_t;
    type slv2_t is array (7 downto 0) of std_logic;
    signal slv2 : slv2_t;
begin
    slv2 <= slv1(7 downto 0);
end architecture;

在modelsim中编译时,此代码会出错:

  

错误:C:/HDL/TypeVsSubtype/Type.vhd(10):无法将切片名称解析为slv2_t类型。

对于第二段代码,基础类型仍然是std_logic_vector。因此,亚型是相容的。考虑下一段代码:

entity e is end entity;
library ieee;
architecture a of e is
    use ieee.std_logic_1164.all;
    subtype slv1_t is std_logic_vector(15 downto 0);
    signal slv1 : slv1_t;
    subtype slv2_t is std_logic_vector(7 downto 0);
    signal slv2 : slv2_t;
begin
    slv2 <= slv1(7 downto 0);
end architecture;

这会编译(即没有错误)。