首页 > 解决方案 > VHDL中的多维别名

问题描述

我想问一下是否可以在VHDL中使用带有多维数组的别名以及如何解决(1)。

我在架构的开头定义了以下数组>

subtype WORD8 is STD_LOGIC_VECTOR (7 downto 0);  
type IMEM is array (0 to 576) of WORD8;
signal MEM: IMEM;

通过我使用进程的程序,我像这样为内存的一部分设置别名>

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 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。我尝试了以下代码,但没有成功。它导致>

错误:索引名称不是“std_logic_vector”

--(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

解决方案


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

std_logic_vector(7 downto 0)是 std_logic 的一维数组。MEM(3 downto 2)(7 downto 0)是 std_logic_vectors 的一维数组。所以不是同一类型

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

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

signal TL4: STD_LOGIC_VECTOR (15 downto 0);

TL4 <= TL2 & TL3;

推荐阅读