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.
"if unsigned(vertor) > 0!" - Die Synthese wird aber auch bits verodern.
if vector /= "0000000000000000" then ausgang <= '1'; else ausgang <= '0'; end if; Daniel
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';
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.
> 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 ? :-)
>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.
Extrakt jetzt im wiki: http://www.mikrocontroller.net/articles/VHDL_schnipsel_or_vectorbits Bitte bei Gelegenheit drüber schauen
...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
Ich hab Diplom in ET(Uni) und arbeite seit etlichen Jahren entgeldlich mit FPGA: http://www.mikrocontroller.net/articles/Forum-Teilnehmer
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.
-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 !)
#-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.
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.
#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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.