VHDL: Vektor mit OR zusammenfassen

Gast #389992
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.
Gast #389995
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';
Gast #389996
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.
Gast #389997
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 ? :-)
Gast #389998
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.
Gast #390003
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.
Gast #390004
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 !)
Gast #390005
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.
Gast #390006
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.
Gast #390007
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.
Gast #390008
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren