arrays - 在 VHDL 中初始化数组 : How exactly does it work?

标签 arrays concatenation vhdl array-indexing

考虑以下 VHDL 代码:

constant c : std_logic_vector(7 downto 0) := (7 downto 6 => '1', others => '0');

这里,索引 7 和 6 很重要:它们指示哪些元素应该为 1,编译器可以从中推导出哪些元素应该为 0。

问题1

如果我理解正确的话,这也可以写成

constant c : std_logic_vector(7 downto 0) := (7 downto 6 => '1') & (5 downto 0 => '0');

现在我想知道它到底是如何工作的,以及索引是否仍然重要或者只是它们之间的差异。按照我的理解,表达式 (x downto y => z) 创建一个索引为 x downto y 的数组,其元素全部等于 z (并且具有相同的类型)。但是当数组连接时这些索引重要吗?即,我还可以写以下任何内容吗:

constant c : std_logic_vector(7 downto 0) := (1 downto 0 => '1') & (5 downto 0 => '0');
constant c : std_logic_vector(7 downto 0) := (99 downto 98 => '1') & (4 downto -1 => '0');

当然,人们可以说这些陈述,尤其是。最后一个,不太清楚,但我的问题是:他们会得到相同的结果吗?或者它们会导致某种类型或错误吗?

我想知道这个的原因是你也可以写

constant c : std_logic_vector(7 downto 0) := "11" & "000000";

并且文字 "11" 没有指定任何范围,所以我不确定这个文字的类型到底是什么,但肯定不是 std_logic_vector(7 downto 6).

问题2

最后,我想知道两者之间有什么区别

constant c : std_logic_vector(7 downto 0) := (7 downto 6 => '1') & (5 downto 0 => '0');

constant c : std_logic_vector(7 downto 0) := (7 downto 6 => '1', 5 downto 0 => '0');

我的意思是:您是否有任何理由想要/需要编写前者(这似乎更容易出错,因为如果您交换两个聚合,它会给出意想不到的结果)而不是后者?或者这只是一个品味问题?

最佳答案

  1. 让我们从文字开始。当您指定文字时,默认范围为 (type_index'low 到 type_index'low + len-1)。最简单的方法是在指定常量时看到这一点,其中子类型中不需要范围:
constant SOME_CONSTANT : std_logic_vector := x"00";

在这里,如果您检查 SOME_CONSTANT 的范围,您将看到它的范围(0 到 7)。这是因为 std_logic_vector 被声明为:

type std_ulogic_vector is array(natural range <>) of std_logic;

'natural的低值为0,即起点。

假设你有点疯狂,这是:

type my_crazy_array_t is array(std_logic range <>) of integer;

并且您声明了一个常量:

constant CRAZY : my_crazy_array_t := (0, 22);

结果是:

CRAZY('U') = 0
CRAZY('X') = 22
CRAZY'left = 'U'
CRAZY'right = 'X'
CRAZY'low = 'U'
CRAZY'high = 'X'

因为'U'std_logic 的低值,后跟“X”。

对于其他问题,这一切都有效,因为 VHDL 始终是上下文驱动的,并且对于数组,只要长度匹配,生成的数组始终可以从“左”映射到“右”。在您的示例中,长度是正确的,并且从声明中知道子类型,因此可以按照您指定的方式进行映射。

注:(4 downto -1 => '0');是非法的,因为 -1 不是 std_logic_vector 的有效索引值,因此您会收到错误(可能来自 & 函数,因为它无法计算出您的意思是什么类型,因为它不能是 std_logic_vector)。

  • 区别在于第一个是2位和6位位串的串联,第二个是完整的8位位串。您使用哪种可能是风格问题。但通常,为此,我会使用文字,例如:constant c : std_logic_vector(7 downto 0) := x"C0";您使用什么以及何时使用可能取决于用户最清楚的内容。
  • 关于arrays - 在 VHDL 中初始化数组 : How exactly does it work?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64153581/

    相关文章:

    python 文件串联和组合文件

    c - 无法将生成的值从 for 循环传递到结构

    syntax-error - VHDL代码第二个处理中的语法错误

    javascript - 如何在 sails.js 模型中使用数组属性

    javascript - 在 Javascript 中将对象键从一个对象映射/过滤到一个新对象

    c++ - 在 boolean 数组中输入

    arrays - 数组索引为宽数组

    c++ - 删除动态数组?

    python - 在 Python 3 中连接字符串与数学符号

    if-statement - VHDL - "Input is never used warning"