Есть ли какой-нибудь способ найти первый бит 1? - PullRequest
0 голосов
/ 06 апреля 2020

Я хочу показать вам упомянутую проблему с заголовком в функции.

finding_first_one(signal a : std_logic_vector(...)) { return bit_number }

То есть, скажем, у нас есть сигнал «10010100», затем возвращаемое значение, bit_number, должно быть 2. Есть ли короткий способ найти его за один цикл. Я не хочу сканировать все биты за такт.

1 Ответ

1 голос
/ 06 апреля 2020

Вы можете сделать для l oop в вашей функции.
Имейте в виду, что для l oop не всегда можно реализовать на аппаратном уровне и что он может использовать LOT logi c elements.
Попробуйте что-то вроде этого (не проверено). index должно быть равно 2 в одном такте.

architecture behav of test is

  signal sig    : std_logic_vector(15 downto 0) := x"2224";
  signal index  : integer;

  function finding_first_one (signal a : std_logic_vector()) return integer is
  begin    
    for i in a'low to a'high loop
      if a(i) = '1' then
        return i;
      end if;
    end loop;    
    -- all zero
    return -1;
  end function;

begin

  process (CLK)
  begin
    if rising_edge(clk) then
      index <= finding_first_one(sig);
    end if;
  end process;

end architecture;
...