Forum: FPGA, VHDL & Co. Lauflicht mit Richtungsumkehr


von Frank B. (fbergemann)


Angehängte Dateien:

Lesenswert?

Ich bin dabei ein einfaches Lauflicht-Demo zu variieren.
Dafür wollte ich eine der Tasten (T#1) nehmen, um die Richtung des 
Lauflichtes umzukehren.
T#0 macht reset (muss man derzeit am Anfang auch noch machen, 
automatisches init fkt. auch noch nicht).
Das Lauflicht verwendet dann LED 0..6 ('led')
LED 7 ('bulp') will ich verwenden, um den Umschalt-Taster zu 
verifizieren, bevor er wirklich die Richtungsumkehr macht.
Das Problem derzeit ist:
Wenn ich T#1 drücke, dann wird die Richtung nur manchmal umgekehrt, aber 
nicht immer. Das liegt daran, dass ich keine "Flankensteuerung"(?) drin 
habe. Der Prozess, der T#1 behandelt, schaltet die Richtung permanent 
um. Je nachdem wann ich T#1 loslasse, erwische ich dann die 
Richtungsumkehr - oder auch nicht.

Ich wollte mit dem T#1 ein asynchronen T-FlipFlop ansteuern und dann 
dessen Ausgang verwenden, um die Richtung des Lauflichtes umzudrehen.
Vorher soll erst mal über T#1 nur die LED7 ('bulp') getoggelt werden.

Klappt aber nicht - XST meckert, dass ich versuche mit 
"nicht-zulässigen" 1bit latches zu arbeiten(?)

von Lattice User (Gast)


Lesenswert?

Frank Bergemann schrieb:
>
> Ich wollte mit dem T#1 ein asynchronen T-FlipFlop ansteuern und dann
> dessen Ausgang verwenden, um die Richtung des Lauflichtes umzudrehen.

Genau der falsche Ansatz.

Stichworte:
Einsynchronisiereung asynchroner Signale,
Flankenerkennung,
eventuell Entprellung des Tasters (falls nicht schon in HW auf dem 
Evalboard)

Hier gibt es viele Beispiele und Erklärung warum und wie so etwas 
gemacht wird:
http://www.lothar-miller.de/s9y/

von Frank B. (fbergemann)


Angehängte Dateien:

Lesenswert?

Dsnke für den link!
- jetzt geht's schon mal besser.
Ich muss allerdings noch aufräumen - ganz sauber ist das noch nicht.

von Frank B. (fbergemann)


Angehängte Dateien:

Lesenswert?

ein bisschen aufgeräumt und mit Lauflicht speed-up/speed-down über die 
verbleibenden beiden Tasten des nexys-2.
Fehlt noch die Initialisierung ohne Button #0 (Reset)...

von Lattice User (Gast)


Lesenswert?

Frank Bergemann schrieb:
> ein bisschen aufgeräumt und mit Lauflicht speed-up/speed-down über die
> verbleibenden beiden Tasten des nexys-2.
> Fehlt noch die Initialisierung ohne Button #0 (Reset)...

Lies mal auf Lothar Seite nach, was er über ein asynchrones Reset zu 
sagen hat.

Behandle dein Reset genauso wie deine anderen Buttons.

von Frank B. (fbergemann)


Angehängte Dateien:

Lesenswert?

Der Reset läuft jetzt nach dem gleich Muster.
Da ist aber immer noch ein bißchen "Ballast" drin.

von Lattice User (Gast)


Lesenswert?

Frank Bergemann schrieb:
> Der Reset läuft jetzt nach dem gleich Muster.
> Da ist aber immer noch ein bißchen "Ballast" drin.

Du verwendest unötigerweise 4 Processe. Den ersten zum einsyncen würde 
ich getrennt halltem aber die anderen 3 in einem zusammenfassen. Dann 
kann man auch count_next und led_next einsparen.

Aber wir sind jetzt im Minenfeld der persöhnlichen Prereferenzen :-)

von Schlumpf (Gast)


Lesenswert?

Frank Bergemann schrieb:
> Da ist aber immer noch ein bißchen "Ballast" drin.

Ich unterstelle auch mal, dass das mit dem Speed noch nicht so ganz 
lupenrein ist, oder habe ich etwas übersehen?

Du schiebst zum Verändern der Geschwindigkeit ja nur das speed_reg hin 
hin und her. Also Multiplikation bzw. Division mit 2.
Was passiert aber, wenn du jetzt öfter einen der beiden Taster drückst? 
z.B. 32 mal? :-)

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


Lesenswert?

Lattice User schrieb:
> kann man auch count_next und led_next einsparen.
Ich würde auch sagen, das sind Leichen der ursprünglichen 
Zwei-Prozess-Schreibweise, wo diesen Signalen kombinatorisch der 
nächste Wert zugewiesen wurde.

: Bearbeitet durch Moderator
von Frank B. (fbergemann)


Lesenswert?

@Schlumpf:
Dann sind die bits "weg" :-)
Ich werde das mal durch srl und sll ersetzen und dafür die oberen und 
untere Grenze vernünftig setzen. Das Register kann dann verkleinert 
werden (trailing #0's für unbrauchbare Wartezeiten kann man weglassen). 
Ich brauch dann auch nur 1Bit zu setzen und nicht so ein kryptisches 
Bit-Muster das vom urspr. Initialwert #25000000 stammt.
Und dann verringere ich bei der Gelegenheit gleich die Anzahl der 
Process'e.
Als nächstes werde ich dann mal einen Counter für die Durchläufe 
(vorwärts/rückwärts incr/desr) einbauen und auf LED ausgeben.
Wenn ich das dann separieren will - in getrennte Dateien:
Kann ich z.B. verschiedene Process'e einer 'entity' in separate vhd 
files packen? Oder müssen in verschiedenen Dateien verschiedene 
'entity's beschrieben werden? (Und falls letzteres: wie kann ich eine 
Kommunikation zwischen verschiedenen 'entity's beschreiben?)

: Bearbeitet durch User
von Schlumpf (Gast)


Lesenswert?

Frank Bergemann schrieb:
> Ich werde das mal durch srl und sll ersetzen

Tu dir das bitte nicht an ;-)

von Frank B. (fbergemann)


Lesenswert?

kurze Zwischenfrage:
Ich hab' ein separates anderes mini-vhdl für die 7-Segment-Anzeige 
gemacht - funktioniert auch.
Aber ich habe Probleme, die beiden Sachen zu mergen.
Getrennte vhdl file in einem Projekt hat gar nicht funktioniert.
Bei der "Synthese" wird nur ein file genommen(?).
Ok, dann hab' ich in den sauren Apfel gebissen und es er einmal in eine 
Datei gepackt: #2 Entity's und #2 Architecture's.
Aber da meckert "Implementation Design", das es einen der Teile nicht 
"übersetzen" kann, weil im ucf-file zu viel drin steht. Das ucf file 
enthält den superset - also auch sind Dinge, die (nur) der zweite Teil 
braucht. Die moniert "Implementation Design" für den ersten Teil (der 
ersten 'Entity' und 'Architecture).
Wie rule'd man das denn?

[Nachtrag]
Ich hab' jetzt eine 'entity' definiert und zwei 'architecture' für 
diese 'entity'. "Implement Design" geht damit zwar durch, aber meldet 
bereits als Warnung:
1
WARNING:Par:289 - The signal led<0>_OBUF has no driver.  
2
PAR will not attempt to route this signal.

Danach kommt bei "Generate Programming File" ein Fehler:
1
ERROR:PhysDesignRules:368 - The signal <led<0>_OBUF> is incomplete. 
2
The signal is not driven by any source pin in the design.

: Bearbeitet durch User
von Frank B. (fbergemann)


Angehängte Dateien:

Lesenswert?

Anbei noch die Datei.
Die LED Ansteuerung ist auch irgendwo "geräubert" und noch nicht 
aufgeräumt. Mir geht's erst mal nur darum, dass beide Architectures 
"ausgeführt" werden.

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


Lesenswert?

Frank Bergemann schrieb:
> Ich hab' jetzt eine 'entity' definiert und zwei 'architecture' für diese
> 'entity'.
Du solltest dir unbedingt mal die Grundlagenabteilung deines VHDL-Buchs 
ansehen: es ist möglich, mehrere Architectures zu deklarieren, aber es 
wird nur die letzte in der Datei zur Simulation und Synthese 
herangenommen.

Was du willst und brauchst nennt sich "Component": in eine 
Top-Level-Entity werden andere Entities als Komponenten eingebunden. 
Dort mache ich sowas mit einer DDFS-Einheit und einer PWM-Einheit:
http://www.lothar-miller.de/s9y/archives/57-Sinusausgabe-mit-PWM.html

von Frank B. (fbergemann)


Angehängte Dateien:

Lesenswert?

@lkmiller:
In "VHDL - Eine Einführung (Molitor/Ritter)" hab' ich da leider nicht 
viel drüber gefunden. Aber dank Deines links konnte ich es wenigstens 
besser strukturieren.

Leider bekomme ich immmer noch XST Warnungen
1
WARNING:Xst:2211 - "D:/xilinx-workspace/nexys2/Lauflicht2/Lauflicht1.vhd" line 56: Instantiating black box module <led_impl>.
2
WARNING:Xst:2211 - "D:/xilinx-workspace/nexys2/Lauflicht2/Lauflicht1.vhd" line 65: Instantiating black box module <segment_impl>.

Ich versteh' diese Warnung nicht. Ist es ein Problem, wenn die 
Components nichts miteinander austauschen, sondern nur gemeinsam clock 
beziehen?

[Nachtrag]
Ich versteh' auch nicht, wieso ich bei der Auslistung der Components in 
architecture Lauflicht_Impl noch mal deren Interface spezifizieren muss.
Die Anbindung der Lauflicht_if ports an die ports der Components macht 
Sinn. Aber die I/F definition der Components kommt doch von den 
Components selbst(?)

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


Lesenswert?

Frank Bergemann schrieb:
> Ich versteh' auch nicht, wieso ich bei der Auslistung der Components in
> architecture Lauflicht_Impl noch mal deren Interface spezifizieren muss.
Naja, ist eben VHDL. Es ginge auch ohne "doppelte" Deklaration, aber 
dazu musst du noch mehr Hintergrundwissen haben...

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


Lesenswert?

Frank Bergemann schrieb:
> Leider bekomme ich immmer noch XST Warnungen
Zum Zeitpunkt, wo er die angemeckerten Module einbauen soll, sind sie 
noch gar nicht synthetisiert. Pack jedes der 3 Module in ein eigenes 
VHDL File und füge alle 3 zu deinem Projekt dazu.

von Frank B. (fbergemann)


Lesenswert?

Das hat geholfen - Danke!
Ich hatte auch noch bei den 'components' fälschlicherweise die 
'architecture' referenziert - anstelle der 'entity'.

von Frank B. (fbergemann)


Angehängte Dateien:

Lesenswert?

Ich hab' jetzt zwei Demos als 'component's in einer 'architecture' 
zusammengebracht. Als nächstes will ich die 7Segment-Anzeige dazu 
verwenden, die Anzahl der Durchläufe des LED Lauflichts vorwärts und 
rückwärts zu zählen.
Aber eine Sache irritiert mich:
Seitdem ich beim LED Lauflicht (Led.vhd) das signal 'led_reg' 
initialisere, damit das LED Lauflicht nach dem laden des *.bit files 
direkt abläuft
1
signal led_reg    : unsigned (6 downto 0) := "0000001";
... leuchten die LEDs nur noch schwach - bis ich dann doch wieder den 
Button #0 (reset) drücke.

Woran liegt das?

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.