mikrocontroller.net

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


Autor: Studiosi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity Taktteiler is
    Generic ( fclkin  : integer := 1000000;
              foutmin : integer := 1;
              fdiv0   : integer := 1;
              fdiv1   : integer := 10;
              fdiv2   : integer := 100;
              fdiv3   : integer := 1000;
              fdiv4   : integer := 10000;
              fdiv5   : integer := 100000);
    Port ( ClkIn   : in  STD_LOGIC;
           ClkOut  : out STD_LOGIC;
           Divider : in  STD_LOGIC_VECTOR (2 downto 0));
end Taktteiler;

architecture Behavioral of Taktteiler is
signal cnt,div   : integer range 0 to (fclkin/foutmin)/2-1  := 0;
signal cout      : std_logic := '0';
begin

  div <= (fclkin/fdiv0)/2-1 when Divider = "000" else
         (fclkin/fdiv1)/2-1 when Divider = "001" else
         (fclkin/fdiv2)/2-1 when Divider = "010" else
         (fclkin/fdiv3)/2-1 when Divider = "011" else
         (fclkin/fdiv4)/2-1 when Divider = "100" else
         (fclkin/fdiv5)/2-1;
         
  process begin 
     wait until rising_edge(ClkIn);
     if (cnt < div) then
        cnt  <= cnt+1;
     else 
        cout <= not cout;
        cnt  <= 0;
     end if;
  end process;
  ClkOut <= ClkIn when Divider = "110" else cout;

end Behavioral;
Mit ein paar kleinen Anpassungen dürfte das gehen... ;-)

Autor: Studiosi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den Taktteiler hatte ich etwas anders hinbekommen.(siehe unten)
Einzigstes Problem: Er taktet nich. auf Anhieb.
entity Frequenzteiler10_1 is
    Port (   clk_1Mhz         : in  STD_LOGIC;
        Reset           : in  STD_LOGIC;
        step_stop_entprellt   : in  STD_LOGIC;
        Takt_1Hz         : out  STD_LOGIC;
        Takt_10Hz         : out  STD_LOGIC;
        Takt_100Hz         : out  STD_LOGIC;
        Takt_1kHz         : out  STD_LOGIC;
        Takt_10kHz         : out  STD_LOGIC;
        Takt_100kHz       : out  STD_LOGIC);
end Frequenzteiler10_1;

architecture Behavioral of Frequenzteiler10_1 is

  
  Signal Teilerzaehler_a: std_logic_vector (3 downto 0);
  Signal Teilerzaehler_b: std_logic_vector (3 downto 0);
  Signal Teilerzaehler_c: std_logic_vector (3 downto 0);
  Signal Teilerzaehler_d: std_logic_vector (3 downto 0);
  Signal Teilerzaehler_e: std_logic_vector (3 downto 0);
  Signal Teilerzaehler_f: std_logic_vector (3 downto 0);
-- TAKTTEILER -----------------------------------------------------
Taktteiler_100kHz: process (Reset, clk_1Mhz)
begin
if reset='1' then
  Teilerzaehler_a <= "0000";
    elsif clk_1MHz'event and clk_1MHz='1' then
      if Teilerzaehler_a <= 9 then
      Teilerzaehler_a <= Teilerzaehler_a+1;
      else
      Teilerzaehler_a <= "0000";
      end if;
  Takt_100kHz      <= Teilerzaehler_a(3);  
  end if;
end process;

Taktteiler_10kHz: process (Reset, Teilerzaehler_a(3))
begin
if reset='1' then
  Teilerzaehler_b <= "0000";
    elsif Teilerzaehler_a(3)'event and Teilerzaehler_a(3)='1' then
      if Teilerzaehler_b <= 9 then
      Teilerzaehler_b <= Teilerzaehler_b+1;
      else
      Teilerzaehler_b <= "0000";
      end if;
  Takt_10kHz      <= Teilerzaehler_b(3);    
  end if;
end process;

Taktteiler_1kHz: process (Reset, Teilerzaehler_b(3))
begin
if reset='1' then
  Teilerzaehler_c <= "0000";
    elsif Teilerzaehler_b(3)'event and Teilerzaehler_b(3)='1' then
      if Teilerzaehler_c <= 9 then
      Teilerzaehler_c <= Teilerzaehler_c+1;
      else
      Teilerzaehler_c <= "0000";
      end if;
  Takt_1kHz      <= Teilerzaehler_c(3);    
  end if;
end process;

Taktteiler_100Hz: process (Reset, Teilerzaehler_c(3))
begin
if reset='1' then
  Teilerzaehler_d <= "0000";
    elsif Teilerzaehler_c(3)'event and Teilerzaehler_c(3)='1' then
      if Teilerzaehler_d <= 9 then
      Teilerzaehler_d <= Teilerzaehler_d+1;
      else
      Teilerzaehler_d <= "0000";
      end if;
  Takt_100Hz      <= Teilerzaehler_d(3);    
  end if;
end process;

Taktteiler_10Hz: process (Reset, Teilerzaehler_d(3))
begin
if reset='1' then
  Teilerzaehler_e <= "0000";
    elsif Teilerzaehler_d(3)'event and Teilerzaehler_d(3)='1' then
      if Teilerzaehler_e <= 9 then
      Teilerzaehler_e <= Teilerzaehler_e+1;
      else
      Teilerzaehler_e <= "0000";
      end if;
  Takt_10Hz      <= Teilerzaehler_e(3);    
  end if;
end process;

Taktteiler_1Hz: process (Reset, Teilerzaehler_e(3))
begin
if reset='1' then
  Teilerzaehler_f <= "0000";
    elsif Teilerzaehler_e(3)'event and Teilerzaehler_e(3)='1' then
      if Teilerzaehler_f <= 9 then
      Teilerzaehler_f <= Teilerzaehler_f+1;
      else
      Teilerzaehler_f <= "0000";
      end if;
  Takt_1Hz      <= Teilerzaehler_f(3);    
  end if;
end process;

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
    elsif clk_1MHz'event and clk_1MHz='1' then
    :
    elsif Teilerzaehler_a(3)'event and Teilerzaehler_a(3)='1' then
    :
    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?

Autor: Studiosi (Gast)
Datum:

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

Autor: Studiosi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.