问题中的代码片段似乎与 fphdl 包没有直接关系。它不依赖于其中任何一个声明的任何类型。
该表达式给出了来自frac 的整数result,精度为frac'HIGH - base“位”。
原始表达式的等价物可能是:
variable dist: integer range 0 to 23;
dist := frac'HIGH - base;
result := to_integer (SHIFT_RIGHT(frac, dist));
SHIFT_RIGHT 来自 IEEE 库包 numeric_std,因为frac 是无符号的。
精明的观察者可能会注意到,这相当于整数除以 2 的幂,这通常由综合支持,提供或多或少相同的硬件。
关于这里,您可能会认为您的语句是一个多路复用器,其移位输入是零填充的,整个事情都需要优化。
提供了历史上的 IEEE Std 1076.6-2004(已撤回)8.6.5 切片名称 -
对于作为切片名称一部分出现的离散范围,离散范围的边界应直接或间接指定为属于整数类型的静态值。
Morten 告诉我们 Quartus Prime 可以处理
part := (others => '0');
part(base downto 0) := frac(frac'high downto frac'high - base);
result := to_integer(part);
base 不是静态的(尽管您认为它应该受到限制)。
对于那些不能处理非静态离散范围的综合工具,可以在 for 循环中完成相同的事情,具体取决于循环参数这是展开循环中的常数: p>
part := (others => '0');
for i in part'range loop
if i = b then
part(i downto 0) := frac(frac'high downto frac'high - i);
end if;
end loop;
result := to_integer(part);
IEEE Std 1076=2008 10.10 循环语句告诉我们:
对于具有 for 迭代方案的循环语句,循环参数 规范是具有给定标识符的循环参数的声明。 loop 参数是一个对象,其类型是离散范围的基本类型。在语句序列中,循环参数是一个常量。
for 循环给出相同的结果并且应该产生相同的硬件。