Forum: FPGA, VHDL & Co. VHDL XILINX Komponenten werden ohne Grund wegreduziert


von Thomas T. (warhammerth)


Angehängte Dateien:

Lesenswert?

Hallo, ich habe folgendes Problem.
Ich habe einen Lockin Filter gebaut, welcher 2 Signale Multipliziert, 
anschließend 2 fach über einen Tiefpass filtert und anschließend über 
den CORDIC IP Core Ampltide und Phase erkennt.
In Simulink habe ich die einzelnen VHDL Modelle als Blackbox eingebunden 
und bereits Simuliert (maht genau das was es soll)

Wenn ich jetzt die Komponenten in VHDL verbinde (per portmap), siehe 
LockInThomas.vhd, dann wird bei der synthese jeweils der Multiplikator 
und der erste Tiefpass weggeworfen und die ganze Sache funktioniert 
nicht.
(siehe lockin.png, das ist das Ergebniss der Synthese)  warum schmeißt 
er die Komponenten raus?

Ich habe im Portmap keinerlei Fehler gefunden.

Die Multiplikationen sind mit den verschobenen Bits so gewollt
(die Eingänge sollen wie (0 downto -15) behandelt werden, also quasi 
alles Nachkommastellen.

Im Anhang befinden sich alle 3 VHD Datein. die Komponente ampha ist der 
Cordic Block (IP)

Ich benutze Xilinx ISE 11.5 und habe einen Virtex 4 LX 60

von user (Gast)


Lesenswert?

meistens wird was weggeworfen, wenn funktionalität doppelt vorhanden ist

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


Lesenswert?

> meistens wird was weggeworfen, wenn funktionalität doppelt vorhanden ist
Aber die Synthese ist so freundlich, zu sagen, was da doppelt auftaucht.
Such mal nach dem Schalter "Keep Hierarchy"...
Beitrag "keep hierarchy verändert Funktion?"

BTW:
1
  if  clk'event and clk='1' then
2
    if clk_t=5 then
3
      clk_s<=not clk_s;
4
      :
Takte werden in FPGAs anders erzeugt.
Oder wie bekommst du deinen clk_s auf ein Taktnetz?

von Thomas T. (warhammerth)


Lesenswert?

Lothar Miller schrieb:
> BTW:  if  clk'event and clk='1' then
>     if clk_t=5 then
>       clk_s<=not clk_s;
>       :


ehm naja das ging bisher immer so :) er macht halt den clk / 10 oder 
nicht? bei allen anderen modellen klappt das.

 das keep hierachie änder nichts

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


Lesenswert?

> er macht halt den clk / 10 oder nicht?
Ja, aber dann wird dieser Takt mit normalen Routingressourcen (also 
nicht über ein Taktnetz) an die beteiligten Komponenten weitergeleitet. 
Das führt dazu, dass der Takt deutliche Laufzeiten (Skew) aufweisen kann 
und nicht mehr das gesamte FPGA wirklich synchron arbeitet...

von Thomas T. (warhammerth)


Lesenswert?

Ok ja, und wie macht man das richtig?

Bzw wichtig ist erstmal das andere Problem...

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


Lesenswert?

Thomas Thomas schrieb:
> Ok ja, und wie macht man das richtig?
Du hast Glück, die Synthese hat das automatisch erkannt und korrigiert. 
Sie hat einen Zähler bis 10 eingefügt und ein Clock-Enable draus 
gemacht...
Allerdings ist das nicht das, was du beschrieben hast  :-o

Und sowas ähnliches passiert dir vermutlich auch mit dem 
Multiplizierer...

von Thomas T. (warhammerth)


Angehängte Dateien:

Lesenswert?

Wenn ich einen zusätlichen 16 bit ausgang mache und folgende zeile 
einfüge am ende:
tt<=signal_multcos+signal_multsin-sigsinlp1-sigcoslp1;
dann erzeugt er mir alle komponenten, siehe bild.
Aber wie man sieht verbindet er auch die komponenten richtig. Wenn ich 
die zeile wieder entferne, fliegt wieder alles raus :(

von dr.Schmock (Gast)


Lesenswert?

Das Wegreduzieren von Komponenten kann mehrere Ursachen haben:
- Die Ausgangsports sind nicht verbunden oder werden von den folgenden 
Instanzen ignoriert.
- Die Eingangsports sind nicht verbunden oder nur mit konstanten 
Signalen verbunden
- Die Komponente funktioniert nicht (was von dir ja schon durch 
Simulation ausgeschlossen ist)

Der Synthesebericht sollte einen Hinweis auf das Problem geben können.

von dr.Schmock (Gast)


Lesenswert?

Dein letzter Post hat den Hinweis gegeben:
Im Tiefpass wird der Eingang "signal_in" überhaupt nicht verwendet! ;D

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


Lesenswert?

> Wenn ich einen zusätlichen 16 bit ausgang mache und folgende zeile
> einfüge am ende:
Dann kann er die lokalen Signale nicht mehr wegoptimieren, weil sie ja 
an einen IO-Port müssen. Aber irgendwie findet die Synthese, dass sich 
dein Design gut verkleinern liesse...

Man sieht übrigens wieder schön, wie die Sache mit den Clock-Enables 
gelöst wurde...   :-o

von Thomas T. (warhammerth)


Lesenswert?

dr.Schmock schrieb:
> Im Tiefpass wird der Eingang "signal_in" überhaupt nicht verwendet! ;D



oh man, so eine lapalie^^

entity tiefpass is

  Port ( ...
  signal_in : in std_logic_vector(15 downto 0):= (others => '0');
... );

...
signal sig_in  :   std_logic_vector(15 downto 0) := (others => '0');
...

prod1_low<=(lowpass_coef1)*sig_in;




das war der fehler, man warum hab ich das nicht gesehn ;)
jetzt dauert die synthese auch bedeutend länger^^
danke es geht jetzt super ;)

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.