Forum: FPGA, VHDL & Co. VHDL: Auswerten variabler Zahl von Signalen in for-Schleife


von noips (Gast)


Lesenswert?

Hallo,

ich bitte um Durchsicht dieses Codes. Ich habe ihn aus einem VHDL-Buch 
übernommen und geändert.

Damit soll folgendes erreicht werden:
wenn alle Bits des Vektors rx_packet_rdy_s '1' sind, soll send_flag '1' 
werden, sonst soll send_flag '0' bleiben. Habe mein Design, das den Code 
enthält, schon synthetisiert und alles läuft wie erwartet (sieht bis 
jetzt zumindest so aus), aber so ganz sicher bin ich mir bei dem Code 
trotzdem nicht. Ist es in Ordnung so? Wenn nicht, wie macht man das 
richtig? Wenn ja, kann man das anders/besser machen?

Danke!

1
  
2
process ( rx_packet_rdy_s )
3
   variable flag : boolean;
4
begin                  
5
   flag := true;
6
   for a in 0 to SPI_NUMBER-1 loop
7
     if rx_packet_rdy_s(a) = '0' then
8
        flag := false;
9
     end if;
10
   end loop;
11
   if flag then send_flag <= '1';
12
   else send_flag <= '0';
13
   end if;
14
end process;

von D. I. (Gast)


Lesenswert?

1
send_flag <= '1' when (rx_packet_rdy_s = (SPI_NUMBER-1 downto 0 => '1')) else '0';

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

1
send_flag <= '1' when (rx_packet_rdy_s = (rx_packet_rdy_s'range => '1')) else '0';

von noips (Gast)


Lesenswert?

D. I. schrieb:

> (rx_packet_rdy_s = (SPI_NUMBER-1 downto 0 => '1'))

Was ist das für eine Bedingung?

von D. I. (Gast)


Lesenswert?

Lothar Miller schrieb:
> send_flag <= '1' when (rx_packet_rdy_s = (SPI_NUMBER-1 downto 0 => '1')) else 
'0';
> send_flag <= '1' when (rx_packet_rdy_s = (rx_packet_rdy_s'range => '1')) else 
'0';

Immerhin die gleiche Anzahl an Zeichen ...

von noips (Gast)


Lesenswert?

Lasst mich mal raten:

(SPI_NUMBER-1 downto 0 => '1') ist dasselbe wie "1111", wenn SPI_NUMBER 
= 3, richtig?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> (SPI_NUMBER-1 downto 0 => '1') ist dasselbe wie "1111", wenn
> SPI_NUMBER = 3, richtig?
Tendenziell richtig, aber es ist nur 3 Bits lang:  "111".
(2 downto 0) = 2,1 und 0...

http://www.lothar-miller.de/s9y/archives/28-Vektor-Vergleich.html

von noips (Gast)


Lesenswert?

Lothar Miller schrieb:
> aber es ist nur 3 Bits lang:  "111".

Stimmt, Denkfehler von mir! Hab gemeint, wenn SPI_NUMBER = 4.

Wenn das hier geht
> (rx_packet_rdy_s'range => '1')

dann soll theoretisch auch z.B. so was gehen (5 => '1'), ergibt dann 
"11111", oder?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

noips schrieb:
> dann soll theoretisch auch z.B. so was gehen (5 => '1'), ergibt dann
> "11111", oder?
Nein.
Denn ein range ist immer (a to b) oder (c downto d).

von noips (Gast)


Lesenswert?

OK, verstanden, bedanke mich!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Keine Ursache.

Da fällt mir noch was ein: mit 'range lassen sich ganz elegant Schleifen 
programmieren, bei denen egal ist, ob sie mit to oder downto 
signalen aufgerufen werden:
1
   process (rx_packet_rdy_s) begin
2
     send_flag <= '1';
3
     for a in  rx_packet_rdy_s'range  loop   -- Bitreihenfolge egal 
4
       if rx_packet_rdy_s(a) = '0' then
5
         send_flag <= '0';
6
         exit;
7
       end if;
8
     end loop;
9
   end process;

von noips (Gast)


Lesenswert?

Erinnert im Prinzip an meine allererste Version, nur ohne Variable und 
der Bereich für a anders angegeben. Was bewirkt hier "exit"? Kenne das 
im Zusammenhang mit VHDL noch gar nicht.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

noips schrieb:
> Was bewirkt hier "exit"?
Was legt der Name von exit nahe?

> Kenne das im Zusammenhang mit VHDL noch gar nicht.
Auch ich kenne einiges von VHDL noch nicht...  ;-)

von noips (Gast)


Lesenswert?

> Was legt der Name von exit nahe?

In C wird der Schleifendurchlauf abgebrochen, wenn eine Bedingung 
erfüllt ist. Aber in VHDL? Da gibt es meines Wissens keine 
Schleifendurchläufe in dem Sinne. Zumindest nicht in Hardware. Die 
Simulation ist schon eine andere Welt.

von noips (Gast)


Lesenswert?

Wäre der Code nicht fehlerfrei, wenn exit dort gar nicht stehen würde? 
Nach meinem Verständnis, schon.

von noips (Gast)


Lesenswert?

Ups, was habe ich da zusammengeschrieben! Ich meine damit, auch ohne 
exit-Statement würde ich diesen Code als fehlerfrei sehen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

noips schrieb:
> Aber in VHDL?
> Da gibt es meines Wissens keine Schleifendurchläufe in dem Sinne.
Wenn es eine Schleife gibt, dann gibt es auch Durchläufe... ;-)
Das Ergebnis ist allerdings ganz was anderes als bei einer prozeduralen 
Programmiersprache.


> Ich meine damit, auch ohne exit-Statement würde ich diesen Code
> als fehlerfrei sehen.
Richtig: er würde hier das selbe Ergebnis herausbekommen. In anderen 
Fällen käme auch was anderes raus:
1
   process (vektor) 
2
     variable i : integer;
3
   begin
4
     i := 0;
5
     for i in  vektor'range  loop
6
       if vektor(a) = '0' then
7
         idx <= i;
8
         exit;           -- mit exit:  die Position der "ersten" 0 wird gefunden
9
       end if;           -- ohne exit: die Position der "letzten" 0 wird gefunden
10
       i := i+1;
11
     end loop;
12
   end process;

> diesen Code
Es ist kein Code.
Es ist eine Beschreibung, nämlich eine Hardwarebeschreibung.

von noips (Gast)


Lesenswert?

Lothar Miller schrieb:
> Es ist kein Code.
> Es ist eine Beschreibung, nämlich eine Hardwarebeschreibung.

Ja, "Code" klingt eher nach Programmiersprache. Man kann darüber 
streiten, ob man die Hardwarebeschreibung in VHDL einen Code nennen kann 
oder nicht. Ich meine, immer wenn irgendwelche Dinge mit vereinbarten 
Zeichen(folgen) beschrieben werden, kann man von einem Code sprechen. 
Wenn man bei Google "vhdl coding style" eingibt, bekommt man 38.500 
Treffer.

von noips (Gast)


Lesenswert?


von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

noips schrieb:
> Wenn man bei Google "vhdl coding style" eingibt, bekommt man 38.500
> Treffer.
Wenn ich "armani coding style" eingebe bekomme ich 28.000 Treffer...
Wenn ich "vhdl beschreibung" eingebe, bekomme ich 38.000 Treffer...
Wenn ich "vhdl programm" eingebe, dann gibts immerhin schon 83.000 
Treffer...
 ;-)

> kann man von einem Code sprechen.
Ein Code war mal etwas Verschlüsseltes, oder etwas, das zum Entschlüssln 
von Verschlüsseltem zu brauchen war, oder etwas, das jemandem Zugang 
irgendwohin verschafft hat...

> ... würde ich diesen Code als fehlerfrei sehen ...
Es dauert nicht viel länger und ist dem Akronym "Very High Speed 
Integrated Circuit *Hardware Description Language*" angemessen, wenn du 
statt dessen einfach sagst:
... würde ich diese Beschreibung als fehlerfrei sehen ...

Aber sei's drum...  ;-)

von noips (Gast)


Lesenswert?

Lothar Miller schrieb:
> Wenn ich "armani coding style" eingebe bekomme ich 28.000 Treffer...

und ich nur 1 Treffer, und zwar diesen Thread, von der Werbung mal 
abgesehen. Eingabe mit Einführungszeichen vorausgesetzt.

Bei Suche nach "vhdl programm" (mit Einführungszeichen) bekomme ich nur 
2350 Treffer.

von Duke Scarring (Gast)


Lesenswert?

noips schrieb:
> und ich nur 1 Treffer
Google ist eben auch nicht mehr das, was es mal war.

Was mich in letzter Zeit extrem nervt, wenn Seiten gefunden werden, die 
meinen Suchbegriff gar nicht enthalten, sondern nur (im Kontext gesehen) 
enthalten könnten :-(

Duke

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Duke Scarring schrieb:
> Was mich in letzter Zeit extrem nervt, wenn Seiten gefunden werden, die
> meinen Suchbegriff gar nicht enthalten
Was mich überaus nervt, ist, dass gar nicht das gesucht wird, was ich 
will, sondern das, was Google meint, das ich wollten könnte. Und 
insbesondere, dass es keine Wildcards mehr gibt. Das kann sogar EBAY 
noch besser...

von noips (Gast)


Lesenswert?

Lothar Miller schrieb:
> dass es keine Wildcards mehr gibt.

Wann gab's die? Das wußte ich gar nicht, oder konnte es auch nicht 
wissen, weil ich Google noch nicht kannte.

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.