www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Frequenzteiler mit CPLD


Autor: full well (realjey)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,

noch eine Anfängerfrage:

Ich möchte einen CPLD-Baustein dazu bringen, ein 32Mhz-Signal (Vss 5V) 
welches durch einen Quarz-Oszi "eingespeisst" wird, soweit runter zu 
teilen, das sich z.B. ein 4MHz-Signal (Vss 5V) als Ausgang eines von mir 
bestimmten Pins ergibt. Könnte mir hier jemand einen Ansatz nennen. Ich 
erwarte nicht die Lösung in Form eines VHDL-Codes, sondern nur 
gedankliche Ansatzpunkte ;) Ich bin bereits soweit, das ich dies 
theoretisch mit den vom CPLD zur Verfügung gestellten T-FlipFlops 
realisieren könnte...dafür benötige ich 3 T-FF, ist das richtig (da ein 
T-FF meine Frequenz jeweils durch 2 teilt)?

THX
J

Autor: dave (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
frequenz tut man am besten mit ffs teilen. ja, ein ff kann die frequenz 
durch 2 teilen

Autor: John-eric K. (mockup)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na einen Zähler von 0-7, binär also 3 Bit
und das Höchste Bit ist dein Signal für den Pin.
Damit ist du 50% high und 50%Low

Pseudocode
==========
count std_logic_vector(2 downto 0);

if count ="111" then
   count <= "000";
else
   count <= count + 1;
end if;

Signal_Out <= count(2);

John

Autor: Robert S. (razer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
John-eric K. schrieb:
> if count ="111" then
>
>    count <= "000";
>
> else

Nicht nötig, da ein std_logic_vector den Überlauf von selbst macht.

Autor: John-eric K. (mockup)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt vergessen ;-)

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

Bewertung
0 lesenswert
nicht lesenswert
>> Nicht nötig, da ein std_logic_vector den Überlauf von selbst macht.
Diese Erklärung ist zu simpel und stimmt so unbesehen nicht. Die 
korrekte Aussage wäre:
Der in den Bibliotheken
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
überladene Operator + macht den Überlauf.

Aber allgemein gilt: mit std_logic_vector sollte man nicht rechnen, denn 
abhängig von der eingebunden Library (signed/unsigned) kommen u.U. 
andere Ergebnisse heraus...

Besser ist die Verwendung der
use ieee.numeric_std.all;
und der darin enthaltenen (Vektor-)Datentypen signed und unsigend:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
:
count unsigned(2 downto 0) := "000";
:
  if count ="111" then
    count <= "000";
  else
    count <= count + 1;
  end if;
:

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.