Synchroner binärzähler der bitbreite n, synchron rücksetzbar

Gast #5081089
Lesenswert?

Hallo ich bin ein Anfänger in vhdl und wollte fragen wie ich den Zähler 
da zu kriege, das er bei einen Nulldurchgang bei null anhalten soll? Und 
könnte mir einer erklären wie der Zähler funktioniert? Weil ich muss ihn 
in meiner mündlichen Prüfung erklären.
Ich würde mich sehr freuen wenn mir jemand hilft
1
Entity Counter is
2
 Generis (n: Integer:=64);
3
 Port    (Clk,res: In std_logik;
4
                q: Out std_logik_vector(n-1 downto 0));
5
End Counter;
6
Architecture behavioral of counter is
7
 Signal qtmp: std_logic_vector(n-1 Downto 0);
8
 Constant ones: std_logic-Vector(n-1 Downto 0):=other=>1
9

10
Beginn
11
 Process
12
 Beginn
13
  Wait until clk='1';
14
  If (res='1') Then 
15
   qtmp<=(others=>'0');
16
  Elsif (qtmp=ones) Then 
17
   qtmp<=(others=>'0');
18
   Else
19
     (qtmp<=qtmp+1)
20
   End if;
21
  End process;
22
  q<=qtmp;
23
End Beharvioral
Moderator (Firma: Titel) Persönliche Seite #5081161
Lesenswert?

Christian schrieb:
> Ich würde mich sehr freuen wenn mir jemand hilft
Mach das nächste Mal die [vhdl ] Tokens um deinen Code.

Poste doch mal den gesamten Code. Der beginnt schon vor "entity"...

Christian schrieb:
> Generis
> Beginn
Wäre es nicht sinnvoll, den Code einfach mal dem Simulator oder dem 
Synthesizer zu geben, dass die solche einfachen Fehler gleich mal 
anmäkeln können?

Christian schrieb:
> wollte fragen wie ich den Zähler da zu kriege, das er bei einen
> Nulldurchgang bei null anhalten soll?
Vergleiche den Zählerwert gegen "0000...000" und zähle dann nicht, wenn 
er diesen Wert hat.

> Und könnte mir einer erklären wie der Zähler funktioniert?
Das ist ein Binärzähler, der mit jedem Takt eins hochzählt. Dann wird 
unnötigerweise kontrolliert, ob alle Bits "111...11" sind und in diesem 
Fall der Zähler auf "000...000" gesetzt. Unötigerweise deshalb, weil das 
der Zähler sowieso von sich aus gemacht hätte.

Ich würde das Anhalten so machen:
1
Signal start: std_logic := '0';
2

3
Beginn
4
 Process
5
  Beginn
6
  Wait until clk='1';
7
  If (res='1') Then qtmp<=(others=>'0');
8
   start<='1';
9
  Elsif (qtmp/=(qtmp'range=>'0') or start='1') Then
10
   (qtmp<=qtmp+1)
11
   start <= '0';
12
  End if;
13
 End process;
14
 q<=qtmp;
15
End Beharvioral

Christian schrieb:
>> schon mal simuliert
> Ja
Das war aber 100% nicht dieser Code...
> aber nur mit Hilfe hab ich es geschafft
Ja, und was hast du daraus gelernt? Welche Erkenntnisse hast du 
gewonnen?

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