Forum: FPGA, VHDL & Co. bubblesort VHDL


von paul (Gast)


Lesenswert?

Hallo,

Habe ein paar Probleme mit dem bubblesort Algorithmus.
Soll einen Algorithmus in VHDL schreiben, der einen Bubblesort macht und 
zwar mit Integerwerten. Ich weiss nur nicht, wie ich ein Integer Array 
erzeuge.

Der Code sieht bis jetzt folgendermaßen aus:

n := in'length;
vertauscht <= '1';
while vertauscht = '1' and n > 1 loop
vertauscht <= '0';
for i in in'range loop
if in(i) > in(i+1) then
temp <= in(i);
in(i) <= in(i+1);
in(i+1) <= temp;
vertauscht <= '1';
end if;
end loop;
n <= n - 1;
end loop;

Ich habe als Array Defintion gedacht:

type array_type1 is array (8 downto 0) of integer;

Vielleicht kann ja mal jemand drüberschauen.

Gruß
paul

von Sven P. (Gast)


Lesenswert?

Soll das irgendwann mal synthetisiert werden?
Bedenke: Auf dem Silizum gibt es kein 'Nacheinander', Schleifen werden 
gnadenlos ausgerollt!

von paul (Gast)


Lesenswert?

Hallo,

nein soll es nicht.
Soll eine Klausurvorbereitungsaufgabe sein, also alles rein theoretisch.

Gruß
paul

von Morin (Gast)


Lesenswert?

> Habe ein paar Probleme mit dem bubblesort Algorithmus.
> Soll einen Algorithmus in VHDL schreiben, der einen Bubblesort macht und
> zwar mit Integerwerten. Ich weiss nur nicht, wie ich ein Integer Array
> erzeuge.

Ich muss zugeben, dass ich das Problem noch nicht so recht verstehe. Der 
Code sieht doch gut aus (ohne jetzt ganz genau hingesehen zu haben).

Typdefinition ist auch vorhanden. BTW: Wieso gerade (8 downto 0), ist 
das eine "beliebige" Größe zum Ausprobieren?

Liegt das Problem darin, "in" anzulegen? Dann musst du dir Überlegen, ob 
es eine Variable (interner Zwischenwert eines Prozesses) oder ein Signal 
(Kommunikation zwischen Prozessen und Entities) sein soll. Hängt vom 
Kontext bzw. von der Aufgabenstellung ab.

Weitere Anmerkung: Bin jetzt gerade nicht sicher, aber evtl. ist "in" 
ein reserviertes Schlüsselwort. Wenn es dazu unerklärliche Syntaxfehler 
gibt, versuch mal einen anderen Namen.

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


Angehängte Dateien:

Lesenswert?

paul schrieb:
> also alles rein theoretisch.
Glück gehabt...

> type array_type1 is array (8 downto 0) of integer;
Probier mal die Reihenfolge umzukehren...

paul schrieb:
> Der Code sieht bis jetzt folgendermaßen aus:
Da fehlt noch einiges drumrum: soll da ein Takt involviert sein?
Falls nein: dann lass die Signale raus und mach alles mit Variablen, 
denn Signale werden erst am Ende eines Prozesses zugewiesen, bis dahin 
wird der "alte" Wert des signals verwendet...

Das hier läuft in deinem Fall auf jeden Fall in eine Bereichsverletzung:
  for i in in'range loop
    if in(i) > in(i+1) then
in'range ist 0..8
Was passiert, wenn i=8 ist?

Seis drum. Im Anhang eine mögliche Lösung...

von paul (Gast)


Lesenswert?

Vielen Dank für eure Hinweise.
Jetzt weiss ich auch wo so eine Type Anweisung hinkommt, das fehlte mir 
bis jetzt. Ich wusste nich, das man das so machen kann.

Gruß

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


Lesenswert?

paul schrieb:
> Jetzt weiss ich auch wo so eine Type Anweisung hinkommt
Sie muß nur in ein Package, wenn sie im Port der Entity auftauchen soll.

Sonst kannst du logischerweise gern auch irgendwo mittendrin an einer 
passenden Stelle so einen Typ definieren. Z.B. wie dort das ROM in der 
Architecture:
http://www.lothar-miller.de/s9y/archives/37-DDFS-mit-BROM.html
Oder auch in einem Prozess:
http://www.lothar-miller.de/s9y/archives/38-DDFS-mit-Distributed-ROM.html

von paul (Gast)


Lesenswert?

Okay, super, vielen Dank.
Eine Frage habe ich aber noch, wieso geht die for Schleife bis length-2 
und nicht bis length-1 ?

Und, das Array ist jetzt von links an beginnend mit Index 0 steigend? 
Oder umgekehrt?
Wenn ich davon ausgehe, das links der niedrigste Index ist wird von 
links nach rechts aufsteigend sortiert, richtig?

Gruß

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


Lesenswert?

paul schrieb:
> Wenn ich davon ausgehe, das links der niedrigste Index ist wird von
> links nach rechts aufsteigend sortiert, richtig?
Ja.

paul schrieb:
> Eine Frage habe ich aber noch, wieso geht die for Schleife bis length-2
> und nicht bis length-1 ?
   for i in 0 to din'length-2 loop
      if din(i) > din(i+1) then
Wenn din'range = 0..9 ist, dann ist din'length=10, daber das letzte 
Element ist din(9). Dann steht da also:
   for i in 0 to 8 loop
      if din(i) > din(i+1) then
Und damit ist bei i=8 das letzte Element din(i+1) = din(8+1) = din(9)...

von paul (Gast)


Lesenswert?

alles klar, verstanden.
Danke!

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.