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


von Martin Kohler (Gast)


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.

von Jürgen Schuhmacher (Gast)


Lesenswert?

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

von Daniel R. (daniel_r)


Lesenswert?

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


Daniel

von FPGAküchle (Gast)


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

von Martin Kohler (Gast)


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.

von Jürgen Schuhmacher (Gast)


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 ? :-)

von Tobias O. (Gast)


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.

von Daniel R. (daniel_r)


Lesenswert?

Ihr bietet wohl nur mehr Code als Funktionalität ;)

von FPGAküchle (Gast)


Lesenswert?

Extrakt jetzt im wiki:
http://www.mikrocontroller.net/articles/VHDL_schnipsel_or_vectorbits
Bitte bei Gelegenheit drüber schauen

von HomerS (Gast)


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

von FPGAküchle (Gast)


Lesenswert?

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

von T.M. (Gast)


Lesenswert?

Ich hab noch ne Variante ;-)
1
function or_all (inp : in std_logic_vector) return std_logic is
2
variable v : std_logic;
3
begin
4
  for i in inp'left to inp'right loop
5
    v := inp(i);
6
    exit when v = '1';        
7
  end loop;
8
  return v;
9
end function or_all;

Ungetestet, dürfte aber funzen.


T.M.

von FPGAküchle (Gast)


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 !)

von T.M. (Gast)


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.

von T.M. (Gast)


Lesenswert?

Fällt mir grad noch so ein, wegen dem 'Z':
1
function or_all (inp : in std_logic_vector) return std_logic is
2
  variable v : std_logic;
3
begin
4
  for i in inp'left to inp'right loop
5
    v := inp(i);
6
    exit when v = '1';
7
    v := '0';
8
  end loop;
9
return v;
10
end function or_all;

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


T.M.

von FPGAküchle (Gast)


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.

von T.M. (Gast)


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

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.