Forum: FPGA, VHDL & Co. Kombinatorische loops bei Multiplexern


von na (Gast)


Lesenswert?

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.

von na (Gast)


Lesenswert?

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.

von Schlumpf (Gast)


Lesenswert?

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.

von na (Gast)


Lesenswert?

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.

von Schlumpf (Gast)


Lesenswert?

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

von na (Gast)


Lesenswert?

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... .

von Schlumpf (Gast)


Lesenswert?

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.

von ----- (Gast)


Lesenswert?

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.

von na (Gast)


Lesenswert?

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