Forum: FPGA, VHDL & Co. LED Dimmer Projekt


von Michael M. (no_rt)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

Vorweg:
Meine VHDL-Kenntnisse halten sich stark in Grenzen, da ich komplett neu 
in Welt der Hardwarebeschreibung bin!

Zu meinem Leidwesen muss ich jedoch ein Projekt bearbeiten, welches über 
einen kurzen Tastendruck LEDs ein- bzw. ausschalten, und einen 1s langen 
Druck der selben Taste die LEDs dimmen soll (heller und dunkler im 
Wechsel). Insgesamt soll sich die Helligkeit zwischen 8 Stufen in 0,5s 
Schritten verändern.

Nun zu meinem Problem:
Mit dem angehängten Programm komme ich nicht einmal über die Synthese 
hinweg, da mir der Error "Xst:827" ausgespuckt wird.
Gesamter Fehlercode:
ERROR:Xst:827 - "H:/XXXX" line 60: Signal change_pwm cannot be 
synthesized, bad synchronous description. The description style you are 
using to describe a synchronous element (register, memory, etc.) is not 
supported in the current software release.

Nach dem Durchlesen etlicher von Google ausgespuckten Seitenvorschlägen 
bin ich lediglich bei der Fehlerbeschreibung einen Schritt weiter. Denn 
der Fehler tritt wohl dann auf, wenn ein FF mit 2 unterschiedlichen 
Takten angesteuert wird. -> Hilft mir nur leider programmtechnisch gar 
nicht weiter, da ich KOMPLETT auf dem Schlauch stehe und nicht weiß wie 
ich mein Programm dahingehend verändern soll, dass es endlich seinen 
Dienst erfüllt.

Hoffentlich kann mir von euch jemand weiterhelfen und oder Denkanstöße 
liefern!!

Ich arbeite mit dem "Xilinx ISE Project Navigator" und einem 
"Spartan-3A/3AN FPGA Starter Kit Board".

Vielen Dank schon mal!! :)

von Duke Scarring (Gast)


Lesenswert?

Wie würdest Du denn das Problem ohne VHDL lösen? Nur mit digitalen 
Schaltkreisen. Wenn Du Dir das überlegt hast, kommt die Umsetzung mit 
VHDL.

Duke

von Falk B. (falk)


Lesenswert?

@ Michael Mü (no_rt)

>Meine VHDL-Kenntnisse halten sich stark in Grenzen, da ich komplett neu
>in Welt der Hardwarebeschreibung bin!

Naja.

>Zu meinem Leidwesen muss ich jedoch ein Projekt bearbeiten, welches über
>einen kurzen Tastendruck LEDs ein- bzw. ausschalten, und einen 1s langen
>Druck der selben Taste die LEDs dimmen soll (heller und dunkler im
>Wechsel). Insgesamt soll sich die Helligkeit zwischen 8 Stufen in 0,5s
>Schritten verändern.

Das ist eine logischer Ablauf. Den kann man mit verschiedenen Methoden 
praktisch realisieren. VHDL ist nur eine Möglichkeit, und dazu nicht mal 
die sinnvollste.

>der Fehler tritt wohl dann auf, wenn ein FF mit 2 unterschiedlichen
>Takten angesteuert wird.

Tja, ist wohl so. Braucht auch keiner.

>-> Hilft mir nur leider programmtechnisch gar
>nicht weiter, da ich KOMPLETT auf dem Schlauch stehe und nicht weiß wie
>ich mein Programm dahingehend verändern soll, dass es endlich seinen
>Dienst erfüllt.

Ohne ein Minimum an Grundlagenwissen wirst du das Problem nicht lösen.

Du brauchst einen Takt für dein System. Und zwar einen untypisch 
niedrigen, vielleich 100 Hz. Den muss man mit einem Teiler aus dem 
anliegenden Takt ableiten, meist haben die FPGA Boards so um die 50 MHZ 
und mehr. Deine Taste muss entprellt werden, das kann man im FPGA 
machen. Dann brauchst du eine statemachine, welche die Logik 
enthält, um in Stufen hoch und runter zu dimmen. Und der Dimmer selber 
braucht eine PWM Logik.

Alles in Allem viel Arbeit, wenn man nahezu keine Grundlagen hat.

von Michael M. (no_rt)


Lesenswert?

Danke für die schnellen Antworten!

Ich bin mir durchaus bewusst, dass man diese Problemstellung auch auf 
anderem Wege lösen kann. Leider ist die Nutzung von VHDL eine Vorgabe.

Welche Komponenten für die Umsetzung benötigt werden ist mir auch 
bekannt. Zumindest hatte ich gehofft, dass meine im Ausgangsbeitrag 
angefügte Datei z.B. eine PWM enthält, welche der Aufgabe entsprechend 8 
Schritte hoch bzw. runter zählt. ;)

Die Lösung meines Problems sehe ich leider auch nicht in der Entprellung 
des Tasters..

von berndl (Gast)


Lesenswert?

Michael Mü schrieb:
...
> Die Lösung meines Problems sehe ich leider auch nicht in der Entprellung
> des Tasters..

Stimmt, das ist dein geringstes Problem...

Was mir so beim drueberfliegen aufgefallen ist:
1
USE IEEE.STD_LOGIC_1164.ALL;
2
USE IEEE.STD_LOGIC_ARITH.ALL;
3
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
4
USE IEEE.NUMERIC_STD.ALL;
Wer bringt euch so einen SCHEISS bei? Such' mal nach sowas wie 
'std_logic_arith obsolete'...
1
  led_control: process(CLK)
2
    variable clk_cnt : integer range 0 to 50000000;
3
    variable pwm_cnt : integer range 0 to 1000;
4
    variable int_cnt_0 : integer range 0 to 7;
5
    variable direction : integer range 0 to 1;
6
    variable change_pwm : integer range 0 to 1;
7
    variable dimm : integer range 0 to 1;
da hatte ich schon fast aufgegeben... Such' mal nach sowas wie 'variable 
vs signal'...
Ich wuerde dir echt raten, diese ganzen Signale auch als Signale zu 
deklarieren. Und zwar nicht als 'integer' (sind nicht per se schlecht), 
sondern als std_logic(_vector) und unsigned. Dann kriegst du auch eher 
ein Gefuehl, was du da wirklich baust.
Und einen Simulator hat dein Design noch nie gesehen, stimmts? Weil ohne 
Initialisierung schmeisst der Simulator nur 'U' und 'X'...

Zu deiner eigentlichen Fehlermeldung: In deinem (einzigen) 'process' 
hast du x-mal 'if rising_edge...'. Und du setzt deine Signale in 2 
verschiedenen 'if rising_edge...' Bloecken. Dein FPGA hat aber nur FFs, 
die einen Takteingang haben. Wie soll das also auf reale HW abgebildet 
werden?
Schreib' das ganze mal mit mehreren 'process ...' und in jedem 'process' 
nur ein dickes, fettes, 'if rising_edge (clk) then' (und nix mit 'and 
xxx=0' oder so.

Und dann simuliere das ganze mal. Du kannst dir da ja jedes einzelne 
Signal genau anschauen und entscheiden, ob das so laeuft wie du dir das 
vorstellst.

Weiter unten im Code habe ich dann nicht mehr nachgeguckt...


PS: Der Code sieht aus wie Software, nicht wie eine Hardwarebeschreibung

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


Lesenswert?

berndl schrieb:
> da hatte ich schon fast aufgegeben...
Ich komme da schon ins Stocken:
1
  -- Necessary Header Files
Hoppala, "Header Files", ein C-Programmierer...

Das ist auch nicht schlecht:
1
  led_control: process(CLK)
2
     :
3
  begin
4
    if (rising_edge(CLK) and BTN = '1') then
5
       change_pwm := 1;
6
       :
7
    if (rising_edge(CLK) and BTN = '0') then
8
       change_pwm := 0;
9
       :
10
    if (rising_edge(CLK) and dimm = 1) then
11
       :
12
  end process;
Aber man muss dem Synthesizer ja auch mal eine anständige Aufgabe 
geben...

Michael Mü schrieb:
> Denn der Fehler tritt wohl dann auf, wenn ein FF mit 2 unterschiedlichen
> Takten angesteuert wird.
Was sollte das auch für ein Bauteil sein, das sowas könnte?
Aber es ist ja nicht mal ein unterschiedlicher Takt, sondern eine 
ziemlich verbastelte und hirnige Beschreibung um den Clock-Enable herum.
http://www.lothar-miller.de/s9y/archives/1-Clock-Enable-in-einer-ISE-VHDL-Beschreibung.html

berndl schrieb:
> Und dann simuliere das ganze mal.
Die Simulation ist falsch, denn die Sensitivliste ist unvollständig, 
weil BTN und dimm fehlen. Blöderweise kannst du aber eine Variable nicht 
in die Sensitivliste aufnehmen...

Aber ich würde auch mal einfach sagen, dass man diese Aufgabe tadellos 
simulieren kann. Und dass eine fehlerfreie Simulation bei diesem Design 
hier vor dem Synthesebutton kommen muss. Der Simulator ist der primäre 
Hardwaredebugger.

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.