VHDL: OR-IN-биты вектора вместе

11

Я хочу или биты вектора вместе. Скажем, у меня есть вектор, который я назвал, example(23 downto 0)и я хочу перевести все биты в другой вектор, есть ли способ сделать это, не включающий переход example(0) or example(1) or ...example(23)?

байкер апокалипсиса
источник
Не могли бы вы вместо этого просто сравнить с нулем? Это будет иметь тот же эффект.
Дэвид
Чтобы расширить комментарий Дэвида (используя 32-битный вектор): or_result <= '0' when input=X"00000000" else '1';Измените число нулей, чтобы они соответствовали длине рассматриваемого вектора.
Логическое сокращение доступно в vhdl 2008, см. Stackoverflow.com/questions/20296276/…
Моберг
1
Также вы можете использовать более общий способ:result <= '0' when (example=(example'range=>'0')) else '1';
Мигель Риско

Ответы:

12

or_reduceэто то, что вы хотите, и это доступно в std_logic_misc. Поддерживается A и X для FPGA.

Аарон Д. Мараско
источник
and_reduceдругой полезный.
Аарон Д. Мараско
5

В Verilog есть удобный «оператор редукции», который делает именно то, что вы просите: |example[23:0]дает результат ИЛИ для обработки всех битов exampleвектора.

К сожалению, VHDL не имеет этого оператора. Согласно comp.lang.vhdl FAQ , хотя

Не существует предопределенного оператора VHDL для выполнения операции сокращения для всех битов вектора (например, для «или» всех битов вектора). Однако операторы сокращения могут быть легко реализованы:

[пропуская пример, который не обрабатывает значения 'X' и 'Z']

    function or_reduce( V: std_logic_vector )
                return std_ulogic is
      variable result: std_ulogic;
    begin
      for i in V'range loop
        if i = V'left then
          result := V(i);
        else
          result := result OR V(i);
        end if;
        exit when result = '1';
      end loop;
      return result;
    end or_reduce;
    ...
    b <= or_reduce( b_vec ); 
Фотон
источник
Кто бы ни проголосовал, хотите объяснить, почему?
Фотон
Это синтезируемый?
Йоханнес Шауб -
@ JohannesSchaub-litb, конечно, его можно синтезировать в действительно большие логические элементы ИЛИ (или в дерево меньших). Возможно, версия в стандартной библиотеке (в ответе Аарона Д. Мараско) будет лучше оптимизирована, чем то, что генерируется на лету.
Фотон
У VHDL-2008 есть унарные операторы редукции. FAQ устарел. Кроме того, представленная функция имеет сомнительную синтезируемость из-за раннего выхода, который могут подавиться некоторыми инструментами, и не является необходимой, кроме как в качестве микрооптимизации для моделирования.
Кевин Тибедо