mikrocontroller.net

Forum: FPGA, VHDL & Co. Generisches oder


Autor: Hans-Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
when vector /= (others => '0')?

Autor: Hans-Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke

Autor: Hans-Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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');

Autor: Rick Dangerus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geht es vielleicht so:
constant zero_array_c : std_logic_vector(0 to number_of_rotors_array - 1) := (others => '0'); 

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

...

when error_array /= zero_array_c?

Rick

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

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

Autor: Jörg (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hans-Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hans-Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rick Dangerus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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]]

Autor: Hans-Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.