Forum: FPGA, VHDL & Co. Taster entprellen und Signal an GCK


von Studiosi (Gast)


Lesenswert?

Ich bin noch nicht so gut in der Programmierung mittels VHDL. Vielleicht 
habt Ihr ein paar Tipps.

Wie kann ich den CPLD verwenden um mit max 8 Tastern die Frequenzen 
1Mhz, 100kHz, 10kHz, 1kHz, 100 Hz, 10 Hz, 1 Hz und einen manuellen Takt 
einzuspeisen. Der Takt 1 Mhz kommt vom einen Oszillator außerhalb und 
wird intern heruntergetaktet bis 1 Hz.
Soll heißen: das soll wie bei einer Fernbedienung funktionieren. Für 
jede Frequenz soll ein Taster zur Verfügung stehen und mit einem 
Einzelschritttaster soll der Takt manuell in den CPLD eingespeist 
werden. Die Signale sollen alle als globales Taktsignal des CPLD XC9572 
dienen. Mein Problem ist u.a. das Entprellen der Taster und das 
gegenseitige Verriegeln der Taster, so dass nur eines funktionieren 
kann. (vielleicht ist das verriegeln ja auch nicht nötig). Wenn die 
Signale intern entprellt werden, wie bekomme ich das Signal an den 
Globalen Takteingang (GCK) des CPLD oder geht alles auch intern zu 
programmieren?

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


Lesenswert?

> Wie kann ich den CPLD verwenden
Welches CPLD?

Irgendwie kommt mir die Aufgabe bekannt vor...
Beitrag "Takt herunterteilen"
Beitrag "Frequenzteiler Hilfe"

Ich hätte das im Angebot:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4
5
entity Taktteiler is
6
    Generic ( fclkin  : integer := 1000000;
7
              foutmin : integer := 1;
8
              fdiv0   : integer := 1;
9
              fdiv1   : integer := 10;
10
              fdiv2   : integer := 100;
11
              fdiv3   : integer := 1000;
12
              fdiv4   : integer := 10000;
13
              fdiv5   : integer := 100000);
14
    Port ( ClkIn   : in  STD_LOGIC;
15
           ClkOut  : out STD_LOGIC;
16
           Divider : in  STD_LOGIC_VECTOR (2 downto 0));
17
end Taktteiler;
18
19
architecture Behavioral of Taktteiler is
20
signal cnt,div   : integer range 0 to (fclkin/foutmin)/2-1  := 0;
21
signal cout      : std_logic := '0';
22
begin
23
24
  div <= (fclkin/fdiv0)/2-1 when Divider = "000" else
25
         (fclkin/fdiv1)/2-1 when Divider = "001" else
26
         (fclkin/fdiv2)/2-1 when Divider = "010" else
27
         (fclkin/fdiv3)/2-1 when Divider = "011" else
28
         (fclkin/fdiv4)/2-1 when Divider = "100" else
29
         (fclkin/fdiv5)/2-1;
30
         
31
  process begin 
32
     wait until rising_edge(ClkIn);
33
     if (cnt < div) then
34
        cnt  <= cnt+1;
35
     else 
36
        cout <= not cout;
37
        cnt  <= 0;
38
     end if;
39
  end process;
40
  ClkOut <= ClkIn when Divider = "110" else cout;
41
42
end Behavioral;
Mit ein paar kleinen Anpassungen dürfte das gehen... ;-)

von Studiosi (Gast)


Lesenswert?

Den Taktteiler hatte ich etwas anders hinbekommen.(siehe unten)
Einzigstes Problem: Er taktet nich. auf Anhieb.
1
entity Frequenzteiler10_1 is
2
    Port (   clk_1Mhz         : in  STD_LOGIC;
3
        Reset           : in  STD_LOGIC;
4
        step_stop_entprellt   : in  STD_LOGIC;
5
        Takt_1Hz         : out  STD_LOGIC;
6
        Takt_10Hz         : out  STD_LOGIC;
7
        Takt_100Hz         : out  STD_LOGIC;
8
        Takt_1kHz         : out  STD_LOGIC;
9
        Takt_10kHz         : out  STD_LOGIC;
10
        Takt_100kHz       : out  STD_LOGIC);
11
end Frequenzteiler10_1;
12
13
architecture Behavioral of Frequenzteiler10_1 is
14
15
  
16
  Signal Teilerzaehler_a: std_logic_vector (3 downto 0);
17
  Signal Teilerzaehler_b: std_logic_vector (3 downto 0);
18
  Signal Teilerzaehler_c: std_logic_vector (3 downto 0);
19
  Signal Teilerzaehler_d: std_logic_vector (3 downto 0);
20
  Signal Teilerzaehler_e: std_logic_vector (3 downto 0);
21
  Signal Teilerzaehler_f: std_logic_vector (3 downto 0);
22
-- TAKTTEILER -----------------------------------------------------
23
Taktteiler_100kHz: process (Reset, clk_1Mhz)
24
begin
25
if reset='1' then
26
  Teilerzaehler_a <= "0000";
27
    elsif clk_1MHz'event and clk_1MHz='1' then
28
      if Teilerzaehler_a <= 9 then
29
      Teilerzaehler_a <= Teilerzaehler_a+1;
30
      else
31
      Teilerzaehler_a <= "0000";
32
      end if;
33
  Takt_100kHz      <= Teilerzaehler_a(3);  
34
  end if;
35
end process;
36
37
Taktteiler_10kHz: process (Reset, Teilerzaehler_a(3))
38
begin
39
if reset='1' then
40
  Teilerzaehler_b <= "0000";
41
    elsif Teilerzaehler_a(3)'event and Teilerzaehler_a(3)='1' then
42
      if Teilerzaehler_b <= 9 then
43
      Teilerzaehler_b <= Teilerzaehler_b+1;
44
      else
45
      Teilerzaehler_b <= "0000";
46
      end if;
47
  Takt_10kHz      <= Teilerzaehler_b(3);    
48
  end if;
49
end process;
50
51
Taktteiler_1kHz: process (Reset, Teilerzaehler_b(3))
52
begin
53
if reset='1' then
54
  Teilerzaehler_c <= "0000";
55
    elsif Teilerzaehler_b(3)'event and Teilerzaehler_b(3)='1' then
56
      if Teilerzaehler_c <= 9 then
57
      Teilerzaehler_c <= Teilerzaehler_c+1;
58
      else
59
      Teilerzaehler_c <= "0000";
60
      end if;
61
  Takt_1kHz      <= Teilerzaehler_c(3);    
62
  end if;
63
end process;
64
65
Taktteiler_100Hz: process (Reset, Teilerzaehler_c(3))
66
begin
67
if reset='1' then
68
  Teilerzaehler_d <= "0000";
69
    elsif Teilerzaehler_c(3)'event and Teilerzaehler_c(3)='1' then
70
      if Teilerzaehler_d <= 9 then
71
      Teilerzaehler_d <= Teilerzaehler_d+1;
72
      else
73
      Teilerzaehler_d <= "0000";
74
      end if;
75
  Takt_100Hz      <= Teilerzaehler_d(3);    
76
  end if;
77
end process;
78
79
Taktteiler_10Hz: process (Reset, Teilerzaehler_d(3))
80
begin
81
if reset='1' then
82
  Teilerzaehler_e <= "0000";
83
    elsif Teilerzaehler_d(3)'event and Teilerzaehler_d(3)='1' then
84
      if Teilerzaehler_e <= 9 then
85
      Teilerzaehler_e <= Teilerzaehler_e+1;
86
      else
87
      Teilerzaehler_e <= "0000";
88
      end if;
89
  Takt_10Hz      <= Teilerzaehler_e(3);    
90
  end if;
91
end process;
92
93
Taktteiler_1Hz: process (Reset, Teilerzaehler_e(3))
94
begin
95
if reset='1' then
96
  Teilerzaehler_f <= "0000";
97
    elsif Teilerzaehler_e(3)'event and Teilerzaehler_e(3)='1' then
98
      if Teilerzaehler_f <= 9 then
99
      Teilerzaehler_f <= Teilerzaehler_f+1;
100
      else
101
      Teilerzaehler_f <= "0000";
102
      end if;
103
  Takt_1Hz      <= Teilerzaehler_f(3);    
104
  end if;
105
end process;

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


Lesenswert?

1
    elsif clk_1MHz'event and clk_1MHz='1' then
2
    :
3
    elsif Teilerzaehler_a(3)'event and Teilerzaehler_a(3)='1' then
4
    :
5
    elsif Teilerzaehler_e(3)'event and Teilerzaehler_e(3)='1' then
Na gut, ein asynchroner Zähler.
Wenn man keine Angst vor Glitches hat und wenns klappt...

> Einzigstes Problem: Er taktet nich. auf Anhieb.
Wie bekommst du ihn dann zum Takten?
Welches CPLD?

von Studiosi (Gast)


Lesenswert?

Das war falsch ausgedrückt. Er muss ja bis 1 Hz runtertakten und es 
dauert halt bis das Taktsignal am letzten Taktteiler ist.

von Studiosi (Gast)


Lesenswert?

XC9572

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.