bubblesort VHDL

Gast #2041929
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
Gast #2042919
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.
Moderator (Firma: Titel) Persönliche Seite #2043009
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...
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #2044136
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
Gast #2045249
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ß
Moderator (Firma: Titel) Persönliche Seite #2045276
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)...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren