Forum: FPGA, VHDL & Co. Generisches oder


von Hans-Werner (Gast)


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

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

when vector /= (others => '0')?

von Hans-Werner (Gast)


Lesenswert?

Danke

von Hans-Werner (Gast)


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

von Rick Dangerus (Gast)


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

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

unsigned(error_array) /= 0 müsste auch gehen.

von Jörg (Gast)


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.

von Hans-Werner (Gast)


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.

von Hans-Werner (Gast)


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

von Rick Dangerus (Gast)


Lesenswert?

Welcher std_logic_vector soll denn rauskommen?
Nur einer? Dann wäre der Rest überflüssig.
Oder alle nacheinander? Dann brauchst Du einen Mux mit Zähler oder eine 
FSM.

Rick

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Jörg wrote:
> ...
> when vector /= (others => '0') ..
> ...
>
> kann nicht funktionieren

Stimmt, ist mir danach auch aufgefallen. Und dann habe ich mich auch 
daran erinnert dass es schon einen Artikel zu dem Thema gibt: [[VHDL 
schnipsel or vectorbits]]

von Hans-Werner (Gast)


Lesenswert?

Hallo Rick,

es soll nur einer rauskommen.
Also alle std_logic_vector´s in einem Array generischer Grösse Oder 
verknüpfen.

Bis dann

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.