在VHDL中,如何获取循环变量取值范围的上界?
我在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类型和对象的预定义属性
和
一个最小、完整且可验证的示例:
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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

