mikrocontroller.net

Forum: FPGA, VHDL & Co. bubblesort VHDL


Autor: paul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven P. (haku) Benutzerseite
Datum:

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

Autor: paul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Gruß
paul

Autor: Morin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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...

Autor: paul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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-m...
Oder auch in einem Prozess:
http://www.lothar-miller.de/s9y/archives/38-DDFS-m...

Autor: paul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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)...

Autor: paul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
alles klar, verstanden.
Danke!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.