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?
> 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... ;-)
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; |
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?
Das war falsch ausgedrückt. Er muss ja bis 1 Hz runtertakten und es dauert halt bis das Taktsignal am letzten Taktteiler ist.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.