Hallo Zusammen.
Ich habe ein bisschen Mühe mit dem Design eines modulo-n Counters.
Dieser soll von n-1 rückwärts bis 0 zählen und danach wieder auf n-1
springen. Der Reset value ist ebenfalls n-1.
Hier ist mein Code:
Mein Problem nun: Bei meiner next_state_logic will ich ja sagen, dass
falls der aktuelle Wert 0 ist, er auf n-1 springen soll. Aber kann ich
das einfach mit n-1 zuweisen? Es scheint mir ein bisschen komisch, weil
n ja ein Integer ist und mein next_counter ein unsigned ist.
Wie gehe ich hier am besten vor?
Warum machst Du das "n"-Generic nicht auch gleich unsigned?
Wenn Du tatsächlich einen unsigned Zähler haben willst, sollte der
Startwert doch auch unsigned (oder wenigstens natural) sein. Damit
würdest Du dir eine Typumwandlung sparen (und gleich noch die -
zumindest theoretische - Fehlerquelle, dass einer deine Entity mit einem
negativen Startwert instantiiert).
Liebe alle, vielen Dank für eure Inputs!
Nun zur Erklärung: Ich schreibe demnächst eine Prüfung in VHDL und ich
möchte mich gut darauf vorbereiten. Wir haben einen ganzen Katalog mit
Aufgabenstellungen erhalten - ohne Lösungen - und ich versuche jetzt ein
paar von diesen zu lösen. Ich habe leider auch keine Simulator. Ich
mache es einfach schriftlich für mich um zu sehen, ob ich die Thematik
verstanden habe. :) Und ich bin sehr froh um eure Unterstützung.
Jetzt zurück zum Beispiel.
Die Schnittstellen wurden vorgegeben. Sprich clk und rst als std_ulogic
und count_out als std_ulogic_vector. Beim Rest bin ich frei. Ich soll
einzig einen parametrisierbaren modulo-n down-counter machen.
@Mulen deine Lösung gefällt mir gut! Ich dachte es wäre übersichtlicher
mit der next_state_logic. Aber ich habe mich wohl geirrt.
Nun das heisst ich würde meine Code wie folgt anpassen:
Wäre das so richtig?
Wenn ich jetzt aber meinen Code nehmen würde und einfach das n als
unsigned deklarieren würde, wir müsste ich da vorgehen? Weil ich ja
nicht weiss, was mein n ist. Also ich würde etwas wie generic (n:=
unsigned(???))
Entschuldigt, ich bin wirklich fleissig am lernen und möchte es gerne
verstehen. Sorry wenn immer noch ein bisschen Mühe habe.
teciu schrieb:> Ich habe leider auch keine Simulator.
Heutzutage kein Problem, solange man einen Browser hat:
https://www.edaplayground.com> Wir haben einen ganzen Katalog mit Aufgabenstellungen erhalten...> Die Schnittstellen wurden vorgegeben. Sprich> clk und rst als std_ulogic und count_out als std_ulogic_vector.
Als unconstrained vector ohne definierte Breite?
Mein Vorschlag: lass doch einfach mal die Aufgabe sehen.
Wenn man nur die Lösungsansätze sieht, muss man sich die Aufgabe
irgendwie erraten. Das ist umständlich...
teciu schrieb:> Ok :) Hier habe ich die Aufgabe angehängt!
dann frag' mal denjenigen, der dir die Aufgabe gestellt hat, ob der
Reset auch asynchron deaktiviert wird. Und ueberleg' dir mal, was dann
passieren kann...
Das steht jetzt gar nicht und ich denke, das wäre zu umfangreich.
Einizige Bedingungen sind eben, dass er bei n-1 beginnt, bis 0 runter
zählt und dann wieder bei n-1 beginnt. Oder eben, nei rst auch wieder
zurück zu n-1.
teciu schrieb:> Mag vielleicht jemand meinen Vorschlag anschauen?
Passt konzeptionell soweit.
Nach dem Entfernen einiger Syntaxfehler wie z.b. "down to" und -1 statt
-'1' sowie dem Einfügen des eines "begin" für die Architecture und eines
"end process" geht die Beschreibung durch den Compiler und ergibt das
gewünschte Verhalten.
Aber einfacher und übersichtlicher wäre es (wie schon erwähnt) mit einem
integer als Zähler: