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
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.
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
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?
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: __|^^|__|^^|__|^^|__ _____|^^^^^|________
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.
Mach halt noch ne UND-Verknüpfung rein. Auf die ns Unsauberkeit sollte es bei 10kHz nicht ankommen.
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
P.S.: Die Ausgänge müssen als buffer deklariert werden, sonst gibts nen Fehler!
@ Henrik: Wenn ich Hanne richtig verstanden hab, will er beim Überlauf des Zählers nur einen Puls haben. So interpretiere ich zumindest seine Zeichnung.
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
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 :-)
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)
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.
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
@ jörn das müsste sich also mit deiner aussage decken wenn ich das richtig verstanden habe
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.