Forum: FPGA, VHDL & Co. Counter-Reset funktioniert nicht


von the-sandman (Gast)


Angehängte Dateien:

Lesenswert?

Hallo an alle,

ich bräuchte nur mal kurz eine kleine Hilfe bei einem Problem, was 
sicher kein Problem darstellt, aber an dem ich schon seit letzter Woche 
hänge.

Ich versuche einen Counter zu realisieren, der mein Taktsignal moduliert 
und das Tastverhältnis entsprechend ändert. Dies konnte ich soweit auch 
realisieren.
Als weiteres Feature soll ein Offset auf den Takt moduliert werden, um 
den Takt nach Wunsch in der Phase zu verschieben. Leider funktioniert 
nach der eingestellten Wartezeit der Reset des internen Counters nicht 
(Zeile 42). Ich habe schon viel versucht und konnte bis jetzt keinen 
Fehler entdecken.
Ich bin für jede Hilfe dankbar

MfG
the-sandman

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


Lesenswert?

>> -- Clearable loadable enablable counter
Der hat was ;-)

1
  PROCESS (ClockIn, Reset_N, ClockModulation, ClockDelay)
2
  BEGIN
3
    IF Reset_N = '0' THEN
4
      signalcount10 <= 0;
5
      signalclock <= '0';
6
      signalenable <= '0';
7
    ELSIF (ClockIn'EVENT AND ClockIn = '1') THEN
8
      IF signalenable = '1' THEN
9
        IF signalcount10 = ClockModulation THEN
10
          signalclock <= '1';
11
        END IF;
12
      ELSE
13
        IF signalcount10 = ClockDelay THEN
14
          signalcount10 <= 0;  --Counter-Reset funktioniert nicht     WEIL **************
15
          signalenable <= '1';
16
        END IF;
17
      END IF;
18
            
19
      IF signalcount10 = 9 THEN
20
        signalcount10 <= 0;  -- ********** hier noch eine Zuweisung kommt
21
        signalclock <= '0';
22
      ELSE
23
        signalcount10 <= signalcount10 + 1; -- ********** oder hier noch eine Zuweisung kommt
24
      END IF;      
25
    END IF;
26
  END PROCESS;

Die letzte Zuweisung an signalcount10 im Prozess wird verwendet.

Dreh das Ganze doch mal rum:
1
  PROCESS (ClockIn, Reset_N)
2
  BEGIN
3
    IF Reset_N = '0' THEN
4
      signalcount10 <= 0;
5
      signalclock <= '0';
6
      signalenable <= '0';
7
    ELSIF (ClockIn'EVENT AND ClockIn = '1') THEN
8
      IF signalcount10 = 9 THEN
9
        signalcount10 <= 0;
10
        signalclock <= '0';
11
      ELSE
12
        signalcount10 <= signalcount10 + 1; 
13
      END IF;      
14
 
15
      IF signalenable = '1' THEN
16
        IF signalcount10 = ClockModulation THEN
17
          signalclock <= '1';
18
        END IF;
19
      ELSE
20
        IF signalcount10 = ClockDelay THEN
21
          signalcount10 <= 0;  
22
          signalenable <= '1';
23
        END IF;
24
      END IF;
25
   END IF;
26
  END PROCESS;
Vielleicht hilft das ;-)



BTW:
Das reicht aus:
1
  PROCESS (ClockIn, Reset_N)
EDIT:
Noch besser wäre:
1
  PROCESS (ClockIn)
2
  BEGIN
3
    IF (ClockIn'EVENT AND ClockIn = '1') THEN
4
      IF signalcount10 = 9 THEN
5
        signalcount10 <= 0;
6
        signalclock <= '0';
7
      ELSE
8
        signalcount10 <= signalcount10 + 1; 
9
      END IF;      
10
 
11
      IF signalenable = '1' THEN
12
        IF signalcount10 = ClockModulation THEN
13
          signalclock <= '1';
14
        END IF;
15
      ELSE
16
        IF signalcount10 = ClockDelay THEN
17
          signalcount10 <= 0;  
18
          signalenable <= '1';
19
        END IF;
20
      END IF;
21
22
      IF Reset_N = '0' THEN -- synchroner Reset, weil 
23
        signalcount10 <= 0; -- die letzte Signalzuweisung 
24
        signalclock <= '0'; -- im Prozess gilt
25
        signalenable <= '0';
26
      end if;
27
   END IF;
28
  END PROCESS;

von the-sandman (Gast)


Lesenswert?

Genau das war das Problem.
Hätt ich eigentlich aus selbst sehen können, aber manchmal sieht man so 
Kleinigkeiten garnicht mehr ^^.

Vielen Dank für die Hilfe!!!

LG
the-sandman

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.