Forum: FPGA, VHDL & Co. Synchroner binärzähler der bitbreite n, synchron rücksetzbar


von Christian (Gast)


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

: Bearbeitet durch Moderator
von Roman B. (roman_b737)


Lesenswert?

Hallo Christian,

hast du schon dein Code simuliert?

Gruß Roman


von Christian (Gast)


Lesenswert?

Hallo Roman

Ja aber nur mit Hilfe hab ich es geschafft

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


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?

: Bearbeitet durch Moderator
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.