Forum: FPGA, VHDL & Co. Code Optimierung - Signalzuweisungen vereinfachen


von Bruno K. (b0bbyr4y)


Lesenswert?

Hallo zusammen,

ich habe folgenden Code für die Zuweisung von Signalen:
1
tbuf(0) <= en;
2
tbuf(1) <= tbuf(0) and qbuf(0);
3
tbuf(2) <= tbuf(1) and qbuf(1);
4
tbuf(3) <= tbuf(2) and qbuf(2);
5
tbuf(4) <= tbuf(3) and qbuf(3);
6
tbuf(5) <= tbuf(4) and qbuf(4);
7
tbuf(6) <= tbuf(5) and qbuf(5);
8
tbuf(7) <= tbuf(6) and qbuf(6);
9
tbuf(8) <= tbuf(7) and qbuf(7);
10
tbuf(9) <= tbuf(8) and qbuf(8);

Geht das auch in einer Art Loop?
Pseudocode:
1
tbuf(0) = en;
2
for i in 0 to 8
3
   tbuf(i+1) = tbuf(i) and quf(i);
4
end for;

Grüße
Bruno

von Theor (Gast)


Lesenswert?

Versuch macht kluch. Die Sprachbeschreibung auch. :-)

von Erwartung Svoller (Gast)


Lesenswert?

> Code Optimierung

Und ich dachte schon hier wird mal so richtig was optimiert
dass das Zeug richtig schnell wird .... also "sophisticated
Programming" ..... (nix war's) ...

Dabei geht's nur um die Einrollung einer entrollten Schleife.

von Josef G. (bome) (Gast)


Lesenswert?

1
tbuf(9 downto 1) <= tbuf(8 downto 0) and qbuf(8 downto 0);
2
tbuf(0) <= en;
Natürlich nur mit Takt sinnvoll.

von Robert P. (fpgazumspass) Benutzerseite


Lesenswert?

Warum nicht gleich so?
1
tbuf <= (tbuf(8 downto 0) and qbuf(8 downto 0) & en

von Josef G. (bome) (Gast)


Lesenswert?

Robert P. schrieb:
> Warum nicht gleich so?

Wenn es nicht auch noch ein tbuf(10) gibt.

von Strategic Head of Lunch Planning (Gast)


Lesenswert?

Es kommt eh immer das selbe raus.
Ob eingerollt oder ausgerollt.
Schlauch bleibt Schlauch!

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Entweder mit generate Statements oder:
1
tbuf(0) <= en;
2
tbuf(tbuf'high downto 1) <= tbuf(tbuf'high-1 downto 0) and qbuf(qbuf'high-1 downto 0);

Dann bleibt die Struktur erhalten, auch falls sich mal die Laenge von 
tbuf und qbuf aendert.

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


Lesenswert?

Bruno K. schrieb:
> Geht das auch in einer Art Loop?
Ja. Das geht auch.
Du musst einfach nur den Pseudocode als VHDL code hinschreiben. Es ist 
übrigens egal, ob du die Schleife "verkehrt herum" laufen lässt. Oder ob 
du deinen Code so schreibst:
1
tbuf(6) <= tbuf(5) and qbuf(5);
2
tbuf(7) <= tbuf(6) and qbuf(6);
3
tbuf(8) <= tbuf(7) and qbuf(7);
4
tbuf(9) <= tbuf(8) and qbuf(8);
5
tbuf(1) <= tbuf(0) and qbuf(0);
6
tbuf(2) <= tbuf(1) and qbuf(1);
7
tbuf(3) <= tbuf(2) and qbuf(2);
8
tbuf(4) <= tbuf(3) and qbuf(3);
9
tbuf(5) <= tbuf(4) and qbuf(4);
10
tbuf(0) <= en;

Robert P. schrieb:
> Warum nicht gleich so?
> tbuf <= (tbuf(8 downto 0) and qbuf(8 downto 0) & en
Mit der richtigen Klammerung samt fehlendem Strichpunkt wäre das mein 
Stil. Und wenn man dann noch davon ausgeht, dass der qbuf eh' ein 8-Bit 
Vektor ist, dann käme sowas dabei heraus:
1
  tbuf <= (tbuf(8 downto 0) and qbuf) & en;

von Bruno K. (b0bbyr4y)


Lesenswert?

Hi,

danke für die Vorschläge!

Werde die Variante von Tobias verwenden. Die Variante von Lothar gefällt 
mir auch. Leider ist der qbuf auch 10bit lang.

Danke nochmal für die schnelle Hilfe! Stand da irgendwie auf dem 
Schlauch.

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


Lesenswert?

Bruno K. schrieb:
> Leider ist der qbuf auch 10bit lang.
Ich würde ich die Wortbreite für die Berechnung nur vom tbuf abhängig 
machen, dann kann die Wortbreite des qbuf sein (oder gar ändern) wie sie 
will, für die verUNDung wird trotzdem die korrekte (gleiche) Breite 
verwendet:
1
tbuf(tbuf'high downto 1) <= tbuf(tbuf'high-1 downto 0) and qbuf(tbuf'high-1 downto 0);
2
tbuf(0) <= en;

: Bearbeitet durch Moderator
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.