Forum: FPGA, VHDL & Co. Frage zur Synthese


von gast (Gast)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von Gast (Gast)


Lesenswert?

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

von gast (Gast)


Lesenswert?

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

von Klaus F. (kfalser)


Lesenswert?

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.

von gast (Gast)


Lesenswert?

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

von Christian R. (supachris)


Lesenswert?

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

von gast (Gast)


Lesenswert?

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

von gast (Gast)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> 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

von gast (Gast)


Lesenswert?

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

von Georg A. (Gast)


Lesenswert?

> 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 ;)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von gast (Gast)


Lesenswert?

Hi

also die Verfünfachung tritt bei der Synthese auf. Map, Place and route 
usw dauert nicht wirklich länger.

MFG Gast

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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