VHDL中的多维别名

VHDL中的多维别名,vhdl,Vhdl,我想问一下,在VHDL中是否可以将alias用于多维数组,以及如何解决(1) 我在体系结构的开头定义了以下数组> subtype WORD8 is STD_LOGIC_VECTOR (7 downto 0); type IMEM is array (0 to 576) of WORD8; signal MEM: IMEM; 通过该程序,我使用进程,并将内存的一部分别名为so> alias Version: STD_LOGIC_VECTOR (3 downto 0) is MEM(0)(3

我想问一下,在VHDL中是否可以将alias用于多维数组,以及如何解决(1)

我在体系结构的开头定义了以下数组>

subtype WORD8 is STD_LOGIC_VECTOR (7 downto 0);  
type IMEM is array (0 to 576) of WORD8;
signal MEM: IMEM;
通过该程序,我使用进程,并将内存的一部分别名为so>

alias Version: STD_LOGIC_VECTOR (3 downto 0) is MEM(0)(3 downto 0);
alias IHL: STD_LOGIC_VECTOR (3 downto 0) is MEM(0)(7 downto 4);
下面这一行也是alias,这两行都可以使用

alias TOS: STD_LOGIC_VECTOR (7 downto 0) is MEM(1);
alias TOS: STD_LOGIC_VECTOR (7 downto 0) is MEM(1)(7 downto 0);
现在我有一个比WORD8大的数据,长度为2xWORD8。 我尝试了以下代码,但没有成功。它导致>

错误:索引名称不是“标准逻辑向量”

--(1) How to solve this?
alias TL: STD_LOGIC_VECTOR (15 downto 0) is MEM(3 downto 2);
这一行也给出了相同的错误>

alias TL: STD_LOGIC_VECTOR (15 downto 0) is MEM(3 downto 2)(7 downto 0);
我正在尝试一种变通方法,但也没有成功>

alias TL2: STD_LOGIC_VECTOR (7 downto 0) is MEM(2);
alias TL3: STD_LOGIC_VECTOR (7 downto 0) is MEM(3);
alias TL4: STD_LOGIC_VECTOR (15 downto 0) is TL3&TL2;


这都是因为VHDL中的强类型和别名规则。别名必须直接指向同一类型的对象。它也不能指向不是来自声明(如函数返回)的新对象。所有的错误都是由于这些限制

std\u逻辑\u向量(7到0)
是std\u逻辑的一维数组
MEM(3到2)(7到0)
是标准逻辑向量的一维数组。所以不是同一类型

TL3&TL2
不是声明的对象,它是函数返回值

您唯一的解决方案是使用信号(或变量),因为您正在创建一个新的子类型

signal TL4: STD_LOGIC_VECTOR (15 downto 0);

TL4 <= TL2 & TL3;
信号TL4:STD_逻辑_向量(15到0);

TL4(1)别名TL的类型为std_logic_vector,而MEM的类型为IMEM。IEEE Std 1076-2008 6.6.2对象别名“别名声明中指定名称的基本类型应与子类型指示中类型标记的基本类型相同(如果存在子类型指示)。”对于TL4 6.6.1别名声明中的别名指示符表示由别名声明中的名称和签名(如果存在)指定的命名实体。,其中表达式TL3和TL2不是命名实体。类型IMEM也不是多维数组类型,它只有一个索引(5.3.2数组类型,5.3.2.1常规)。它的元素类型恰好也是一维数组类型。有了这个警告,我想问的是,在VHDL中是否可以将别名用于多维数组,答案是肯定的,而您错误的别名(1)与问题无关。多维数组不能被切片(“切片的前缀应适用于一维数组对象。“8.5切片名称”。IEEE Std 1076-2008 6.6.2对象别名支持多维数组类型的对象别名。目前尚不清楚在各种工具实现中,该“新”功能的支持程度如何。