Hallo kann mir jemand etwas zu den folgenden Warnungen von Xilinxs Webpack sagen? Werde daraus einfach nicht schlau habe quasi nur einen process auf dem Ding (XC9572) laufen ungefähr so process (Error1, Error2, CLK) begin if (Error1 = '1' or Error2 = '1') then PORT <= (others => z); elsif (CLK'event and CLK = '1') then if (Schalter = '1') then PORT <= EINGANG1; else PORT <= EINGANG2; end if; end if; Meldungen WARNING:Cpld:310 - Cannot apply TIMESPEC TS1000 = PERIOD:PERIOD_SYS_CLOCK_EXT:0.000 nS because of one of the following: (a) a signal name was not found; (b) a signal was removed or renamed due to optimization; (c) there is no path between the FROM node and TO node in the TIMESPEC. WARNING:Cpld:310 - Cannot apply TIMESPEC AUTO_TS_F2F = MAXDELAY:FROM:FFS(*):TO:FFS(*):0.000 nS because of one of the following: (a) a signal name was not found; (b) a signal was removed or renamed due to optimization; (c) there is no path between the FROM node and TO node in the TIMESPEC.
Wenn man sich das komplette Log ansieht, steht da sogar welche Signale er nicht gefunden hat hust mfG Markus
Das sind doch keine Fehlermeldungen. Das sind doch nur Warnungen... ;-) Das gibt aber garantiert einen Syntaxfehler:
1 | PORT <= (others => z); |
Diese Resetzuweisung ist (mal abgesehen davon, dann man keine kombinatorischen asynchronen Resets verwenden sollte) vermutlich nicht sinnvoll synthetisierbar. Denn mal angenommen, der Reset erzwingt ein 'Z' auf den IOs. Nachdem der Reset dann weg ist, muss dieses 'Z' bis zum nächsten Takt gespeichert werden. Ich kann mir vorstellen, dass die Tools das irgendwie hinbiegen könnten, aber so wird i.A. kein Tristate an den Pins realisiert.
Mit Verilog und VHDL kann man Systeme abstrakt beschreiben, aber wenn man Bitpopelei betreibt, dann muss man schon etwas darüber nachdenken, was in Hardware denn überhaupt so möglich ist. Und ein Flipflop speichert sicher kein 'z'. Also, was soll das Ganze denn mal werden? wenn Error1 = '1' oder Error2 = '1' dann schalte PORT hochohmig ansonsten wenn steigende Flanke am Clock dann wenn Schalter 1 ist, dann übernimmt PORT den Wert von EINGANG1 ansonsten den Wert von EINGANG2 Das sind offensichtlich zwei Flipflops, ein Tristate-Buffer und ein Multiplexer. Dann beschreibe das auch so. Als Hilfestellung in Verilog: =====8<----- wire port; // signal to be generated reg port_oe; // output enable flipflop reg port_val; // binary value flipflop always @(posedge clk or posedge error1 or posedge error2) begin if (error1 || error2) port_oe <= 0; else begin port_oe <= 1; port_val <= schalter ? eingang1 : eingang2; end end assign port = port_oe ? port_val : 1'bz; =====8<----- p.s. Nimm den Hinweis von Lothar ernst: Keine kombinatorischen asynchronen Resets!
Hallo, danke für eure Antworten. Als ich den Beitrag geschrieben habe, hatte ich den Code nicht vorliegen.. deswegen die Syntaxfehler... Zum asynchronen Reset. Ich habe mich hier an einem Code Template von Xilinxs orientiert.
1 | process (<clock>,<async_reset>) |
2 | begin |
3 | if <async_reset> = '1' then |
4 | <statements>; |
5 | elsif (<clock>'event and <clock> = '1') then |
6 | if <sync_reset> = '1' then |
7 | <statements>; |
8 | else |
9 | <statements>; |
10 | end if; |
11 | end if; |
12 | end process; |
Ich "dachte" mir wenn ein Fehler auftritt, dann sollen die Ports so schnell wie möglich hochohmig geschaltet werden... ist wahrscheinlich Quatsch. Als ich gestern noch einen weiteren Prozess dazugepackt habe (einfach eine im Fehlerfall blinkende Led) war die Warnung weg. Ich merke mir, keine asynchronen Resets! Könnt ihr mir erklären warum... Sollte man das dann lieber so machen?
1 | process (<clock>,<async_reset>) |
2 | begin |
3 | if (<clock>'event and <clock> = '1') then |
4 | if <async_reset> = '1' then |
5 | <statements>; |
6 | elsif <sync_reset> = '1' then |
7 | <statements>; |
8 | else |
9 | <statements>; |
10 | end if; |
11 | end if; |
12 | end process; |
Ich habe den Code mal in VHDL "übersetzt" (nur im Editor geschrieben, ohne Test, ohne Syntaxhighlighting :-D)
1 | signal port_oe std_logic; |
2 | signal port_value std_logic_vector (3 downto 0); |
3 | |
4 | |
5 | |
6 | process |
7 | begin |
8 | wait until rising_edge(CLK); |
9 | if (error1 = '1' or error2 = '1') then |
10 | port_oe <= '0'; //Flipflop |
11 | else |
12 | port_oe <= '1'; |
13 | if (Schalter = '1') then |
14 | port_value <= Eingang1; |
15 | else |
16 | port_value <= Eingang2; |
17 | end if; //Multiplexer |
18 | end if; |
19 | end process; |
20 | |
21 | PORTXXX <= port_value when (port_oe = '1') |
22 | else (others => 'Z'); //Buffer |
Ich habe mir wirklich keine Gedanken darüber gemacht, wie das letztendlich in Hardware aussieht. Auf jeden fall noch mal Danke, ich habe wieder was gelernt. Für weitere Hinweise bin ich offen :-D
> Ich "dachte" mir wenn ein Fehler auftritt, dann sollen die Ports so > schnell wie möglich hochohmig geschaltet werden... Woher kommt der Fehler? > ist wahrscheinlich Quatsch. Wahrscheinlich hast du recht... ;-) > die Ports so schnell wie möglich hochohmig geschaltet werden... Wenn die von aussen kommen, dann lass die Errors doch einfach direkt das OE steuern:
1 | process
|
2 | begin
|
3 | wait until rising_edge(CLK); |
4 | if (Schalter = '1') then |
5 | port_value <= Eingang1; |
6 | else
|
7 | port_value <= Eingang2; |
8 | end if; |
9 | end process; |
10 | |
11 | -- Port hochohmig bei Fehler
|
12 | PORTXXX <= port_value when (error1 = '0' and error2 = '0') else (others => 'Z'); // Buffer |
> Zum asynchronen Reset. Ich habe mich hier an einem Code Template von > Xilinxs orientiert. Und auch die meisten Bücher beschreiben das noch so. Dabei ist hier ein Seitenblick auf die Zielarchitektur unbedingt nötig. Siehe dazu den Beitrag "Xilinx und die Resets" BTW: mit den Tags [ vhdl ] und [ /vhdl ] ohne die Leerzeichen wird der Quelltext schön syntaxgehighlighted (cooles Wort).
Hallo Lothar, danke für die schnelle Antwort... Jetzt habe ich es kapiert. Besonderst der folgende Beitrag von dir ist super. Beitrag "Re: Hardware mit VHDL "richtig" beschreiben." Die Fehlersignale kommen von außerhalb. Danke für deine super Tips...das nächste mal kommt der Code richtig
1 | --gehighlighted--
|
Versprochen :-D
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.