Forum: FPGA, VHDL & Co. VHDL: Signal um beliebige Takte verzögern


von Till F. (Gast)


Lesenswert?

Hey,

ich möchte ein Signal um mehrere Takte verzögern. Meine Vorgehen ist 
folgendes:
1
delayme : process (clk)
2
if clk'event and clk = '1' then
3
  signal_d3 <= signal_d2;
4
  signal_d2 <= signal_d1;
5
  signal_d0 <= signal;
6
end if;

Ich bin bei der Fehlersuche hier im Forum auf einen anderen Thread 
gestoßen, wo das genauso gemacht wird und anscheinend kein Problem gibt: 
Beitrag "VHDL: Signal um beliebige Takte verzögern"

Bei mir werden bei der Synthese aber irgendwie die zwischen signal und 
signal_d3 liegenden Stufen wegoptimiert: das Ganze wird auf einem FPGA 
implementiert, und der Xilinx FPGA-Editor zeigt mir im fertigen Design 
an, dass "signal" lediglich über ein Synchronisierungselement mit 
"signal_d3" verbunden ist. Tatsächlich hat das Signal auch nur 1 Takt 
Verzögerung, wenn man den FPGA konfiguriert. Es gibt sogar keinen 
Unterschied, wenn ich den Prozess abändere:
1
delayme : process (clk)
2
if clk'event and clk = '1' then
3
  signal_d3 <= signal;
4
end if;

Kann hier jemand einen Gedankenfehler sehen, oder weiß sonstwie Rat? Ich 
kann mir nicht recht vorstellen, dass eine derartige Optimierung, welche 
ja das Verhalten beeinflusst, wirklich stattfindet.

von Maik H. (littlechip)


Lesenswert?

Till F. schrieb:

>
1
> delayme : process (clk)
2
> if clk'event and clk = '1' then
3
>   signal_d3 <= signal_d2;
4
>   signal_d2 <= signal_d1;
5
>   signal_d0 <= signal;
6
> end if;
7
>

Guck dir das noch mal ganz genau an...

von Till F. (Gast)


Lesenswert?

Wenn du meinst, dass der Syntax nicht stimmt (begin, end process, ... 
fehlt), dann ist das nicht das Problem, steht in meinem original-VHDL 
natürlich drin (kanns ja auch synthetisieren). Hab hier nur schnell das 
Prinzip rein getippt, weil der Originalquelltext bischen verwirrender 
ist:
1
transfer_control : process (clk, rst)
2
  ...
3
begin
4
5
  if rst = '1' then
6
    ...
7
  elsif clk'event and clk = '1' then
8
    ...  
9
    for i in 0 to n-1 loop
10
      wr_en_from_ctrl(i) <= wr_en_from_ctrl_delay2(i);
11
      wr_en_from_ctrl_delay2(i) <= wr_en_from_ctrl_delay1(i);
12
      wr_en_from_ctrl_delay1(i) <= wr_en_from_ctrl_delay0(i);
13
      wr_en_from_ctrl_delay0(i) <= A and B and C;
14
    end loop;
15
    ...
16
  end if;
17
18
end process;

Wenn du glaubst, dass mit dieser Verkettung das Signal immer innerhalb 
eines Taktes von signal->signal_d1->...->signal_d3 wandert ist das ja 
nicht richtig: Signale ändern ja erst ganz am Ende vom Prozess ihren 
Wert und somit gibt es die nächeste Änderung erst beim nächsten 
clk'event.

Ich sehe nun auf jeden Fall auch nach einem zweiten Blick kein Problem, 
wäre schön, wenn du genauer sagst was falsch ist, wenn es wirklich so 
offensichtlich ist :D

von Till F. (Gast)


Lesenswert?

Achso, und falls du meintest, dass ich "signal_d1 <= signal_d0" auch 
vergessen habe liegts genauso daran, dass es im Beispiel nur ums Prinzip 
ging :D

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


Lesenswert?

> weil der Originalquelltext bischen verwirrender ist: ...
Der ist nicht verwirrender, sondern komplett anders.

>>> Signale ändern ja erst ganz am Ende vom Prozess ihren Wert
Fast richtig. Signale übernehmen den zuletzt zugewiesenen Wert am Ende 
von Prozessen oder beim nächsten wait.
Und weil immmer noch nicht der gesamte Quelltext (nicht mal die 
Signaldefinitionen) zu sehen ist, bleibt nur Schulterzucken...

> Ich sehe nun auf jeden Fall auch nach einem zweiten Blick kein Problem,
Ich auch nicht, aber ich weiß, dass Synthesetools mit bestimmten 
Beschreibungen nichts anfangen können. Eine recht einfache ist z.B.
   a <= b after 10 ns;
Das wird schon auch synthetisiert, nur eben ohne die Verzögerung. Und 
deine for-Schleife sieht recht grenzwertig aus. Was bekommst du für 
Meldungen/Warnungen bei der Synthese? Stolpert der Synthesizer irgendwo?

von Till F. (Gast)


Lesenswert?

> Der ist nicht verwirrender, sondern komplett anders.
> Und deine for-Schleife sieht recht grenzwertig aus.
Naja - Zweck der For-Schleife erklärt sich mit dem Typ von 
wr_en_from_ctrl:
1
type mytype is array ( n-1 downto 0 ) of std_logic_vector ( m-1 downto 0 );
wobei m, n Parameter sind. Ich denke nicht, dass das wirklich anders ist 
als das was ich mit meiner zugegeben fehlerhaften und somit schlechten 
Vereinfachung sagen wollte.

> a <= b after 10 ns;
> Das wird schon auch synthetisiert, nur eben ohne die Verzögerung.
Mir ist schon klar, dass es bestimmte Dinge gibt, die nicht 
synthetisiert werden können :)

> Was bekommst du für
> Meldungen/Warnungen bei der Synthese? Stolpert der Synthesizer irgendwo?
Natürlich einige die nichts mit der Sache zu tun haben (instantiating 
black box module, ...) aber auch ein paar Sachen bezüglich den obigen 
Signalen. Jedoch nur für einen Teil davon: nämlich für die, welche zu 
Testzwecken auf logic0 liegen. Hier ist es ja völlig richtig, dass diese 
während der Synthese verschwinden.

Mir ist klar, dass mir auf dieser Ebene niemand ohne mehr Sourcecode und 
Reports weiterhelfen kann. Aber das ist einfach zu viel für so ein Forum 
(außer es ist jemandem richtig langweilig). Hatte gehofft, dass ich 
hier auf ein weniger spezifisches Problem gestoßen bin. Wenn mein 
Vorgehen zum Verzögern der Signale prinzipiell richtig ist, ist meine 
Frage eigentlich beantwortet... und eigentlich müsste es kann klappen 
grummel

Leider jetzt schon arg spät in Syd, muss ich halt morgen weitersuchen :(

von Kai (Gast)


Lesenswert?

Hallo Till,

hast Du an das ELSE in der IF Anweisung gedacht?

Ohne das ELSE kann es durch das Synthese Tool auch schnell mal zu einem 
ungewollten Latch kommen.

Gruß Kai

von Jan M. (mueschel)


Lesenswert?

Till, zeig doch mal bitte die Meldungen / die Gatteransicht aus der du 
schließt, dass da optimiert wird. In deinem letzten Codebeispiel steht 
da <= A and B and C - das ist aber in jedem Schleifendurchlauf das selbe 
- gewollt?

Kai: Das ist nur in kombinatorischen Prozessen nötig, nicht aber in 
getakteten.

von Till F. (Gast)


Angehängte Dateien:

Lesenswert?

> zeig doch mal bitte die Meldungen / die Gatteransicht aus der du
> schließt, dass da optimiert wird.

Ich schließe das ja aus dem placed & routetet Design, wie ich es im 
FPGA-Editor betrachten kann. Ich habe mal einen Screenshot gemacht, wo 
man sieht, dass zwischen /wr_en_from_ctrl_delay0(0)(0)/ und 
/wr_en_from_ctrl_delay2(0)(0)/ lediglich 1 Flipflop liegt, ansonsten 
verlaufen die Signale ohne weiter Synchronisationsstufen. Wie gesagt 
sieht das Ergebnis im FPGA-Editor sogar genauso aus, wenn ich die beiden 
Zeilen
1
wr_en_from_ctrl_delay2(i) <= wr_en_from_ctrl_delay1(i);
2
wr_en_from_ctrl_delay1(i) <= wr_en_from_ctrl_delay0(i);
durch diese ersetze:
1
wr_en_from_ctrl_delay2(i) <= wr_en_from_ctrl_delay0(i);


Ansonsten: Ich bin jetzt auch alle Warnungen bezueglich dieser Signale 
los geworden, indem ich alles, was ich zum Testen mal mit konstanten 
Werten versehen habe mit den eigentlich vorgesehenen Registern verbunden 
habe. Im Synthesis-Report finde ich jetzt sogar:

Found 16-bit register for signal <wr_en_from_ctrl_delay0>.
Found 16-bit register for signal <wr_en_from_ctrl_delay1>.
Found 16-bit register for signal <wr_en_from_ctrl_delay2>.

Aber von "wr_en_from_ctrl_delay1" ist halt nirgendwo etwas zu finden! 
Mir ist klar, dass sich die Namen der Signale veraendern koennen, aber 
da ich ja wr_en_from_ctrl__delay0 und wr_en_from_ctrl__delay2 finde und 
nichts dazwischen liegt, scheint es mir schon so zu sein, dass 
wr_en_from_ctrl_delay1 einfach nicht existiert!

von Jan M. (mueschel)


Lesenswert?

Du bist also in einem Xilinx FPGA zuhause? Und die 
wr_en_from_ctrl_delay* werden nicht mit dem reset zurueckgesetzt?

Dann hat ISE die Kette von Flipflops durch ein Schieberegister ersetzt - 
das muesste eigentlich im Report auch auftauchen, such mal nach "shift 
register".

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


Lesenswert?

> Dann hat ISE die Kette von Flipflops durch ein Schieberegister ersetzt -
Etwas exakter: durch ein Schieberegister, das in einer LUT realisiert 
worden sein könnte. Aber das deckt sich nicht mit der Mesuung am 
implementierten Design:
>>>>>> Tatsächlich hat das Signal auch nur 1 Takt
>>>>>> Verzögerung, wenn man den FPGA konfiguriert.

> Ich schließe das ja aus dem placed & routetet Design
Mir ist es noch nie passiert, dass FFs so offensichtlich wegoptimiert 
wurden. Da steckt doch irgendwas im Busch...

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.