Hallo! Ich hab zur Zeit folgendes Problem mit einem Design: In einer entitty mit einem Ein- bzw. Ausgang existieren Instanzen zweier Module A und B mit jeweils einem Ein- bzw Ausgang. Nun möchte ich in einem Takt B hinter A schalten (Eingang entity auf Eingang A, dann Ausgang A auf Eingang B, Ausgang B auf Ausgang entity) und im nächsten Takt andersrum (Eingang entity auf Eingang B, Ausgang B auf Eingang A, Ausgang A auf Ausgang entity). Dafür habe ich vor die Eingänge von A und B jeweils einen 2-zu-1-MUX gehangen, welcher jeweils das Eingangssignal der entity und das Eingangssignal des anderen Moduls multiplext. Diese entity ist rein kombinatorisch, die Steuersignale für die Multiplexer, welche pro Takt wechseln, sollen dann mal von einer FSM kommen. Das Problem ist nun, dass ja nicht alle MUX-Signal-Möglichkeiten genutzt werden dürfen, da sonst kombinatorische Loops entstehen (Ausgang A auf Eingang B, Ausgang B auf Eingang A). Diese Möglichkeit soll natürlich nie als Steuersignal an die MUXer angelegt werden, aber die Synthese meckert, dass ein loop möglich ist und gibt mir keine ordentlichen Verzögerungszeiten für den kritischen Pfad usw. an. Ich habe bereits versucht, die MUXer über einen kleinen vorgeschalteten ROM, welcher nur die sinnvollen Steuersignalmöglichkeiten ohne loop enthält, anzusteuern. Der ROM bekommt ein vereinfachtes Steruersignal (Adresse) und sendet darüber die konstanten Steuersignale an die MUXer, damit der Synthese klar wird, dass es nur bestimmte Möglichkeiten gibt. Allerdings hilft das nichts (Synthese XST ISE 8.1j). Kennt jemand eine Lösung für das Problem und würde sie mir verraten? Vielen Dank eventuell.
Ich vergaß noch zu erwähnen, dass ich es auch schon mit logischer Anstuerung versucht habe, bei der sich bestimmte Kombinationen eigentlich ausschließen. Im obigen Beispiel wäre es möglich, genau die gleichen Steuersignale bei entsprechenden MUX-Eingängen zu benutzen, geht in meinem etwas umständlicheren Design leider nicht.
Ich weiss nicht, ob ich dein Problem richtig erfasst habe. Aber letztendlich hast du doch genau zwei mögliche Kombinationen, die du verwendest: Input -> A -> B -> Output und Input -> B -> A -> Output Hab ich das richtig begriffen? Dann kansnt du doch mit einem Bit beide Zustände auskodieren und es sollten keine "verbotenen" Zustände mehr auftreten können.
Ja, da hast du recht. Deswegen meinte ich mit dem zweiten Post, dass ich diese Möglichkeit leider nicht nutzen kann. In meinem Design sind vier Multiplexer vorhanden (die an einem loop teilhaben können), welche in vier Takten verschiedene Pfade schalten und es sind dabei Kombinationen wie etwa "0011","1010" usw. erlaubt, aber eben nicht so, dass man daraus direkte gleiche Steuersignale an mehrere anlegen könnte. Über Logik lässt sich das zwar alles beschreiben aber da erkennt die Synthese auch nicht wirklich, dass die "verbotenen" Zustände dann nicht möglich sind. Ich schreibe z.B. für das erste Steuersignal st1 <= a and b; und für das zweite st2 <= a; Dann ist theoretisch die Kombination st1=1 und st2=0 nie möglich, weil st1 durch a '0' wäre. Merkt die Synthese leider nicht.
Da fällt mir dann nur die Möglichkeit ein, die Loop mit nem FF zu unterbrechen. Aber ich denke, das ist nicht das, was du suchst. Oder du ignorierst das Gemecker von der Synthese und suchst dir den kritischen Pfad selber raus. Ist dann halt Handarbeit
Ja, werd das Gemecker wohl ignorieren, danke fürs Gedankenmachen. Das Problem wenn ich den kritischen Pfad manuell einstelle ist dann nur, dass es mir die MUXer wegsynthetisiert wenn ich da ein festes Steuersignal anlege und somit die Zeit des kritischen Pfades kürzer wird als sie eigentlich ist... .
Nee so meinte ich das nicht... Ich weiss nicht, für was du alles constraints vergeben kannst. Aber ich würd in dem Fall versuchen, allen Pfaden durch den Mux einen maxilam Delay per Constraint vorzugeben. Geht wahrscheinlich nur von FF-Ausganz zu FF-Eingang aber dann musst dir eben die FFs raussuchen, zwischen denen die Mux-Struktur liegt. dann überlegst du dir alle möglichen Kombinationen, die du mit deinem Mux einstellen kannst und welche FF-Ausgänge dannn auf welche FF-Eingänge geroutet werden. Und genau für diese Pfade setzt du ein MAX-Delay. Also wenn du dein Design mit 10MHz betreibst, dann darf der MAX-Delay durch den Mux eben (100ns - Setup-Zeit FF) sein. Die Syntehse wird dir dann diesen Pfad dahingehend optimieren. Er sollte dann auch in der Liste der kritischen Pfade auftauchen. Auf jeden Fall meckert aber dann die Synthese, wenn sie das Timing an der Stelle nicht einhalten kann. Die Pfade, die sowieso nie eingestellt werden, die können dir dann auch egal sein.
Versuche mal die Steuersignale für die fälle Input -> A -> B -> Output und Input -> B -> A -> Output in einem case auszuwerten. Beim ersten Fall setzt du die Multiplexer mit "0011", beim zweiten mit "1010" und bei allen anderen Fällen mit "----". "-" steht für don't care.
Hallo, und danke für die Vorschläge, ich habe beides versucht, leider geht es immer noch nicht. Na mal sehen, ich glaube ISE hatte die Möglichkeit irgendwo bestimmte Pfade per constraint auszuschalten, verusch ich mal.
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.