【发布时间】:2016-04-08 20:41:26
【问题描述】:
我已经被这个问题困扰了几个小时了,我似乎无法通过搜索找到解决方案,即在这里或谷歌上都没有找到任何东西。
这是我的一段代码:
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.numeric_std;
USE work.arrays.ALL;
ENTITY parallel IS
PORT (clk:IN std_logic; text:IN INT_ARRAY(119 DOWNTO 0); result:OUT INT_MATRIX_2D);
END parallel;
ARCHITECTURE arch OF parallel IS
COMPONENT unit_comparator IS
PORT (letter:IN integer; difference:OUT integer);
END COMPONENT;
SIGNAL temp: INT_MATRIX_2D := (others => (others => 0));
SIGNAL temp_differences: INT_ARRAY(119 DOWNTO 0) := (others => 0);
BEGIN
PROCESS(clk)
BEGIN
IF(rising_edge(clk))THEN
FOR index IN 119 TO 1 LOOP
temp(temp_differences(index))(temp_differences(index - 1)) <=
temp(temp_differences(index))(temp_differences(index - 1)) + 1;
END LOOP;
result <= temp;
END IF;
END PROCESS;
wiring_loop: FOR index IN 119 DOWNTO 0 GENERATE
wiring_unit: unit_comparator PORT MAP (text(index), temp_differences(index));
END GENERATE;
END arch;
你看到“FOR index IN 119 TO 1 LOOP”了吗?
编译器给出一个“Range 119 to 0 is Null”警告(毫无疑问,整个事情都不能正常工作),我似乎有一个问题的理解。如果在循环的每一步都有一个整数分配给“索引”,它怎么会变成空(它说它在每一步都发生!)。我需要一个坚定的理解,而不是一个简单的解决方案。 (注意:所有使用的模块和包都经过测试并且可以正常工作!)
谢谢!
【问题讨论】:
-
Google 在“VHDL 空范围”上的第一个命中(对我而言)是this nice explanation from Sigasi。您的示例也不完整(因为缺少包
arrays)也不是最小的(因为不必要的组件/实例化)。 -
IEEE Std 1076-2008 5.2.1(标量类型):“范围指定标量类型值的子集。如果指定的子集为空,则称范围为空范围。 L 到 R 的范围称为升序范围;如果 L > R,则该范围为空范围。从 L 到 R 的范围称为降序范围;如果 L 左边界,R称为范围的右边界。"这不是错误,请参阅 11.8 Generate statements,第 4 段:“generate 参数是一个常量对象,其类型是离散范围的基本类型......”。