Frequenzteiler funktioniert nicht -> Anfängerfrage

Gast #2671169
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;
Gast #2671182
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
Moderator (Firma: Titel) Persönliche Seite #2671786
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
Gast #2671810
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
#2671825
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...

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