-->

非静态循环超出限制(Non-static loop limit exceeded)

2019-10-17 17:15发布

我想要实现的K&R算法汉明权重计算256位向量的。 我写我的代码的VHDL为:

entity counter_loop is
    Port ( dataIn : in  STD_LOGIC_VECTOR (255 downto 0);
              dataOut : out STD_LOGIC_VECTOR (8 downto 0);
           threshold : in  STD_LOGIC_VECTOR (8 downto 0);
           clk : in  STD_LOGIC;
           flag : out  STD_LOGIC);
end counter_loop;

architecture Behavioral of counter_loop is
    signal val : STD_LOGIC_VECTOR (255 downto 0) := X"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
begin
    process (clk)
        variable count : STD_LOGIC_VECTOR (8 downto 0):= "000000000";       
    begin
        flag <= '0';
        val <= dataIn;
        --if(clk'event and clk = '1') then 
            while (val > 0) loop
                count := count+1;
                val <= (val and (val-1));
                if (count > threshold) then
                    flag <= '1';
                end if;
            end loop;
                dataOut <= count;
        --end if;
    end process;
end Behavioral;

但是,尽管采用Xilinx合成它,在错误出现如

53号线:非静态循环超出限制

任何线索请?

PS:行53是 - 而(值> 0)循环

Answer 1:

所以,我打算忽略的东西实际上是在满足时序问题( val - 1昂贵)和实际谈谈你的逻辑。

下面是一段代码的:

signal val : std_logic_vector(255 downto 0) := (others => '1');

process (clk)
begin
    while (val > 0) loop
        val <= (val and (val-1));
    end loop;
end process;

val是一个信号,而不是一个变量。 这意味着,当你完成增量周期将被更新。 在这种情况下,将是永远。 所以,你有一个无限循环。


如果你只是想计算数量的popcount,那么你为什么不只是这样做。 虽然我怀疑这将满足时间以及(可能需要打破它在多个时钟周期)。

process (clk)
    variable count : std_logic_vector(8 downto 0) := "0" & x"00";
begin
    if rising_edge(clk) then
        for i in dataIn'range loop
            if dataIn(i) = '1' then
                count := count + 1;
            end if;
        end loop;

        dataOut <= count_i;
    end if;
end process;

最后,大多数人会认为,专为C代码算法通常在硬件表现不佳,因为硬件已经不是一个固定的处理器不同的能力。



Answer 2:

你需要学习有关的区别signalvariable

当你分配到signal只安排在哪个时间推移(在你们这样一个计时过程中的下一个点的变化,这是当你的过程中获取到结束,所有正在安排执行其他进程有太)。

所以,当你写val <= something在过程中循环, val是永远只能被调度进行更新。 当进程检查的值val它看到的当前值,而不是预定的一个。 你需要使用一个变量来跟踪的东西这种方式。

然而,正如其他地方所指出的,如果你只是想算的,它更容易:

count:=0;
for i in dataIn'range loop
   if dataIn(i) = '1' then 
      count:=count+1; 
   end if;
end loop;


文章来源: Non-static loop limit exceeded
标签: vhdl xilinx