Hallo,
ich habe 8 bit serielle Daten, die ich parallelisieren möchte.
Dazu verwende ich ein 8bit Schieberegister.
Nun möchte ich, dass das Schieberegister einen Ausgang besitzt der
vermeldet, wenn 8bit komplett durchgeschoben wurden, also wenn quasi das
nächste Byte komplett am Ausgang anliegt und es abgespeichert werden
kann.
Dazu verwende ich folgenden Code:
Nun ergibt sich daraus das Bild im Anhang.
Das Problem was ich habe ist, dass FULL erst auf High geht, wenn
eigentlich schon das nächste Mal geschiftet wird (siehe Cursor) und ich
dadurch wetten könnte, dass mein Byte am Ausgang nicht den richtigen
Wert trägt, wenn es ausgelesen wird.
Ich habe jetzt eine ganze Weile über diesem Problem gebrütet, aber komme
zu keiner Lösung. Wenn ich den Counter für Full = 1 auf 7 setze, beißt
sich das ja mit der Bedingung Counter < 8, weil es ja das gleiche ist.
Am besten wäre, wenn FULL = 1 gesetzt wird, wenn der Counter 8 erreicht
hat und dann eine fallende Flanke vom CLOCK kommt, denn dann liegen
ziemlich sicher die Daten korrekt an. Nur leider habe ich keine Ahnung,
wie ich das bewerkstelligen soll.
Ich hoffe ihr habt eine Idee?!
DANKE!!!
MfG Andreas
PS: Wie kann ich Modelsim beibringen, dass er die aktuelle Simulation
aktualisieren soll und sich nicht neustartet? Jedes Mal wenn ich die
Simulation aus dem ISE starte, öffnet sich ein neues Modelsim Fenster
und ich muss das alte schließen. Damit gehen dann auch alle Zoom- und
sonstige Einstellungen verloren.
PS2: Ich bin mir sicher, dass man den Code auch effektiver gestalten
kann, aber ich stehe noch recht am Anfang meiner VHDL "Karriere" und bin
erstmal frph, wenn das Design das macht, was es soll :) Ich hoffe ich
habe dann keine Probleme, die Sache in die Hardware zu implementieren.
Was spricht dagegen, auf <7 und =7 zu prüfen?
Korrekterweise solltest du ja auch von 0 bis 7 zählen, derzeit zählst du
von 0 bis 8.
Das mit der fallenden Flanke ganz schnell vergessen, mit dem synchronen
Design zur steigenden wird schon alles so gemacht wie du es willst.
In der Modelsim-Konsole unten kannst du Pfeil-nach-oben bis zum ersten
Befehl drücken, dann wird das getan, was ISE macht.
Dein DATA_OUT_SR : out STD_LOGIC_VECTOR (7 downto 0)
hat 8 Bits (von 0 bis 7).
Also müsste doch auch dein Zähler von 0 bis 7 laufen... :-o
Mit deinem Code machst du immer 9 Bits...
Das hier:
DANKE für die Hilfe, aber an sich kann man das so machen, oder ist es
eher "unsauber" und es gibt eine bessere, vielleicht effektivere und
Ressourcen schohnendere Methode?
VIELEN DANK!
Diese Abfrage ist für die Synthese uninteressant:
OR RESET_SR = 'H'
Denn in der realen Hardware gibt es nur 0,1 und Z.
> eine bessere, vielleicht effektivere ... Methode?
Du könntest das Schieberegister ein Bit breiter machen und beim Reset
mit "000000001" laden. Wenn die '1' beim Schieben ganz links angekommen
ist, bist du fertig. Das dürfte ein wenig effizienter sein ;-)
Ersetze
elsif ??? then
durch
else
Wobei....
wenn ich mir das ganze genau betrschte wirst du u.U. ein Problem mit dem
Takt haben. Denn zurückgesetzt wird jetzt nur noch mit dem Takt :-/
Du wirst also fürs Zurücksetzen einen CLOCK_SR Puls brauchen.
Ja genau, das Problem mit dem Reset habe ich gerade gefunden und lange
ging nix. Ich frage im TopLevel Design den FULL Ausgang ab und lese in
Abhängigkeit davon die Daten des Schieberegisters aus.
Ich habe mir das jetzt so zurecht gebastelt:
Nun habe ich aber das Problem, dass meine Simulation wie im Anhang
aussieht. Also die Daten nicht bei der steigenden Flanke von FULL
ausgelesen werden, sondern einen Takt später, was ja genau wieder falsch
ist. Ich vermute, dass meine Abfrage nach dem DATA_READ_EN (FULL)
Probleme macht und dadurch einen Takt länger braucht.
Hat jemand eine Idee, wie ich das lösen könnte? Ich simuliere jetzt
schon ca. 1h... ich bekomme es entweder nicht übersetzt oder es
funktioniert nicht so, wie ich es mir vorstelle.
Sind das bei jedem die Probleme, mit denen man sich rumärgern muss? Also
wird es irgendwann besser und man bekommt einen besseren Überblick, auf
was man achten muss? Denn bisher ist es sehr sehr mühsam etwas zustande
zu bekommen... das ist nervenaufreibend und nicht gerade das Tempo, mit
dem ich eigentlich mein Projekt bearbeiten wollte.
DANKE!!!