我有一个constant
对象列表,如下所示。他们是
record
类型。我正在尝试运行loop
,我可以逐个访问它们。有人可以建议一种方法吗?
type objecttype is record
id, x_start, x_end, y_start, y_end : integer;
end record objecttype;
constant C_OBJ1: objecttype :=(id => 0,
x_start => 200,
x_end => 300);
constant C_OBJ2: objecttype :=(id => 0,
x_start => 400,
x_end => 500);
我想做类似的事情:
for i in 0 to 5 loop
C_OBJ(i).........
end loop;
答案 0 :(得分:3)
制作一个对象数组。 E.g:
entity test_e is
end entity;
architecture test_a of test_e is
type objecttype is record
id, x_start, x_end, y_start, y_end : integer;
end record objecttype;
type objectarray is array (natural range <>) of objecttype;
constant C_OBJ : objectarray(0 to 5) := (
(1, 2, 3, 4, 5),
(1, 2, 3, 4, 5),
(1, 2, 3, 4, 5),
(1, 2, 3, 4, 5),
(1, 2, 3, 4, 5),
(1, 2, 3, 4, 5)
);
begin
end architecture;
答案 1 :(得分:0)
IEEE Std 1076-2008 5.3.2阵列类型,5.3.2.1第1段(部分):
数组对象是由具有相同子类型的元素组成的复合对象。数组元素的名称使用属于指定离散类型的一个或多个索引值。 ...
这里的关键是所有记录命名的元素都是相同的类型。
这里使用记录类型可能源于面向对象的范例(使用字段名称来传达VHDL中真正应该是用户定义属性的含义,但不符合要求)。
为数组类型和a创建枚举索引类型 使用索引类型的数组类型:
package foo is
type indx is (id, x_start, x_end, y_start, y_end);
type objecttype is array (indx range id to y_end) of integer;
constant C_OBJ1: objecttype := (id => 0,
x_start => 200,
x_end => 300,
y_start => 0,
y_end => 0);
constant C_OBJ2: objecttype := (id => 0,
x_start => 400,
x_end => 500,
y_start => 0,
y_end => 0);
end package foo;
use work.foo.all;
entity fum is
end entity;
architecture fie of fum is
begin
process
begin
for i in objecttype'range loop
report "C_OBJ1(" & indx'image(i) & ") = " &
integer'image(C_OBJ1(i));
end loop;
wait;
end process;
end architecture;
请注意,预定义属性'image
适用于任何标量类型(包括离散类型)或子类型,并且枚举类型符合条件。循环参数范围是数组类型的对象的范围。
这就是:
ghdl -r fum
fum.vhdl:25:13:@ 0ms :(报告单):C_OBJ1(id)= 0
fum.vhdl:25:13:@ 0ms :(报告单):C_OBJ1(x_start)= 200
fum.vhdl:25:13:@ 0ms :(报告单):C_OBJ1(x_end)= 300
fum.vhdl:25:13:@ 0ms :(报告单):C_OBJ1(y_start)= 0
fum.vhdl:25:13:@ 0ms :(报告说明):C_OBJ1(y_end)= 0
跑步时。
它还暗示您将作为索引名称而不是选定名称访问数组的元素:C_OBJ1(id),C_OBJ1(x_start),...
您可以使用预定义属性'pos
和'val
将indx类型值转换为/从整数类型转换。