【问题标题】:compiling fphdl in Altera Quartus Prime在 Altera Quartus Prime 中编译 fphdl
【发布时间】:2016-02-27 13:17:03
【问题描述】:

我尝试编译使用 fphdl 库 http://www.eda.org/fphdl/ 进行浮点运算的设计。而在modelsim中仿真很好,在Quartus hdl编译器中合成时报错:

result := to_integer (fract (frac'high downto frac'high-base))

with reason: '表达式不是常量' 通过查看类似的帖子,我了解到该编译器不喜欢 frac'high-base 不受限制。我尝试将所有相关信号约束如下:

variable frac    : UNSIGNED (23 downto 0);  
variable base    : INTEGER range 0 to 23;

但错误仍然存​​在... 在 hdl 级别或 Quartus 本身中是否有任何解决方法?

【问题讨论】:

    标签: vhdl point floating quartus


    【解决方案1】:

    请注意,错误消息显示:

    表达式不是常量

    而不是:

    ... 受限

    所以错误信息的原因是当fract的范围在运行时是可变的,而不是在细化时固定时,无法合成to_integer函数。

    Quartus 的解决方法是:

    variable part : UNSIGNED(23 downto 0);
    ...
    part := (others => '0');
    part(base downto 0) := frac(frac'high downto frac'high - base);
    result := to_integer(part);
    

    然后从frac 提取的部分进行零扩展,然后固定给to_integer 的向量长度,从而允许Quartus 综合。

    【讨论】:

    • 这似乎有效。我试图做类似的事情,但可能我没有正确声明临时部分变量并且错误正在转移到该语句......但是您的代码通过了综合。谢谢!
    【解决方案2】:

    问题中的代码片段似乎与 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 循环给出相同的结果并且应该产生相同的硬件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多