1

我想实现用于 256 位向量的汉明权重计算的 K&R 算法。我在 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 行是 - while (val > 0) 循环

4

2 回答 2

3

因此,我将忽略实际符合时间安排的事情(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 代码设计的算法通常在硬件中表现不佳,因为硬件具有与固定处理器不同的功能。

于 2013-02-09T19:17:25.707 回答
3

您需要了解 asignal和之间的区别variable

当您分配给 a 时,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;
于 2013-02-11T14:17:30.723 回答