Forum: FPGA, VHDL & Co. Ampelsteuerung mit Schematics Basys2


von Sebbowicz (Gast)


Lesenswert?

Hallo,

ich habe folgendes Problem:
Ich benutze für den Versuch ein Digilent Basys2 Boards und die Xilinx 
Design Suite und programmiere in schematics.
Ich würde gerne eine Ampelsteuerung entwickeln, welche aus einer Ampel 
für Autos und einer Bedarfsampel für Fußgänger besteht. Sprich die Ampel 
für die Autos ist dauerhaft auf grün und die Fussgängerampel kann bei 
Bedarf, jedoch nur gedrückt werden wenn die Ampel der Autofahrer auf 
grün steht.

Ich habe hierfür einen 4-bit Johnson Zähler verwendet und habe die 
jeweils 4 Ausgänge mittels verschiedener ANDs auf meine 8 Zustände 
verbunden. Der Zähler hat einen CLK Eingang welcher auch von der CLK des 
Boards beschaltet wird. Und die jeweiligen AND Ausgänge hab ich mit I/Os 
verbunden und diese programmiert.
Hier komm ich nun zu meinen Problemen:

-Wenn ich den Zustand 0, welcher mein Ruhezustand ist mit dem Taster 
zusammen per AND verbinde und auf den Schalter der Fussgängerampel lege 
meckert Xilinx er kann keinen out- und input zusammenschalten.
-Wenn ich mittels Befehl: NET "" LOC = ""; eine meiner LEDs definiere 
kann ich diese nur einmal definieren obwohl ich diese bei mehreren 
Zuständen benötige. da meckert Xilinx ebenso

Was kann ich also tun? Bin ein wenig verzweifelt ...

von Sebbowicz (Gast)


Angehängte Dateien:

Lesenswert?

Hier ist nochmal ein screenshot zum besseren Verständnis

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


Lesenswert?

Sebbowicz schrieb:
> programmiere in schematics.
Warum? Wer zwingt dich?

> meckert Xilinx er kann keinen out- und input zusammenschalten.
Mit welchen Worten genau?

> -Wenn ich mittels Befehl: NET "" LOC = ""; eine meiner LEDs definiere
> kann ich diese nur einmal definieren obwohl ich diese bei mehreren
> Zuständen benötige. da meckert Xilinx ebenso
Logisch kannst du einem einzigen Pin nur ein einziges Signal zuordnen. 
Oder was willst du damit erreichen?

von Klaus F. (kfalser)


Lesenswert?

Sebbowicz schrieb:
> Hallo,
>
> ich habe folgendes Problem:
> Ich benutze für den Versuch ein Digilent Basys2 Boards und die Xilinx
> Design Suite und programmiere in schematics.
Schematix nix gut, du solltest VHDL oder Verilog lernen.
Hier verwendet niemand mehr schematics, und höchstwahrscheinlich hat 
auch niemand Lust, sich durch die Logik durchzubeissen.

> Ich würde gerne eine Ampelsteuerung entwickeln, welche aus einer Ampel
> für Autos und einer Bedarfsampel für Fußgänger besteht. Sprich die Ampel
> für die Autos ist dauerhaft auf grün und die Fussgängerampel kann bei
> Bedarf, jedoch nur gedrückt werden wenn die Ampel der Autofahrer auf
> grün steht.
Ist ja die klssische Hausaufgabe, aber für HDL.

> Ich habe hierfür einen 4-bit Johnson Zähler verwendet und habe die
> jeweils 4 Ausgänge mittels verschiedener ANDs auf meine 8 Zustände
> verbunden. Der Zähler hat einen CLK Eingang welcher auch von der CLK des
> Boards beschaltet wird. Und die jeweiligen AND Ausgänge hab ich mit I/Os
> verbunden und diese programmiert.
> Hier komm ich nun zu meinen Problemen:
>
> -Wenn ich den Zustand 0, welcher mein Ruhezustand ist mit dem Taster
> zusammen per AND verbinde und auf den Schalter der Fussgängerampel lege
> meckert Xilinx er kann keinen out- und input zusammenschalten.
> -Wenn ich mittels Befehl: NET "" LOC = ""; eine meiner LEDs definiere
???, Soetwas definiert kein Signal, sondern weisst das Signal an einen 
bestimmten Pin zu.

> kann ich diese nur einmal definieren obwohl ich diese bei mehreren
> Zuständen benötige. da meckert Xilinx ebenso
>
> Was kann ich also tun?
VHDL oder Verilog lernen ...

> Bin ein wenig verzweifelt ...
Nicht aufgeben, wird schon...

von Sebbowicz (Gast)


Lesenswert?

Mein Problem ist das es eine Projektarbeit für ein Labor werden soll und 
dieses eben leider in schematics sein muss, da VHDL oder verilog für 3 
Stunden zu viel Aufwand darstellen bzw einiges an Vorarbeit mit sich 
bringt ...

Bei einer Logosteuerung kann ich aber auch ein und Ausgang zusammen 
schalten ...

Also euer Tipp wäre VHDL bzw Verilog? Wie komplex wäre da denn eine 
Ampelsteuerung und was müsste ich in etwa an Zeit einplanen um eine 
Fertige Programmierung zu haben?

Danke im vorraus!

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


Lesenswert?

Sebbowicz schrieb:
> Wie komplex wäre da denn eine Ampelsteuerung
Halb so schlimm: Beitrag "Re: Ampelsteuerung"

> was müsste ich in etwa an Zeit einplanen um eine Fertige Programmierung
> zu haben?
Nachdem du VHDL noch lernen musst, kann das schon mal ein paar Abende 
kosten. Stell dich auf gute 2 Wochen ein, Abend für Abend. Ich habe 
dafür 15 Minuten gebraucht...

Zum Thema "Schaltplaneingabe" lies mal den ganzen 
Beitrag "kruder Fehler bei FPGA-Programmierung (ISE WEBpack-Schematic)" durch.

Sebbowicz schrieb:
> Mein Problem ist das es eine Projektarbeit für ein Labor werden soll und
> dieses eben leider in schematics sein muss, da VHDL oder verilog für 3
> Stunden zu viel Aufwand darstellen bzw einiges an Vorarbeit mit sich
> bringt
Aber es ist m.E. Blödsinn, das Thema "FPGA" in 3 Stunden reinzupacken. 
Und es ist noch mehr Blödsinn, das anhand von Schaltplaneingabe zu 
machen!

: Bearbeitet durch Moderator
von peter (Gast)


Lesenswert?

Hmm..., hier sind verschiedene Ampelsteuerungen sehr gut beschrieben in 
VHDL.

Da sieht man auch wie komplex die Geschichte ist.

http://astro.uni-tuebingen.de/groups/electronics/VHDL.pdf

Gruss

von peter (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe mal die Kreuzungsampeldemo aus Kapitel 5 umgesetzt für den 
VGA-Monitor. Dann braucht man für die Demo keine Platine löten.
1 Autoampel stellt  2 gegenüberliegende dar die zusammengeschaltet sind.
1 Fussgängerampel stellt die 4 Ampeln dar für die 4 Fußgängerüberwege.

Umgesetzt für DE0/DE1.


Gruss

von Sebbowicz (Gast)


Lesenswert?

Gibt es literaturtechnisch denn ein "Einsteigerwerk" oder Ähnliches was 
zu empfehlen wäre bzw. einen gut zu solchen Aufgaben hinführt?

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


Lesenswert?

Probiers mal mit Reichardt&Schwarz "VHDL Synthese".

peter schrieb:
> Ich habe mal die Kreuzungsampeldemo aus Kapitel 5 umgesetzt
Ja und? Dein Post wäre bestenfalls dann sinnvoll, wenn du deine VHDL 
Beschreibung mit angehängt hättest. So ist es nur billige Protzerei und 
Ego-Politur...

: Bearbeitet durch Moderator
von Sigi (Gast)


Lesenswert?

Ein einziges Einstiegswerk gibts wahrscheinlich nicht,
es überschneiden sich ja verschiedene Bereiche wie z.B.
Digital-Design und die Sprache VHDL in seiner gesamten
Komplexität (zum Designen und Simulieren).

Für HDL gibts wie schon erwähnt Reichardt&Schwarz.
Für Digital-Design gibts sehr viele Bücher,  ich habe
mal eins geschenkt bekommen: Wakerly "Digital Design".
ist nicht sehr anspruchsvoll aber sehr umfangreich
und bei EBay&Co für wenige Euros erhältlich.
Dazu noch die Datasheets deines Board-/FPGA-Hersteller
und du bist rundumversorgt.

von peter (Gast)


Angehängte Dateien:

Lesenswert?

vga_ampel , beinhaltet vag_text, weil das mit zum vga_modul gehört.

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


Angehängte Dateien:

Lesenswert?

peter schrieb:
> Da sieht man auch wie komplex die Geschichte ist.
Strukturelle Beschreibung und Zerlegung des Designs in 
Mikro-Subkomponenten. Das ist VHDL Stil aus dem letzten Jahrtausend 
(passt ja auch grob zum Jahr der Veröffentlichung), so bekam VHDL den 
Ruf "umständlich und geschwätzig" zu sein...

Im Anhang mal die Ampel in Verhaltensbeschreibung mit zwei Arrays als 
Speicher für die Lichtfolge und die Dauer.

von ?!? (Gast)


Lesenswert?

Aber Lothar, so schnell kann doch keiner anfahren (zumindest nicht ohne 
Gummistreifen auf der Straße). Grünphase nur 3µs... :-)))

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


Lesenswert?

?!? schrieb:
> Grünphase nur 3µs... :-)))
Naja, er hat schon 1000 mal mehr Zeit. Und wenn das immer noch nicht 
reicht, ändert er den Wert dort auf 50000000:
1
      if prescOneSec<50000-1 then            -- schon eine Sekunde vorbei?
Oder er baut einen 50kHz Quarz ein... ;-)

: Bearbeitet durch Moderator
von ?!? (Gast)


Lesenswert?

Lothar Miller schrieb:
> Naja, er hat schon 1000 mal mehr Zeit.

War doch bloss ein Scherz...

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


Lesenswert?

?!? schrieb:
> War doch bloss ein Scherz...
Hatte ich auch so aufgefasst ;-)
Und ausserdem kann so ein kleiner "Fehler" auch mal zum Mitdenken beim 
Kopierer anregen...

von Sigi (Gast)


Lesenswert?

Lothar Miller schrieb:
>Strukturelle Beschreibung und Zerlegung des Designs in
>Mikro-Subkomponenten. Das ist VHDL Stil aus dem letzten Jahrtausend
>(passt ja auch grob zum Jahr der Veröffentlichung), so bekam VHDL den
>Ruf "umständlich und geschwätzig" zu sein...
Naja, Verilog basiert ja mehr oder weniger auf den selben Konzepten
wie VHDL, insbesondere "Signal" und "Komponente", also auch der
Zerlegung eines Designs in Subkomponenten. Also wäre Verilog auch
eine "geschwätzige" Sprache. IHMO basiert "geschwätzig" aber auf der
Syntax von VHDL, die bei Verilog kompakter gehalten ist.

Und mit "Stil aus dem letzten Jahrtausend" meinst du doch hoffentlich
nicht "überaltert", denn das Zerlegen von Problemen in Teilprobleme
wirds immer geben und ist idR auch oft der beste Ansatz (ausser der
übertriebenen Kleinst-Zerlegung).

von peter (Gast)


Lesenswert?

Ich habe deine neue Ampelschaltung bei mir in VGA reingebracht, 8 
Auto-Ampel und 8 Fussgängerampel auf dem Screen. Ist eine Kreuzung , auf 
jeder Fahrseite eine Ampel sowie beim Fussgängerüberweg.

Jetzt bringe ich da noch die Fussgängerbedarfsschaltung unter.

Gruss

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


Lesenswert?

Sigi schrieb:
> Und mit "Stil aus dem letzten Jahrtausend" meinst du doch hoffentlich
> nicht "überaltert", denn das Zerlegen von Problemen in Teilprobleme
> wirds immer geben und ist idR auch oft der beste Ansatz (ausser der
> übertriebenen Kleinst-Zerlegung).
Nein, damit meine ich die Strukturbeschreibung bis runter zu einzelnen 
Flipflops bzw. Gattern.
Dass ein Design in einzelne Komponenten aufgeteilt (oder besser aus 
einzelnen Komponenten zusammengesetzt) wird, das wird ja beim 
Schaltungsdesign allgemein so gemacht: Versorgung, Prozessor, EA, 
Schnittstellen, Speicher...
Und weil VHDL ja eine Schaltungsbeschreibungssprache ist, ist auch dort 
eine Aufteilung sinnvoll.


> IHMO basiert "geschwätzig" aber auf der
> Syntax von VHDL, die bei Verilog kompakter gehalten ist.
Verilog ist m.E. deshalb kompakter, weil dort viele Dinge implizit 
angenommen und vorausgesetzt werden.

: Bearbeitet durch Moderator
von W.S. (Gast)


Lesenswert?

Sebbowicz schrieb:
> -Wenn ich den Zustand 0, welcher mein Ruhezustand ist mit dem Taster
> zusammen per AND verbinde und auf den Schalter der Fussgängerampel lege
> meckert Xilinx er kann keinen out- und input zusammenschalten.

Womit Schwester ISE ja auch völlig Recht hat.
Aber das ist kein Problem von HDL versus Schematics, sondern ein 
Denkfehler. Du solltest allerdings lieber beschreiben, was du 
tatsächlich meinst, denn unter "Wenn ich den Zustand 0, welcher mein 
Ruhezustand ist mit dem Taster zusammen per AND verbinde" kann man sich 
alles Mögliche vorstellen, eine exakte Beschreibung dessen, was du tun 
willst, ist es nicht.

Also: du kannst den Ausgang eines Gatters (AND, OR, FF usw.) nach deinem 
Belieben an den Eingang eines anderen Gattes führen. Das geht immer. 
ABER: du hast die Buffer vergessen. Wenn du sowas nicht zeichnest, dann 
versucht die ISE, sich selbige dazuzudenken. Dehalb werden deine Signale 
"Taster", "Clk", "Zustand_4" und so weiter automatisch zu I/O-Signalen 
und die sind NICHT geeignet, an anderweitige Logik geführt zu werden. 
Physikalisch sind das dedizierte I/O-Treiber, die die Verbindung 
zwischen Pin und Logik-Array herstellen.

Korrekt wäre es so:

(pin)--[IBUF]-*---[Gatter]---[OBUF]---(pin)
              |---[anderes Gatter]---...

(hoffentlich kann man's erkennen)

So, was du machen kannst:
1. einfach mit korrekten IBUF's und OBUF's zeichnen
2. dich von Lothar und den anderen zu einer HDL überreden lassen.

(1. geht viel fixer)

und nochwas: wenn du eine LED bei mehreren Zuständen eingeschaltet haben 
willst, dann mußt du das eben auch in einer passenden Verknüpfung (OR 
gatter) tun, bevor du das Signal an einen OBUF und von dort aus an einen 
Outputmarker (beim Toplevel-Schematic ist das der Statthalter für dein 
Pin) führst.

und noch etwas:
Beiträge wie "Schematix nix gut,...Hier verwendet niemand mehr 
Schematics" finde ich an dieser Stelle ebenfalls NIX GUT, weil der TO 
dediziert genau danach gefragt hat. Wenn man mangels eigener Übung 
kein Schematics kann und deshalb auch darin nicht aussagefähig ist, wäre 
es besser, freiweg anstelle von nixgut zu sagen "kenn ich nicht, sorry."

W.S.

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


Lesenswert?

W.S. schrieb:
> und noch etwas:
> Beiträge wie "Schematix nix gut,...Hier verwendet niemand mehr
> Schematics" finde ich an dieser Stelle ebenfalls NIX GUT, weil der TO
> dediziert genau danach gefragt hat
Ich finde allerdings die Idee seltsam, jemanden, der laut eigener 
Aussage keine Ahnung von der Sache hat, auf eigenen Wunsch ins Verderben 
rennen zu lassen. Man darf einem solchen erklärten Anfänger durchaus 
Alternativen vorstellen. Wenn er danach weiterhin Schaltpläne 
zusammenclickt und damit ans Ziel kommt, dann ist das ja auch schon was.

von Sebbowicz (Gast)


Angehängte Dateien:

Lesenswert?

So also danke schonmal für alle Posts hier. Die Bedarfsfußgängerampel 
läuft nun und auch Programm zwei mit einer Kreuzung ist kein Problem. 
Allerdings sollen wir nun zwischen beiden Programmen per Schalter 
switchen können. Nun ist meine Frage wie ich das mache? Hab 
verschiedenes ausprobiert und entweder sagt er mit der vbuf ist falsch 
oder es ist nicht zugewiesen. Habe eine ganz normale Zuweisung mit 0 und 
1 gemacht. HAbe oben mal den Code in Form von .vhd Datei angehängt.
Danke für die Hilfe!

von Markus F. (mfro)


Lesenswert?

Das sieht auf den ersten Blick so falsch nicht aus.

Du solltest dich noch entscheiden, ob dein "Umschalter" nun "SW" oder 
"SWITCH" heißen soll. Ersteres fragst Du ab, letzteres würde 
(wahrscheinlich) etwas bewirken (wenn es denn mit irgendwas verbunden 
wäre).

von Sebbowiczs (Gast)


Lesenswert?

Wie gesagt beide Programme einzeln gehen ja. Ich weiß nur nicht wie ich 
es unsetzen muss. Das es an dem SWITCH bzw SW liegt weiß ich, sber nicht 
wie ich es beheben soll ;)

von P. K. (pek)


Lesenswert?

Sebbowiczs schrieb:
> weiß ich, aber nicht wie ich es beheben soll ;)

Einfach ausführen was Markus gesagt hat:

Du hast einen input SWITCH und ein lokales Signal SW auf welches Du 
überprüfst (welches aber nie zugewiesen wird). Entweder prüfst Du gleich 
auf SWITCH oder Du weist das Signal zu (SW <= SWITCH;).

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


Lesenswert?

Sebbowiczs schrieb:
> beide Programme
Es sind keine "Programme" sondern "Beschreibungen". Sonst würde VHDL 
nicht VHDL heißen, sondern VHPL...

> Das es an dem SWITCH bzw SW liegt weiß ich, sber nicht wie ich es
> beheben soll ;)
Der Synthesizer kann keine Kommentare auswerten:
1
   signal SW  : std_logic;                 -- SWITCH einlesen
Deshalb solltest du das besser mal selber machen:
1
...
2
architecture Behavioral of main_tut is
3
  signal SW  : std_logic;        -- lokales Signal für Schalter
4
  ...  
5
begin
6
  SW  <= SWITCH;                 -- SWITCH einlesen
7
8
  process begin
9
    wait until rising_edge(CLK);
10
    if (SW = '0') then
11
    ....

Oder, viel einfacher, den SWITCH gleich direkt verwenden:
1
...
2
architecture Behavioral of main_tut is
3
  ...  
4
begin
5
  process begin
6
    wait until rising_edge(CLK);
7
    if (SWITCH = '0') then
8
    ....
War das jetzt so schwierig?

BTW1:
Du hast hier Glück, dass der SWITCH quasistatisch ist. Denn sonst 
müsstest du ihn unbedingt einsynchronisieren!

BTW2:
1
use IEEE.STD_LOGIC_ARITH.ALL;
2
use IEEE.STD_LOGIC_UNSIGNED.ALL;
Der Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete" hat jetzt schon fast 5 
Jahre auf dem Buckel. Er gilt aber immer noch...

: Bearbeitet durch Moderator
von Sebbowicz (Gast)


Angehängte Dateien:

Lesenswert?

Ok der SWITCH funktioniert jetzt! Er zeigt mir jetzt allerdings noch 
folgenden Fehler bei STEPP an.
Ist die Syntax STEPP <= 0; nicht korrekt?

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


Lesenswert?

Sebbowicz schrieb:
> Er zeigt mir jetzt allerdings noch folgenden Fehler bei STEPP an
Da ist kein Fehler zu sehen! Du hast das falsche Bild gepostet.


Das hier...
1
      if(STEPCLKK /= 0) then
2
        STEPCLKK <= STEPCLKK - 1;
3
      end if;  
4
            
5
      if (STEPCLKK = 0) then
6
        ...
7
      end if;
... ginge so kompakter:
1
      if(STEPCLKK /= 0) then
2
        STEPCLKK <= STEPCLKK - 1;
3
      else
4
        ...
5
      end if;

: Bearbeitet durch Moderator
von Sebbowiczs (Gast)


Lesenswert?

Oh ja sorry :/ er zeigt mir als Fehler an Stepp is not used and 
unsigned.

von Sebbowiczs (Gast)


Angehängte Dateien:

Lesenswert?

Das ist der Fehler.

von Duke Scarring (Gast)


Lesenswert?

Sebbowiczs schrieb:
> er zeigt mir als Fehler an Stepp is not used and
> unsigned.
Das ist kein Fehler, sondern nur eine Warnung.

Duke

von Lattice User (Gast)


Lesenswert?

Duke Scarring schrieb:
> Sebbowiczs schrieb:
>> er zeigt mir als Fehler an Stepp is not used and
>> unsigned.
> Das ist kein Fehler, sondern nur eine Warnung.
>
> Duke

Ist eine berechtigte Warnung.

if Schachtelung ist falsch, die Abfrage if ( SW = '1' ) ist deswegen 
immer false, d.h. alles zu STEPP etc wird wegeoptimiert.

von Sebbowiczs (Gast)


Lesenswert?

Und wie kann ich das Problem lösen?

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


Lesenswert?

Irgendwie doppelt gemoppelt:
1
    if (STEPCLKK /= 0) then
2
      STEPCLKK <= STEPCLKK - 1;
3
    end if;  
4
    
5
    if (SW = '0') then
6
       ...
7
        
8
    if (SW = '1') then
9
      if(STEPCLKK /= 0) then
10
        STEPCLKK <= STEPCLKK - 1;
11
      end if;  
12
            
13
      if (STEPCLKK = 0) then
14
         ...
Aber Glück gehabt: STEPCLKK ist ein Signal und übernimmt den neuen Wert 
erst am Ende des Prozesses...

> Und wie kann ich das Problem lösen?
Zu deinem eigentlichen "Fehler": kontrollier mal, ob alle deine if und 
end-if zusammenpassen. Und wenn du das korrigierst, dann funktioniert es 
auf einmal...

Aber trotzdem ist dieser Beschreibungsstil Murks. Es reicht eigentlich 
eine einzige FSM, die die Lampen einschaltet. Und dann wird abhängig vom 
Schalter in dieser FSM herumgesprungen.

: Bearbeitet durch Moderator
von Lattice User (Gast)


Lesenswert?

Sebbowiczs schrieb:
> Und wie kann ich das Problem lösen?

Indem du einen anständigen Editor benutzt, der VHDL kennt und die 
Struktur anzeigt.

So sieht es derzeit aus:
1
  if (SW = '0') then
2
       ...
3
        
4
    if (SW = '1') then
5
       ....
6
    end if
7
  end if

Preisfrage, was ist falsch?
Wenn du es jetzt auch nicht siehst, solltest du auf Bäcker umsatteln.

von Sebbowiczs (Gast)


Lesenswert?

Ok Hab alles hinbekommen :) danke für die Hilfe!

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.