VHDL: OR-ing bits de um vetor juntos

11

Eu quero OU os bits de um vetor juntos. Então, digamos que eu tenha um vetor chamado example(23 downto 0)e que eu queira OU todos os bits em outro vetor, existe alguma maneira de fazer isso que não envolva ir example(0) or example(1) or ...example(23)?

motociclista do apocalipse
fonte
Você poderia simplesmente comparar com zero? Isso teria o mesmo efeito.
David
Para expandir o comentário de David (usando um vetor de 32 bits): or_result <= '0' when input=X"00000000" else '1';Altere o número de zeros para corresponder ao comprimento do vetor em questão.
A redução da lógica está disponível no vhdl 2008, consulte stackoverflow.com/questions/20296276/…
Moberg:
11
Além disso, você pode usar uma maneira mais geral:result <= '0' when (example=(example'range=>'0')) else '1';
Miguel Risco

Respostas:

12

or_reduceé o que você deseja e está disponível em std_logic_misc. Suportado por A e X para FPGAs.

Aaron D. Marasco
fonte
and_reduceé o outro útil.
Aaron D. Marasco
5

O Verilog possui um "operador de redução" conveniente que faz exatamente o que você está solicitando: |example[23:0]fornece o resultado de OR'ing de todos os bits do examplevetor.

Infelizmente o VHDL não possui esse operador. De acordo com a FAQ do comp.lang.vhdl , embora

Não há operador VHDL predefinido para executar uma operação de redução em todos os bits do vetor (por exemplo, para "ou" todos os bits de um vetor). No entanto, os operadores de redução podem ser facilmente implementados:

[pulando um exemplo que não lida com os valores 'X' e '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 ); 
O fóton
fonte
Quem votou mal, gostaria de explicar o porquê?
The Photon
Isso é sintetizável?
Johannes Schaub - litb
@ JohannesSchaub-litb, é claro, pode ser sintetizado em um portão OR realmente grande (ou em uma árvore de outros menores). Possivelmente, a versão na biblioteca padrão (na resposta de Aaron D. Marasco) será melhor otimizada do que algo gerado em tempo real.
O Photon
O VHDL-2008 possui operadores de redução unários. O FAQ está desatualizado. Além disso, a função apresentada é de sintetizável questionável por causa da saída antecipada na qual algumas ferramentas podem engasgar e não é necessária a não ser como uma micro otimização para simulação.
KevinThibedeau