VHDL: bits OR-ing d'un vecteur ensemble

11

Je veux OU les bits d'un vecteur ensemble. Donc, disons que j'ai un vecteur appelé example(23 downto 0)et que je veux OU tous les bits dans un autre vecteur, y a-t-il un moyen de le faire qui n'implique pas d'aller example(0) or example(1) or ...example(23)?

motard de l'apocalypse
la source
Pourriez-vous simplement comparer à zéro à la place? Cela aurait le même effet.
David
Pour développer le commentaire de David (en utilisant un vecteur 32 bits): or_result <= '0' when input=X"00000000" else '1';Modifiez le nombre de zéros pour correspondre à la longueur du vecteur en question.
La réduction logique est disponible dans vhdl 2008, voir stackoverflow.com/questions/20296276/…
Moberg
1
Vous pouvez également utiliser de manière plus générale:result <= '0' when (example=(example'range=>'0')) else '1';
Miguel Risco

Réponses:

12

or_reduceest ce que vous voulez, et il est disponible en std_logic_misc. Pris en charge par A et X pour les FPGA.

Aaron D. Marasco
la source
and_reduceest l'autre utile.
Aaron D. Marasco
5

Verilog a un "opérateur de réduction" pratique qui fait exactement ce que vous demandez: |example[23:0]donne le résultat de OU sur tous les bits du examplevecteur.

Malheureusement, VHDL n'a pas cet opérateur. Cependant, selon la FAQ comp.lang.vhdl

Il n'y a pas d'opérateur VHDL prédéfini pour effectuer une opération de réduction sur tous les bits du vecteur (par exemple, "ou" tous les bits d'un vecteur). Cependant, les opérateurs de réduction peuvent être facilement mis en œuvre:

[sauter un exemple qui ne gère pas les valeurs «X» et «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 ); 
Le photon
la source
Celui qui a voté en bas, veut expliquer pourquoi?
The Photon
Est-ce synthétisable?
Johannes Schaub - litb
@ JohannesSchaub-litb, bien sûr, il peut être synthétisé en une très grande porte OU (ou un arbre de plus petites). Il est possible que la version de la bibliothèque standard (dans la réponse d'Aaron D. Marasco) soit mieux optimisée que quelque chose généré à la volée.
The Photon
VHDL-2008 possède des opérateurs de réduction unaires. La FAQ est obsolète. De plus, la fonction présentée est d'une synthétisabilité douteuse en raison de la sortie précoce sur laquelle certains outils peuvent s'étouffer et n'est pas nécessaire autrement que comme une micro-optimisation pour la simulation.
KevinThibedeau