Habe nur eine grundsätzliche Frage zur Synthese mit Xilinx ISE. Wenn ich in meine Design eine FSM habe dann wird ja pro durchlauf des Process nur ein State ausgeführt. Wird dies bei der Synthese für die Taktgeschwindigkeit beachtet oder rechnet der die Laufzeiten aller States zusammen? MFG Gast
> Wird dies bei der Synthese für die Taktgeschwindigkeit beachtet Ja. > oder rechnet der die Laufzeiten aller States zusammen? Es wird einfach die längste kombinatorische Verzögerung der Weiterschaltbedingungen der Statemachine hergenommen und daraus die maximale Taktfrequenz für diese FSM ermittelt. Wenn die Weiterschaltbedingung vom Zustand 34 in den Zustand 35 bei einer FSM mit z.B. 47 Zuständen langsam wäre, hätte es ja trotzdem keinen Sinn, die FSM in den Zuständen 1-33 und 35-47 schnell takten zu können, und nur im Zustand 35 langsam. > Wenn ich in meine Design eine FSM habe dann wird ja pro durchlauf > des Process nur ein State ausgeführt. Es werden zeitgleich alle States ausgeführt, weil für jeden state die Logik + das Speicherglied (Flipflop) da ist. Allerdings ist nur 1 State (bei One-Hot-Encoding z.B. nur 1 Flipflop) aktiv.
Also das Porblem des Thread wurde gelöst und zwar lag es an der Verwendung von Variablen und deren gleichzeitiger schreib und lesezugrif. Habe nun aber ein anderes Problem. Habe alles auf Signal umgestellt wenn ich einen bestimmten SIgnal etwas zuweise braucht die Synthese gleich ca 5 mal so lange und wenn ich diese Zweisung weglasse gehts schneller. Bei der Zuweisung wird ein integer wert in ein Array von integern geschrieben. MFG Gast
Bekomme derzeit auch immer die folgende Info habe aber im Inet nichts darüber gefunden. Vielleicht kann mir ja jemand sagen wich das wegbekomme. FlipFlop r.SwMatrix_7_0 has been replicated 1 time(s) INFO:Xst:1843 - HDL ADVISOR - FlipFlop r.SwMatrix_7_0 connected to a primary input has been replicated Ebenfalls macht er mir aus einen Signal eine Statemachine die keine ist Found finite state machine <FSM_0> for signal <r.activeBranchB>. ----------------------------------------------------------------------- | States | 9 | | Transitions | 337 | | Inputs | 24 | | Outputs | 9 | | Clock | clk80 (rising_edge) | | Reset | reset_n (negative) | | Reset type | asynchronous | | Reset State | 1000 | | Encoding | automatic | | Implementation | LUT | ----------------------------------------------------------------------- Danke im vorhinein für die Antworten MFG Gast
Gast schrieb: > Bei der Zuweisung wird ein integer wert in ein Array > von integern geschrieben. Oh ihr Softwerker, wann werdet ihr endlich den Unterschied zwischen einem FPGA und einem PC verstehen? Ein FPGA hat im ersten Moment keinen Speicher. Ein Integer array wird im FPGA aus einer Serie von Registern gebildet. Eine Zuweisung darauf erfordert einen Multiplexer, der zwischen den Registern umschaltet, je nach Größe des Arrays ist das dann ziemlich aufwendig, da brauchst Du dich nicht wundern, dass die Synthese länger braucht. Eine Möglichkeit ein Array im FPGA abzubilden die Block RAMs und manchmal verwendet der Compiler sie auch automatisch. Wenn Du aber wirklich geholfen werden will, dann mußt Du schon auch deinen Code zeigen, niemand kann erraten wie dein VHDL Programm aussieht und wo die Probleme sind.
Hi Danke für en Tipp mit den IntegerArray. Habe das Array mit Integer werden durch ein Array mit Unsigned(2 downto 0) ersetzt was den Code unlesbarer macht aber nichts an speed bei der synthese bringt.
1 | for i in 0 to 7 loop |
2 | if r.branchRxFlag(to_integer(unsigned(r.SwMatrix(i)))) = '1' and RxAct(i) = '0' then |
3 | -- switch
|
4 | TxAct(i) <= RxAct(to_integer(unsigned(r.dynamicBranch(to_integer(unsigned(r.SwMatrix(i))))))); |
5 | TxData(i) <= RxData(to_integer(unsigned(r.dynamicBranch(to_integer(unsigned(r.SwMatrix(i))))))); |
6 | TxChannel(i) <= RxChannel(to_integer(unsigned(r.dynamicBranch(to_integer(unsigned(r.SwMatrix(i))))))); |
7 | -- check if branch dont receive any more
|
8 | rin.branchRxFlag(to_integer(unsigned(r.SwMatrix(i)))) <= RxAct((to_integer(unsigned(r.dynamicBranch(to_integer(unsigned(r.SwMatrix(i)))))))); |
9 | elsif RxAct(i) = '1' and BlockingFlag(i) = '0' then |
10 | rin.branchRxFlag(to_integer(unsigned(r.SwMatrix(i)))) <= '1'; |
11 | rin.dynamicBranch(to_integer(unsigned(r.SwMatrix(i)))) <= to_unsigned(i, rin.dynamicBranch(0)'length); |
12 | end if; |
13 | end loop; -- i |
Liegt wohl eher daran das ich immer in einer anderen Position im array reinschreib oder? MFG Gast
Wahrscheinlich verstehst du eine for Schleife in VHDL falsch. Wenn du das so beschreibst, wird alles in der For-Schleife 8 mal parallel im FPGA abgebildet. Klar, dass das Synthesezeit braucht. Soweit ich das sehe, hast du einen riesengroßen multiplexer beschrieben. In VHDL beschreibt "for" lediglich, wieviel Mal das Konstrukt synthetisiert werden soll, es beschreibt keinen sequenziellen Ablauf. VHDL ist Hardware beschreiben, nicht programmieren. Ist schwer für Umsteiger aus der SW-Ecke, aber da muss man durch. Immer im Hinterkopf haben: Es gibt erst mal nur FlipFlops und Logik-Gatter (und paar spezielle Sachen wie BlockRam, ClockManager usw.) Außerdem ist deine Kombinatorische Verknüpfung unvollständig. Du musst im else Zweig zwingend beschreiben, was mit den Signalen, die du im if-zweig zuweist, passieren soll. Machst du das nicht, msust du dich auf das Synthese Tool verlassen, ob das "safe implementation" hat. Aber ich glaub, du musst noch viele Grundlagen lernen erst mal. ich glaube nicht, dass du einen kombinatorischen multiplexer beschreiben wolltest....
Hi Ja das habe ich eh schon überdacht das die For schleife eine Parallel sache ist in der HW. Aber ich wundere mich warum sich die Synthese Zeit locker verfünfacht wenn ich
1 | rin.dynamicBranch(to_integer(unsigned(r.SwMatrix(i)))) <= to_unsigned(i, rin.dynamicBranch(0)'length); |
drin habe im vergleich wenn ich die Zeile nicht drin habe. MFG Gast
Hi Also das mit den nicht zuweisen aller signale in den If zweigen ist in Ordnung. Ich lese immer nur vom signal r.xxx und scheibe in rin.xxx und ganz am Anfang vom Proces wird rin <= r gemacht. Das ist aus den ZweiPozessModell von Gaisler. MFG Gast
> warum sich die Synthese Zeit locker verfünfacht wenn ich
Nur mal zur Definition: die Synthesezeit ist die Zeit, die die Software
auf dem PC braucht, um dein Design umzusetzen. Da ist es doch egal, wenn
das 5 mal so lange dauert ;-)
Wenn du allerdings die Laufzeit oder die maximale Taktfrequenz
meinst, dann solltest du dir mal ansehen, was das für ein abgedrehter
dynamisch umschaltbarer Mostermux ist:
1 | elsif RxAct(i) = '1' and BlockingFlag(i) = '0' then |
2 | :
|
3 | rin.dynamicBranch(to_integer(unsigned(r.SwMatrix(i)))) <= to_unsigned(i, rin.dynamicBranch(0)'length); |
Klar, dass hier gewaltige Laufzeiten im Spiel sind :-o
Hi Ja unter Synthesezeit verstehe ich auch die Zeit bis der PC mit der Synthese fertig ist. Von der Frequenz her erreiche ich meine geforderten 80MHz sowohl mit als auch ohne den Statement. MFG Gast
> Das ist aus den ZweiPozessModell von Gaisler. Das man nicht ohne Nachdenken einfach so übernehmen sollte. Der VHDL-Coding-Style vom Hr. Gaisler sagt mir zB. weniger zu. Er kommt auch aus einer Ecke, in der FPGA/ASIC-Entwicklung prinzipbedingt stark Schmerz- und Formalismenbehaftet ist, nämlich Chips für Weltraum. Da wird noch nicht mal mit Besenstiel im Hintern gecoded, sondern mit Titanstahl bis ins Hirn. Es ist schon klar, dass man bei den potentiell riesigen Geldverlusten so arbeiten muss, aber deswegen muss man das nicht unbedingt auf alles übertragen ;)
> Ja unter Synthesezeit verstehe ich auch die Zeit bis der PC mit der > Synthese fertig ist. Die Synthese ist nur der erste Schritt beim Erzeugen eines Bitfiles. Nach der Synthese kommt der Mapper, dann kommt Place&Route, und dann wird ein Bitstrom erzeugt. Dauert nur die Synthese länger oder ist es eher P&R?
Hi also die Verfünfachung tritt bei der Synthese auf. Map, Place and route usw dauert nicht wirklich länger. MFG Gast
gast schrieb: > also die Verfünfachung tritt bei der Synthese auf. Map, Place and route > usw dauert nicht wirklich länger. Cool ;-) >> Das ist aus den ZweiPozessModell von Gaisler. > Das man nicht ohne Nachdenken einfach so übernehmen sollte. Richtig, z.B. bringt diese unnötige Vermischung von Signalen und Variablen mehr Verwirrung als Gewinn. Die Beispiele in dem Dokument http://www.gaisler.com/doc/vhdl2proc.pdf sind ja auch eigentlich blödsinnig einfach. Und trotzdem fast schon unlesbar. Sinnvoll erscheint mir allerdings die Kapselung von Ports in records.
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.