VHDL: ODER-Verknüpfung von Bits eines Vektors

Ich möchte die Bits eines Vektors ODER miteinander verknüpfen. Angenommen, ich habe einen Vektor namens example(23 downto 0)und ich möchte alle Bits in einen anderen Vektor ODER, gibt es eine Möglichkeit, dies zu tun, die nicht das Gehen beinhaltet example(0) or example(1) or ...example(23)?

Könnten Sie stattdessen einfach mit Null vergleichen? Das hätte den gleichen Effekt.
Um Davids Kommentar zu erweitern (unter Verwendung eines 32-Bit-Vektors): or_result <= '0' when input=X"00000000" else '1';Ändern Sie die Anzahl der Nullen, um sie an die Länge des betreffenden Vektors anzupassen.
Die Logikreduzierung ist in vhdl 2008 verfügbar, siehe stackoverflow.com/questions/20296276/…
Sie können auch einen allgemeineren Weg verwenden:result <= '0' when (example=(example'range=>'0')) else '1';

Antworten (2)

or_reduceist, was Sie wollen, und es ist verfügbar in std_logic_misc. Unterstützt von A und X für FPGAs.

and_reduceist die andere nützliche.

Verilog hat einen praktischen "Reduktionsoperator", der genau das tut, wonach Sie fragen: |example[23:0]Er gibt das Ergebnis der ODER-Verknüpfung aller Bits des exampleVektors.

Leider hat VHDL diesen Operator nicht. Laut der FAQ zu comp.lang.vhdl

Es gibt keinen vordefinierten VHDL-Operator, um eine Reduktionsoperation an allen Bits eines Vektors durchzuführen (z. B. um alle Bits eines Vektors zu "odern"). Die Reduktionsoperatoren lassen sich jedoch leicht implementieren:

[Überspringen eines Beispiels, das keine 'X'- und 'Z'-Werte verarbeitet]

    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 ); 
Ist das synthetisierbar?
@JohannesSchaub-litb, natürlich kann es zu einem wirklich großen ODER-Gatter (oder einem Baum kleinerer) synthetisiert werden. Möglicherweise ist die Version in der Standardbibliothek (in der Antwort von Aaron D. Marasco) besser optimiert als etwas, das im laufenden Betrieb generiert wird.
VHDL-2008 hat unäre Reduktionsoperatoren. Die FAQ ist veraltet. Darüber hinaus ist die vorgestellte Funktion aufgrund des frühen Ausstiegs, an dem sich einige Tools verschlucken können, von fragwürdiger Synthetisierbarkeit und ist außer als Mikrooptimierung für die Simulation nicht erforderlich.