在VHDL中,如何获取循环变量取值范围的上界?

编程语言 2026-07-07

我在VHDL中有一段简单的代码。我想获取for循环变量的最大值。

我本来打算用 'high 属性来取得 i 的最大值,甚至对 i 的范围应用 'range 属性,然后取得该范围的 'high

for i in 0 to 5 loop

    do_something;

    -- Approach 1
    report "loop is at " & integer'image(i) & "/" & integer'image(i'high);

    -- Approach 2
    report "loop is at " & integer'image(i) & "/" & integer'image(i'range'high);


end loop;

方法1 失败,因为 i 不是类型标记:

属性 "high" 的前缀(常量 "i")不是类型标记。

所以我猜需要对范围使用正确的属性并使其成为类型标记,然后就能访问high属性(方法2)。但接着我得到:

属性 "range" 的前缀必须对数组对象是合适的,或者必须表示一个数组子类型。

在VHDL中正确的做法是什么?这甚至可能吗?

(在我的示例中,我可以使用一个常量来替代 5 并使用它,但我在寻找更通用的方法——示例是故意尽量简短。)

解决方案

10.10循环语句

对于采用 for 迭代方案的循环语句,循环参数的规范是带有给定标识符的循环参数的声明。循环参数是一个对象,其类型是离散区间的基类型。

在这里,循环参数是在循环参数规范中的对象声明。它的子类型来自离散范围。

16.2.2类型和对象的预定义属性

attribute of a type

attribute of an object

一个最小、完整且可验证的示例:

entity am9417 is
end entity;

architecture foo of am9417 is

begin
    process
    begin
        for i in 0 to 5 loop

            -- do_something;

            -- Approach 1
            report "loop is at " & integer'image(i) & "/" & integer'image(i'high);

            -- Approach 2
            report "loop is at " & integer'image(i) & "/" & integer'image(i'range'high);


        end loop;
        wait;
    end process;
end architecture;

这取决于所使用的实现,可能会提供关于带有 'high 的对象的一些限制信息:

%: ghdl -a --std=08 am9417.vhdl
am9417.vhdl:14:77:error: object prefix must be an array
            report "loop is at " & integer'image(i) & "/" & integer'image(i'high);
                                                                            ^
am9417.vhdl:17:77:error: object prefix must be an array
            report "loop is at " & integer'image(i) & "/" & integer'image(i'range'high);
                                                                            ^
ghdl:error: compilation error
%:

存在一个对象的特定属性,它提供子类型,可以用作 'high 的前缀:

entity am9417 is
end entity;

architecture foo of am9417 is

begin
    process
    begin
        for i in 0 to 5 loop

            -- do_something;

            -- Approach 1
            report "loop is at " & integer'image(i) & "/" & integer'image(i'subtype'high);

        end loop;
        wait;
    end process;
end architecture;
%:
%: ghdl -a --std=08 am9417.vhdl
%:

这需要VHDL-2008。此外你还可以在循环参数规范中声明一个子类型,或使用另一个对象的范围。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章