Generisches oder

Gast #889549
Lesenswert?
• ▲
▼
Wie bilde ich ein generisches Oder ?
Es existiert ein "std_logic_vector(0 bis Ende)" wobei "Ende" generisch 
festgelegt wird. Nun möchte ich eine '1' erhalten wenn ein einzelnes Bit 
des Vektors auf '1' gesetzt ist.
Geht es vielleicht auch mit "when" oder nur mit einer for-Schleife ?

ausgang <= '1' when vector ???????

Danke
Gast #889562
Lesenswert?
• ▲
▼
:HDLParsers:3236 - "E:/Programmieren/VHDL/EDA Design/Xilinx ISE
   Projekte/Enigma/Enigma.vhd" Line 176. Can not determine the "others" 
values
   in aggregate. (LRM 7.3.2.2)

Ist kein Array. Heisst nur so.

signal error_array : std_logic_vector(0 to number_of_rotors_array - 1) 
:= (others => '0');
Gast #889771
Lesenswert?
• ▲
▼
Geht es vielleicht so:
1
constant zero_array_c : std_logic_vector(0 to number_of_rotors_array - 1) := (others => '0'); 
2

3
signal error_array : std_logic_vector(0 to number_of_rotors_array - 1) := (others => '0');
4

5
...
6

7
when error_array /= zero_array_c?

Rick
Gast #889794
Lesenswert?
• ▲
▼
...
when vector /= (others => '0') ..
...

kann nicht funktionieren, denn sonst müsste Typ von (others => '0')
aus dem Operator /= abgeleitet werden, der den Typ wiederum aus vector
ableitet, das funktioniert aber nur bei Zuweisungen. In VHDL müssen
aber Typen vorab bekannt sein, (others => '0') ist typlos und wird
erst bei Zuweisung (nicht bei Vergleichen) typisiert.
Gast #889824
Lesenswert?
• ▲
▼
Stimmt, geht.
Und lustig geht es weiter.
Alternativ könnte man auch ein wiredOr als Auflösungsfunktion verwenden.
So oder so ähnlich.

-- function wired_or (inputs: bit_vector) return bit is
    -- constant float_value: bit := '0';
  -- begin
    -- if inputs'length = 0 then -- keine treiber aktiv
      -- return float_value;
    -- else
      -- for i in inputs'range loop
        -- if inputs(i) = '1' then
          -- return '1';
        -- end if;
      -- end loop;
      -- return '0';
    -- end if;
  -- end function wired_or;

  -- subtype bus_bit is wired_or bit;
  -- signal a : bus_bit;

Aber wann nimmt man ein logisches Oder und wann ein Wired-Or ?
Zusammenschalten oder verknoten ?

Entweder es geht und wir wissen nicht warum.
Oder es geht nicht und wir wissen warum.
Gast #889831
Lesenswert?
• ▲
▼
Fragt sich nur, wie "knote" ich jetzt die Datenausgabe zusammen ?
Wie gesagt, die Anzahl der rotoren ist generisch.

type array_of_std_logic_vector is array (0 to number_of_rotors_array-1) 
of std_logic_vector(0 to data_width_array-1);
signal data_out_array       : array_of_std_logic_vector;

Es soll nur ein std_logic_vector herauskommen.

data_out : out std_logic_vector(0 to data_width - 1) := (others => '0');

Geht wohl nur über einen Prozeß ?
So einfach mit when lässt sich das wohl nicht verdrahten ?

Na da habe ich mir ja was feines als Übungsaufgabe ausgesucht

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.