Forum: FPGA, VHDL & Co. synchroner Frequenzteiler


von hanne lehmann (Gast)


Angehängte Dateien:

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

von Norbert aus E. (Gast)


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.

von hanne lehmann (Gast)


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

von Jörn (Gast)


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?

von hanne lehmann (Gast)


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:

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

_____|^^^^^|________

von Jörn (Gast)


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.

von Stephan Hochberger (Gast)


Lesenswert?

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

von Henrik (Gast)


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

von Henrik (Gast)


Lesenswert?

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

von Jörn (Gast)


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.

von Henrik (Gast)


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

von hanne lehmann (Gast)


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 :-)

von hanne lehmann (Gast)


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)

von Jörn (Gast)


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.

von hanne lehmann (Gast)


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

von hanne lehmann (Gast)


Lesenswert?

@ jörn

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

von hanne lehmann (Gast)


Lesenswert?

hab das problem gelöst
muss es jetzt nur noch in worte fassen

von hanne lehmann (Gast)


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

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
Noch kein Account? Hier anmelden.