Counter Problem

Gast #1944611
Lesenswert?

Hallo, ich möchte im 1s-Takt einen Zähler hochzählen bzw. runterzählen 
lassen, zur Verfügung steht mir ein 50 MHz Clock Signal, d.h ich müsste 
20000 Clock Signale zählen, und dann einen anderen Zähler um 1 erhöhen, 
aber irgendwie funktioniert der Code nicht.Compiliert wird ohne Fehler! 
Kann mir jemand helfen?
1
architecture Verhalten of xc is
2

3
  signal s1, s0: std_logic_vector (3 downto 0);
4
  signal zaehler: std_logic_vector(14 downto 0) := "000000000000000";
5
  signal zaehler2: std_logic_vector(3 downto 0) := "0000";
6
  signal aufwaerts: boolean := true;
7
  
8
  
9
begin
10
  
11
  
12

13

14

15
  process(key(1)) begin
16
    if falling_edge(key(1)) then
17
      aufwaerts <= not aufwaerts;
18
    end if;
19
  end process;
20

21
  process(clock_50) begin
22
    if rising_edge(clock_50) then
23
        zaehler<= zaehler + 1;
24
        if (zaehler >= "100111000100000") then
25
        
26
          if aufwaerts then
27
            zaehler2 <= zaehler2 + 1;
28
          else
29
            zaehler2 <= zaehler2 - 1;
30
          end if;
31
          zaehler <= "000000000000000";
32
        end if;
33
      
34
    end if;
35
  end process;

Vielen Dank im Vorraus!
Moderator (Firma: Titel) Persönliche Seite #1944777
Lesenswert?

Mikey schrieb:
> aber irgendwie funktioniert der Code nicht.
Warum meinst du das? Wie stellst du das fest?

> Kann mir jemand helfen?
Ich würde da mal eine Simulation empfehlen...

Mit deinen zwei Takten:
1
    if falling_edge(key(1)) then
2
  :
3
    if rising_edge(clock_50) then
wirst du dir noch einige Schwierigkeiten an die Backe kleben...
Eine Flankenerkennung für ein externes Signal geht so:
http://www.lothar-miller.de/s9y/categories/18-Flankenerkennung

Sowas ist an Gefährlichkeit kaum zu übertreffen:
1
  process(key(1)) begin
2
    if falling_edge(key(1)) then  ---- AUTSCH, ein Taster als Taktquelle
3
      aufwaerts <= not aufwaerts;
4
    end if;
5
  end process;
Wenn dein Schalter prellt, dann hast du da z.B. 20-30 Taktflanken 
blitzschnell hintereinander. Das ist also eher ein Zufallsgenerator... 
:-)

Zusammenfassend nochmal meine Postulate für den geneigten VHDL-Anfänger:
1
Ein Design (insbesondere ein Anfängerdesign) hat genau 1 Takt, 
2
der immer auf dieselbe Flanke aktiv ist. 
3
Es gibt keinen (und schon gar keinen asynchronen) Reset.
4
Externe Signale werden über 2 Flipflops einsynchronisiert.
5
Jede Abweichung von diesen Regeln muß fundiert begründet werden können.
Gast #1944783
Lesenswert?

Mikey schrieb:

> ich möchte im 1s-Takt einen Zähler hochzählen bzw. runterzählen
> lassen, zur Verfügung steht mir ein 50 MHz Clock Signal, d.h ich müsste
> 20000 Clock Signale zählen, und dann einen anderen Zähler um 1 erhöhen,

20000? Sicher?
Zaehlt zaehler2 zufaellig 2500 mal zu schnell?

Gruss
Christian

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren