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

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.