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)?


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:



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 ); 

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.