如何解决在VHDL中初始化数组:它是如何工作的?
请考虑以下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');
我的意思是:您是否有任何理由想要/需要编写前者(后者似乎更容易出错,因为如果例如交换2个聚合,它将产生意想不到的结果)?还是只是口味问题?
解决方法
- 让我们从文字开始。当您指定文字时,默认范围是(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";
您使用什么以及何时使用,取决于用户最清楚的内容。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。