Xilinx 迭代错误:循环已迭代 64 次。使用“set -loop_iteration_limit XX”迭代更多

问题描述 投票:0回答:1

我想用以下代码描述一个二进制到bcd转换器:

`图书馆 IEEE; 使用 IEEE.STD_LOGIC_1164.ALL; 使用 IEEE.NUMERIC_STD.ALL;

实体主要是 港口 ( BIN :在 STD_LOGIC_VECTOR 中(7 降到 0); BCDu : out STD_LOGIC_VECTOR(3 降到 0); BCDd : 输出 STD_LOGIC_VECTOR(3 降到 0); BCDc :输出 STD_LOGIC_VECTOR(3 降至 0) ); 最终实体 MAIN;

MAIN 的架构行为是 开始 进程(BIN) 变量 aux :natural := to_integer(unsigned(BIN)); 变量 uni : 自然 := 0; 变量 dec : 自然 := 0; 变量 cent : 自然 := 0;

begin
    if(aux < 256) then
        while(aux > 99) loop
            aux := aux - 100;
            cent := cent + 1;
        end loop;

        while(aux > 9) loop
            aux := aux - 10;
            dec := dec + 1;
        end loop;
    end if;

    uni := aux;

    BCDu <= std_logic_vector(to_unsigned(uni, 4));
    BCDd <= std_logic_vector(to_unsigned(dec, 4));
    BCDc <= std_logic_vector(to_unsigned(cent, 4));
end process; 

最终架构行为; ` 但出现如下错误: “循环已经迭代了 64 次。使用“set -loop_iteration_limit XX”迭代更多。”

我不知道为什么会出现这个错误,我有两次,总共有7次迭代

vhdl hardware-design
1个回答
0
投票

VHDL 是一种硬件描述语言,而不是一种过程语言。在模拟中,循环的步骤是逐一执行的,而在硬件上,循环是展开的,使得整个事情是并行计算的。在您的情况下,循环可能必须有专用于 x 从 0 到 255 的所有可能值的门,因为综合引擎不够智能,无法意识到循环最多只能运行 7 次。这可能可以通过在另一个变量中预先计算循环迭代来解决。类似的解决方案是使用除法和模来完全消除循环。

但是,最好的解决方案是使用 7 个链式单步 BCD 转换模块,无需经过任何流程即可最大程度地减少所用门的数量。在每个模块中,如果 4 位输入至少为 5,则将 3 添加到输出,并且其输出移位一位,以便在下一阶段之前引入原始输入的一个新位。因此,第一个模块对 3 位进行操作以产生 4 位,并且仅当前一个模块至少有 3 位之后才使用该模块。 5 和 3 是其中的特殊数字,因为在下一次移位之后,5 变成 10,3 变成使 10 等于 16 所需的额外 6,即 4 位数字(十六进制)的基数。加 3 将额外的 10 带到下一个数字,因为二进制 16 在下一个数字中变成 1。

© www.soinside.com 2019 - 2024. All rights reserved.