mikrocontroller.net

Forum: FPGA, VHDL & Co. synchroner Frequenzteiler


Autor: hanne lehmann (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hallo

wer kann mir bei meinem problem helfen?

ich bin dabei einen synchronen frequenzteiler zu erstellen
das problem fängt bei der zweiten teilung an
von 32MHz auf 100kHz ist alles so wie es sein soll
wenn ich von 100kHz auf 10kHz teilen will fangen die probleme an
die länge des high impulses entspricht nicht der länge des high
impulses des höheren signals
ich habe schon verschiedene varianten durchexerziert komme aber nicht
zum gewünschten ergebnis
das programm wie es zur zeit ist findet sich im anhang wieder

Autor: Norbert aus E. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt muß ich aber doch mal kopfschüttelnd ein paar Frage stellen.

Warum quälen sich hier so viele mit VHDL&Co ab?

Die ganze Programierwelt versucht grafische Tools zur Erleichterung für
alle möglichen Programiersprachen einzubinden.

Für die Logikerstellung bei CPDL&Co gibt es seit 'menschengedenken'
die Schematics, zu deutsch Schaltsymbole für einzelne Logikeinheiten.

Dein Frequenzteiler hat hier die grösse eine Briefmarke, ist auf einen
Blick aussagekräftig und innerhalb von 30sec. kreiert.

Ich wiederhole meine Frage: Sind VHDL-Programiere Masochisten?

Fragt besorgt Norbert aus E.

Autor: hanne lehmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
als schematic hab ich das ding schon erzeugt - und da funktioniert es
auch
ich braue das teil aber noch in vhdl form - jetzt erzähle mir aber
nicht das ich das aus der schematic erzeugen lassen kann das weiss ich
selber - diese ist aber in einer strukturellen beschreibung

Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

die Aussage versteh ich nicht ganz:

"die länge des high impulses entspricht nicht der länge des high
impulses des höheren signals"

Wenn ich mir einen Taktteiler baue, dann wird meine Periodendauer
größer und die Frequenz niedriger und hat nicht mehr die gleiche
High/Low Länge meines Ursprungsignals...

Willst du einen Taktteiler der einen niederfrequenten Takt erzeugt?
oder soll er nur Pulse erzeugen?

Autor: hanne lehmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok war vieleicht blöd erklärt ich versuche es in eine zeichnung zu
packen also:

__|^^|__|^^|__|^^|__

__|^^|______________

so sollte es ausehen

die high impulse des geteilten signals reichen aber von einer H/L
Flanke bis zur nächsten also:

__|^^|__|^^|__|^^|__

_____|^^^^^|________

Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist die Eigenschaft von FFs. Sie übernehmen immer mit einer Flanke
die Daten vom Eingang. Mir fällt grad nichts ein wie du verhindern
kannst, dass das Signal kürzer als eine Taktperiode anliegt.

Autor: Stephan Hochberger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach halt noch ne UND-Verknüpfung rein. Auf die ns Unsauberkeit sollte
es bei 10kHz nicht ankommen.

Autor: Henrik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das muss aber gehen! Probier mal das:

Clk_1MHz: Process(clock_32MHz)
variable count   :  std_logic_vector (3 downto 0);
begin
  if (reset='1') then
  count:="0000";
  elsif (clock_32MHz='1' and clock_32MHz'event) then
  count := count+1;
  end if;

  if (count="0000") then
  clock_1MHz<= not clock_1MHz;
  end if;
end Process Clk_1MHz;

Das die Flanken anders waren, lag an :

if Z = 31 then clock_1MHz_int <= '1';
else clock_1MHz_int <= '0';

Du must nicht durch 32 teilen, sondern durch 16 und dann den Ausgang
toggeln!

Bedenke, dass du duch das "Anzapfen" des vorangegangenen Teilers eine
wesendliche Erhöhung der Signallaufzeit hast!

@Norber aus E: Ich "quäle" mich mit VHDL, weil ich da frei bin!
In 2 min habe ich ein Projekt von Lattice auf Xillinx, auf Altera etc.
portiert! Mach das mal mit einer Schematik! Mit VHDL kann ich mir meine
Bauteile selber konstruieren und diese zusammensetzen (sogar als
Schematik)!
Desweitern ist dieser Code bei umfangreicheren Projekten wesendlich
übersichtlicher. Laut meinem Lehrbuch lässt sich VHDL-Code vom Compiler
sogar besser optimieren.

Gruß Henrik

Autor: Henrik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P.S.: Die Ausgänge müssen als buffer deklariert werden, sonst gibts nen
Fehler!

Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Henrik:

Wenn ich Hanne richtig verstanden hab, will er beim Überlauf des
Zählers nur einen Puls haben. So interpretiere ich zumindest seine
Zeichnung.

Autor: Henrik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh sorry, hast recht! Habe ich übersehen...

Das es immer von steigender bis zur nächsten steigend geht hat er auch
explizit programmiert (clk='1' and clk'event).
Das es aber immer bei fallender Flanke passieren soll, ist sehr
merkwürdig.
Vielleicht ist das eine Lösung:
Wenn er die Abfrage in einen extra Schleife packt, mit nur
(clk'event), wird das Signal bei steigendem und fallendem Pegel
aktualisiert.
Wenn das Ganze noch um einen Impuls nach vorne schieben will, muß er
noch eine next_state-Variable einfügen, deren Wert erst bei der
nächsten steig. Flanke übernommen wird und er diese abfragen.

Gruß Henrik

Autor: hanne lehmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke erst mal für die vorschläge
aber ich glaube ich muss mit der berklärung der signale noch mal
anfangen
also:

als hauptfrequenz habe ich 32MHz (T = 31250 ps)
die erste teilung ist durch 32 d.h. ich erhalte eine frequenz von 1MHz
(T = 1µs), wobei die dauer des high impulses T = 31250 ps sein soll
dies setzt sich bei den weitern teilungen fort
weitere teilungen sind jeweils durch 10 (bishin zu 1Hz)
soll heißen das ich zum bsp bei einer frequenz von 10Hz (T = 100ms)
ebenfalls nur eine dauer des high impulses von 31250 ps habe usw.

bei der teilung von 32MHz auf 1MHz klappt das auch
bei einer weitern Teilung fangen die probleme an
das ganze teil asynchron zu machen ist kein problem
der haken liegt in der synchronität bzw. alle high impulse sollen die
selbe dauer haben bzw. sie sollen zur selben zeit anliegen (wobei das
zur selben zeit natürlich nur für die impilse gilt die zeitmässig auch
zur selben zeit anliegen können :-) )

__|^^|__|^^|__|^^|__|^^|__|^^|__|^^|__|^^|__|^^|__|^^|__|^^|__ ...

__|^^|______________|^^|______________|^^|______________|^^|__ ...

__|^^|________________________________|^^|____________________ ...

ok ich bin nicht gerade der beste erklärer - aber ich hoffe ich habe es
diesmal einigermassen verständlich rübergebracht :-)

Autor: hanne lehmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
noch als ergänzung

es ist wichtig das die dauer des high impulses die periodendauer von
31250ps nicht überschreitet, da das 32 MHz signal als clobaler takt für
die bauelemente gilt und die runtergetakteten signale als enable
fungieren, da aber alle elemente bei einem takt synchron reagieren
sollen ist die flankengleichheit der unterschiedlichen signale wichtig
(also kein zeitlicher versatz akzeptabel)

Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab für eine Schaltung auch Enablesignale generiert. Die hatten die
Breite von einem Taktzykus. Damit das Enablesignal auch zu einer Flanke
des Takts anliegt.

Schau dir mal den Fall an :

___|^^^^|____|^^^^|____ Takt
_____|^^^^|_____________ Enablesignal mit Aufzeit durch Logik


Das Enablesignal ist zwar da, aber das FF reagiert nicht, weil zur
steigenden Flanke fehler bzw. zu spät kommt. Die Enablesignale werden
normalerweise durch Logikpfade geroutet. Während der Takt auf einem
Lowskewnetz liegt. Das könnte Probleme machen. Das zeigt die P&R
Simulation.

Autor: hanne lehmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hab es jetzt mal etwas anders versucht
ich habe jeden teiler als einzelnes programm geschrieben und aus jedem
ein sysmbol erzeugt
diese hab ich dann in der schematic über und gatter verknüpft
die simulation zeigt das was ich haben will
jetzt muss ich das nur noch in vhdl bewerkstelligen
das problem liegt also eindeutig an der enable verknüpfung

Autor: hanne lehmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ jörn

das müsste sich also mit deiner aussage decken wenn ich das richtig
verstanden habe

Autor: hanne lehmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab das problem gelöst
muss es jetzt nur noch in worte fassen

Autor: hanne lehmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hatte die enable verknüpfung innerhalb der schleife der einzelnen
teilerfunktionen - diese muss natürlich ausserhalb sein - und siehe da
es wurde licht :-)
trotzdem vielen dank an alle die sich gedanken gemacht haben

danny

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.