Forum: FPGA, VHDL & Co. Frequenzteiler funktioniert nicht -> Anfängerfrage


von Funkandsoda (Gast)


Lesenswert?

Hallo,

ich beschäftige mich erst seit 2 Tagen mit VHDL und einem Digilent 
Basys2 Board
Ich benötige für ein Projekt einen 1kHZ Ton, den ich über einen Pin 
ausgeben möchte, um damit einen kleinen Lautsprecher zu treiben, so dass 
er leise piept.

Der Frequenzteiler funktioniert auch, wenn ich einen Bitvector 
hochzählen lasse und dann ein einzelnes Bit abgreife, das halt immer hin 
und her toggelt.
Damit erreiche ich aber leider eben keine genauen 1 kHZ.

Nun versuche ich den Frequenteiler auf andere Art zu realisieren aber 
das funktioniert einfach nicht. Der Lautsprecher bleibt stumm obwohl die 
Pins korrekt zugewiesen sind (eben genauso wie in der Version oben).

Kann mir jemand einen Tipp geben wo mein Denkfehler liegt?

Bin sehr dankbar für jede Hilfe.
1
entity main is
2
  port (
3
    CLK: in std_logic;
4
    TON: out std_logic;
5
    RESET: in std_logic
6
    );
7
end main;
8
9
architecture Behavioral of main is
10
  signal COUNTER: std_logic_vector(15 downto 0);
11
  signal KHZ: std_logic;
12
begin
13
14
  CounterProcess: process(RESET, CLK)
15
  begin
16
    if (RESET='1') then
17
      COUNTER <= (others =>'0');
18
      KHZ <= '0';
19
    elsif rising_edge(CLK) then
20
      if COUNTER = "1100001101010000" then -- Zähler bis 50000
21
        KHZ <= '1';
22
        COUNTER <= (others => '0');
23
      else
24
        COUNTER <= COUNTER + 1;
25
        KHZ <= '0';
26
      end if;
27
    end if;    
28
    
29
  end process;
30
    
31
  TON <= KHZ;
32
  
33
end Behavioral;

von voodoofrei (Gast)


Lesenswert?

schon mal vorneweg: nur wenn der Zählerstand seinen Wert erreicht hat( 
in deinem Kommentar 50000) wird eine 1 ausgegeben, sonst 0

Ich geh jetzt mal von einer 50 MHz clk aus => da kommt dann natürlich 
nichts mehr (hörbares ;) ) aus dem LS.

quick & dirty Vorschlag:
1
signal COUNTER: integer range 0 to 50000;
2
3
   if (RESET='1') then
4
      COUNTER <= 0;
5
      KHZ <= '0';
6
7
 elsif rising_edge(CLK) then
8
      COUNTER <= COUNTER + 1;
9
      if COUNTER = 50000 then -- Zähler bis 50000
10
        KHZ <= '0';
11
        COUNTER <= 0;
12
      elsif COUNTER = 25000 then
13
        KHZ <= '1';
14
      end if;
15
    end if;

Füge das mal in deinen Code ein

von Christoph F. (funkandsoda)


Lesenswert?

Ich danke Dir vielmals für die schnelle Hilfe!
Klappt jetzt und ich habe nun auch verstanden wieso es vorher nur mit 
der anderen Version ging ;-).

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


Lesenswert?

Funkandsoda schrieb:
> RESET: in std_logic
Lern nicht gleich so einen Käse: Reset... :-/ und dazu noch asynchron...
Siehe dazu den Beitrag "Detailfrage Reset"

von Duke Scarring (Gast)


Lesenswert?

Lothar Miller schrieb:
> Lern nicht gleich so einen Käse:

Und wenn wir schon mal dabei sind:

Funkandsoda schrieb:
> signal COUNTER: std_logic_vector(15 downto 0);
[...]
>         COUNTER <= COUNTER + 1;

Verwende die aktuellen Bibliotheken zum Rechnen:
Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"

Duke

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


Lesenswert?

Duke Scarring schrieb:
> Und wenn wir schon mal dabei sind:
Da fällt mir noch ein:
>>> signal COUNTER: integer range 0 to 50000;
Das sind 50001 Schritte!
>>> if COUNTER = 50000 then -- Zähler bis 50000
>>>      COUNTER <= 0;
Der Zähler zählt also 50001 Takte. Ja, klar: halb so schlimm. Aber 
probier das mal mit dem Zählerwert "10", da sind es dann schon 10% 
Fehler... :-o

von voodoofrei (Gast)


Lesenswert?

Hast recht - hab gepfuscht (nicht umsonst quick & dirty geschrieben).

Mach ich normalerweise so:
1
constant cval: integer := 50000
2
3
signal COUNTER: integer range 0 to cval-1;
4
5
if COUNTER = cval-1 then -- Zähler bis 50000

von Christoph F. (funkandsoda)


Lesenswert?

Vielen Dank für die vielen Tipps. Hab noch eine kleine Frage: hat jemand 
spontan eine Idee wieso mir mein Multimeter bei der berichtigten Version 
keine Frequenz anzeigt? Bei meinem ersten Versuch mit dem Auslesen des 
einen kippenden Bits klappt das problemlos,trotz der krummen Frequenzen 
und ich suche gerade nach dem Grund dafür...

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.