我有多个输入属于一起(在相同的时钟等处采样)但在逻辑上不是我需要修改的现有代码中的向量(即非并行总线)。
以前,它们被定义为
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;
对于大多数意图和目的,数组和向量可以处理几乎相同,所以我的问题是:
这两种做法都有什么好处吗?有首选/标准方式吗?
答案 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;
这会编译(即没有错误)。