mikrocontroller.net

Forum: FPGA, VHDL & Co. VHDL: Vektor mit OR zusammenfassen


Autor: Martin Kohler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Wahrscheinlich stehe ich auf der Leitung...

Wie fasse ich einen STD_LOGIC_VECTOR(15 downto 0) so zusammen, dass das
Ausgangssignal '1' ist, sobald eines der Vektor-Bits auf '1' ist?
Also eine OR-Verknüpfung über den ganzen Vektor?

Kann mir da jemand helfen?

Ein OR von allen einzelnen Bits kann es ja wohl nicht sein:
out_sig <= '1' when in(0) or in(1) or ... in(15) else '0';

Da müsste es doch eine einfachere Schreibweise geben.
Danke für die Antworten.

Autor: Jürgen Schuhmacher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"if unsigned(vertor) > 0!" - Die Synthese wird aber auch bits
verodern.

Autor: Daniel R. (daniel_r)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if vector /= "0000000000000000" then
   ausgang <= '1';
else
   ausgang <= '0';
end if;


Daniel

Autor: FPGAküchle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Als kombinatorischer process?

signal vector_or: std_logic;

process(oder_vector)
variable V_or_tmp;
begin
v_or_tmp := '0';
for i in oder_vector'range loop
 v_or_tmp := v_or_tmp or oder_vector(i);
end loop;
vector_or <= v_or_tmp
end process;

oder mit einen Vergleich auf alle bits Null:

vector_or <= '0' when oder_vector = X"0000" else '1';

Autor: Martin Kohler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank!
Dacht ich mirs doch, dass es eine einfache Schreibweise gibt.
Dass die Synthese OR draus macht ist schon klar, schliesslich ist das
ja auch der Sinn der Sache - nur will ichs nicht einzeln schreiben.

Das Thema ist damit erledigt, danke.

Autor: Jürgen Schuhmacher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> process(oder_vector)
> variable V_or_tmp;
> begin
>   v_or_tmp := '0';
>   for i in oder_vector'range loop
>     v_or_tmp := v_or_tmp or oder_vector(i);
>   end loop;
>   vector_or <= v_or_tmp
> end process;

Wer bietet mehr ? :-)

Autor: Tobias O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>ARCHITECTURE structure OF or_test IS
>function or_all (inp : in std_logic_vector) return std_logic is
>variable v : std_logic;
>begin
>  v := inp(inp'left);
>  for i in inp'left to inp'right loop
>    v := v or inp(i);
>  end loop;
>  return v;
>end function or_all;

>constant inp : std_logic_vector(0 to 11) := X"010";
>signal er : std_logic;
>BEGIN
>  er <= or_all(inp);
>END ARCHITECTURE structure;

Ein etwas anderer Ansatz als Funktion. Finde ich auch nicht schlecht
:=) wer bietet mehr.

Autor: Daniel R. (daniel_r)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ihr bietet wohl nur mehr Code als Funktionalität ;)

Autor: FPGAküchle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Extrakt jetzt im wiki:
http://www.mikrocontroller.net/articles/VHDL_schni...
Bitte bei Gelegenheit drüber schauen

Autor: HomerS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...nur mal so als Frage.

FPGAküchle ..Du bist aber Naturwissenschaftler, also TH/TU oder so?


Ich will es nur wissen, ohne Diskussion auszulösen.

guude
ts

Autor: FPGAküchle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab Diplom in ET(Uni) und arbeite seit etlichen Jahren entgeldlich
mit FPGA:
http://www.mikrocontroller.net/articles/Forum-Teilnehmer

Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab noch ne Variante ;-)
function or_all (inp : in std_logic_vector) return std_logic is
variable v : std_logic;
begin
  for i in inp'left to inp'right loop
    v := inp(i);
    exit when v = '1';        
  end loop;
  return v;
end function or_all;

Ungetestet, dürfte aber funzen.


T.M.

Autor: FPGAküchle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
-Hm, was macht die Synthese aus dem "exit" ?

-was passiert wenn der vector nicht z.B. 0 to 15 sondern
 15 downto 0 definiert ist? funzt dann
das "for i in inp'left to inp'right loop", wenn da steht
 for i in 15 to 0 ?.

-was passiert wenn der Vector komplett 'Z' hat, dann gibt die
Funktion doch 'Z' zurück?


IMHO ein gutes beispiel das man in VHDL wie in C für CPU's schreiben
kann und welche Fragen sich für die synthese daraus ergeben.
(das ist echt konstruktiv gemeint, nicht sarkastisch !)

Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#-Hm, was macht die Synthese aus dem "exit" ?

Die Synthese wird das Ding für alle Bits synthetisieren, nehm ich mal
an... das exit wird nur relevant bei der Simulation. Aber warte, das
kann ich glei mal hier nachprüfen.

#-was passiert wenn der vector nicht z.B. 0 to 15 sondern
 15 downto 0 definiert ist? funzt dann
das "for i in inp'left to inp'right loop", wenn da steht
 for i in 15 to 0 ?.

Dürfte trotzdem gehen, um auf Nummer sicher zu gehen, kann man auch
inp'RANGE benutzen.

# -was passiert wenn der Vector komplett 'Z' hat, dann gibt die
Funktion doch 'Z' zurück?

Das Problem hat man bei den anderen For-Schleifen auch.


Danke für die Hinweise ;-)


T.M.

Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fällt mir grad noch so ein, wegen dem 'Z':
function or_all (inp : in std_logic_vector) return std_logic is
  variable v : std_logic;
begin
  for i in inp'left to inp'right loop
    v := inp(i);
    exit when v = '1';
    v := '0';
  end loop;
return v;
end function or_all;

Dürfte man so verhindern können...


T.M.

Autor: FPGAküchle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#das "for i in inp'left to inp'right loop", wenn da steht
# for i in 15 to 0 ?.

#Dürfte trotzdem gehen, um auf Nummer sicher zu gehen, kann man auch
#inp'RANGE benutzen.

nach meiner Erfahrung wird eine solsche schleife nicht ausgeführt,
sondern mit der Info "empty range" verworfen.  For x to y loop
meint aufwärts, also x kleiner gleich y. Modelsim kann mit einer Option
gezwungen werden, aus solche "leeren Bereiche" zu testen und eine
meldung zu produzieren. manche (alle(?)) "optimieren" sowas gnadenlos
weg.


Um diesen fallstrick zu vermeiden, verwendet man 'high und 'low (dann
ist die Richtung des feldindexes bei der definition egal). Oder man
verwendet 'range. Dabei ändert sich die Zählrichtung in der schleife
entsprechend der Richtung bei der Definition. Im beispiel ist aber egal
ob die Bits des Vector rechts oder von links beginnend geprüft.


-> diese empty ranges sind böse, hat mich schon etliches an debugging
gekostet.

Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit dem to und downto fällt mir auch grad auf. Das geht dann
natürlich nicht so.Wie gesagt, 'RANGE nehmen... Gefällt mir sowieso
besser, weil kürzer. War eher nen copy/paste von darüber.
Und es heisst auch nicht, dass ich den Code so verwenden würde, fiel
mir nur als weitere mögliche Variante ein ;-)

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.