需要在vhdl中计算常量名称

时间:2017-04-19 13:58:47

标签: vhdl

我有一个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;

2 个答案:

答案 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类型值转换为/从整数类型转换。