www.mikrocontroller.net

Forum: FPGA, VHDL & Co. teiler in vhdl


Autor: michi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie konstruiert man teiler in vhdl, insbesondere vorteiler.

Wüßte gerne auch Hintergrund (Wieso)!:-)

BSP: Von 12MHz auf 100Hz


danke, michi

Autor: Harry (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn es nicht ganz genau sein soll, mache ich es zB folgendermaßen:


architecture Behavioral of clock_divide is

  signal clkDiv : std_logic_vector (18 downto 0);

begin

  Process (clock, reset)  --CLKDivider: Process (clock)
  begin
    if (reset ='1') then
      clkDiv <= "0000000000000000000";
    elsif (clock = '1' and clock'Event) then
      clkDiv <= clkDiv +1;
    end if;
  end Process;

  divided_clock_95 <= clkDiv(18);  --die auf ca. 95Hz runtergeteileten
50MHz
  divided_clock_6k <= clkDiv(12);  --die auf ca. 6kHz runtergeteileten
50MHz
  divided_clock_781k <= clkDiv(5); --die auf ca 781kHz runtergeteilten
50MHz

end Behavioral;

Autor: michi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke mal, für deine Mühe!:-)
Wie könnte ich das neue Taktsignal dann weiterverarbeiten?

z.B.: PWM?

Danke, michi:-)

Autor: Harry (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, einer der Ausgänge, divided_clock_xx, ist dann der Clock-Eingang
für ein anderes Modul/Shematic.

Gruß, Harry

Autor: Max Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht kommst du so genauer auf deine Frequenz.

Bei einem synchronen Design solltest du trotzdem jedes Flip-Flop mit
deinem Systemtakt verbinden und nur alle 120 Takte die Eingänge
überprüfen.

Also hier das quick and dirty Beispiel

architecture RTL of xyz is

   signal Counter : integer range 0 to 119;
   signal CLK_D120 : std_logic;
   -- Ich schaffe gerne mit Integer, das wird aber sowieso in Logik
umgesetzt.
begin
  -- nun kommt der process zum synchronen Teilen
  -- Das ganze wird dann zum log2(120) = 7 Bit breiten Binarzähler
  -- Der ausgang wird alle 120 Takte für einen Takt auf 1 gesetzt
  -- Das entspricht einer Frequenz von 100Khz bei Eingangsclock von
12MHZ
  -- Der Takt ist aber nicht symmetrisch!!!

  teile: process(Reset, CLK)
  begin
     if(Reset = '1') then
       counter <= 0;
       CLK_D120 <= '0';
     elsif( rising_edge(CLK)) then
       if ( counter < 119)
          CLK_D120 <= '0';
          counter <= counter + 1;
       else
          CLK_D120 <= '0';
          counter <= 0;
       end if;
     end if;
  end process;
-- in den folgeprocessen mit dem geteilten Clock nimmst du den CLK_D120
als Enable signal

-- also so

  funkt1:process(RESET, CLK)
  begin
     if (reset = '1') then
       Ausgang <= '0';
     elsif(rising_edge(clk)) then
        if (CLK_D120 = '1') then
          -- mach was du machen willst
          Ausgang <= Logik and Eingang;
        else
          Ausgang <= Ausgang
        end if
     end if;
   end process;
end;

Die schreibweise zur Flankenerkennung kommt aus der
Simulationstechnik.
Bei der Methode von meinem Vorschreiber, wird auch eine Flanke erkannt,
wenn vom nicht definierten Zustand auf 1 gesetzt wird.
Das ist aber bei einer reinen Simulation nicht umbedingt richtig.
dehalb besser immer die Libraryfunktion rising_edge() benützten.

Gruß


Max

Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Max:

ist in deiner Beschreibung ein kleiner Fehler?
"
elsif( rising_edge(CLK)) then
 if ( counter < 119)
    CLK_D120 <= '0';
    counter <= counter + 1;
 else
    CLK_D120 <= '0'; <- Hier müßte eine 1 zugewiesen werden, oder?
    counter <= 0;
 end if;
end if;

Autor: Max Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
:-) Genau erfasst.

Das war der Test, ob andere auch mitdenkst.
Natürlich  '1'. Man sollte sich seinen Beitrag genau durchlesen,
bevor man in absenden.

Gruß

Max

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.