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.