Xst:2110 - Clock of register <AdrCnt> seems to be also used in the data or control logic of that element. Ich bekomme o.g. Warnung mit der ich nichts anfangen kann. Was mache ich falsch? ... Read_Proc: process(CLK20, RST) variable AdrCnt: natural range 0 to 4095; begin if RST = '0' then ReaderStatus <= IDLE; START <= '0'; AdrCnt := 0; else if (CLK20'event) then case ReaderStatus is when IDLE => if STA = '0' then ReaderStatus <= WAIT_RDY; end if; when WAIT_RDY => if RB = '1' then ReaderStatus <= RESET; START <= '1'; end if; when RESET => if ENDE = '1' then ReaderStatus <= WAIT_RDY2; AdrCnt := 0; else START <= '0'; end if; when WAIT_RDY2 => if AdrCnt <= 3 then AdrCnt := AdrCnt + 1; elsif RB = '1' then ReaderStatus <= SEND_CMD1; START <= '1'; end if; when SEND_CMD1 => if ENDE = '1' then ReaderStatus <= SEND_ADR; START <= '1'; AdrCnt := 0; else START <= '0'; end if; when SEND_ADR => if ENDE = '1' then AdrCnt := AdrCnt + 1; if AdrCnt = 4 then ReaderStatus <= SEND_CMD2; end if; START <= '1'; else START <= '0'; end if; when SEND_CMD2 => if ENDE = '1' then ReaderStatus <= WAIT_RDY3; AdrCnt := 0; else START <= '0'; end if; when WAIT_RDY3 => if AdrCnt <= 3 then AdrCnt := AdrCnt + 1; elsif RB = '1' AND CLK20 = '0' then ReaderStatus <= READ_DATA; AdrCnt := 0; end if; when READ_DATA => if AdrCnt < 2112 then if CLK20 = '1' then AdrCnt := AdrCnt + 1; end if; else ReaderStatus <= IDLE; end if; end case; end if; end if; end process; ... mfg Knulli
Xst:2110 - Clock of register <..> seems to be also used in the data or control logic of that element
Re: Xst:2110 - Clock of register <..> seems to be also used in the data or control logic of that ele
Knut E. schrieb: > Xst:2110 - Clock of register <AdrCnt> seems to be also used in the data > or control logic of that element. > > Ich bekomme o.g. Warnung mit der ich nichts anfangen kann. Was mache ich > falsch? Das übliche, der Process soll auf beide Clockflanken reagieren. Das ist nicht synthetisierbar. Dass du nur eine Waring bekommst liegt an deiner Schreibweise die nicht den Designguides entspricht, die gewünschte HW bekommst du aber nicht.
Re: Xst:2110 - Clock of register <..> seems to be also used in the data or control logic of that ele
Lattice User schrieb: > Das übliche, der Process soll auf beide Clockflanken reagieren. Genaugenommen nicht nur auf zwei, sondern auf alle mit std_logic theoretisch möglichen 36 Übergänge... :-o Also: nachdem das hier ....
1 | if (CLK20'event) then |
... dann auf die relevante Flanke korrigiert wurde, bleibt noch die Geschichte vom Beitrag "Xilinx und die Resets"
Re: Xst:2110 - Clock of register <..> seems to be also used in the data or control logic of that ele
Der Xst warnt aber vor dieser Zeile: > when WAIT_RDY3 => if AdrCnt <= 3 then > AdrCnt := AdrCnt + 1; > elsif RB = '1' AND CLK20 = '0' then <<<<<=== Warnungsgrund > ReaderStatus <= READ_DATA;
Re: Xst:2110 - Clock of register <..> seems to be also used in the data or control logic of that ele
bko schrieb: > CLK20 = '0' Weil Du da ziemlich schräg das Taktsignal verwendest. Duke
Re: Xst:2110 - Clock of register <..> seems to be also used in the data or control logic of that ele
bko schrieb: > Der Xst warnt aber vor dieser Zeile: Der Synthesizer warnt dich evtl. auch "nur" vor Latches, obwohl du z.B. eine kombinatorische Schleife eingebaut hast: http://www.lothar-miller.de/s9y/categories/36-Kombinatorische-Schleife Und trotzdem ist die Warnung piepschnurzegal, denn der Fehler ist die Taktabfrage. Sehen wir uns das mal so an:
1 | if (CLK20'event) then -- eine Flanke |
2 | case ReaderStatus is ... |
3 | when WAIT_RDY3 => if AdrCnt <= 3 then |
4 | AdrCnt := AdrCnt + 1; |
5 | elsif RB = '1' AND CLK20 = '0' then -- eine fallende Flanke |
6 | AdrCnt := 0; |
7 | end if; |
8 | when READ_DATA => if AdrCnt < 2112 then |
9 | if CLK20 = '1' then -- eine steigende Flanke |
10 | AdrCnt := AdrCnt + 1; |
11 | end if; |
Das ist (mal abgesehen von der kombinatorischen Schleife um AdrCnt) eine
äussert eigenartige Beschreibung eines clock-Enables für den Zähler...
> Der Xst warnt aber vor dieser Zeile:
Das ist, wie wenn man sagt: irgendwas klappert an meinem Auto!
Während man mit 160 auf dem Feldweg rumdonnert.
Re: Xst:2110 - Clock of register <..> seems to be also used in the data or control logic of that ele
Ich hatte das mit dem "Irgendwas'event" bewußt so gemacht, weil ich gedacht hatte, daß ich damit doppelt so schnell irgendwas realisieren kann. Ich habe z.B. einen 60 MHz Takt und will etwas ansteuern, was nur 40 MHz verträgt. Also die 60 MHz (16.6ns) nicht mit "if Rising_Edge(CLK)" sondern "if CLK'event" triggern (macht 8.333ns), dann 2x bis 3 zählen macht 2x25ns =50ns (mein CLK20), das dann wieder mit CLK20'event triggern, gibt mir die möglichkeit, alle 25ns was zu machen. Soweit zu dem, was ich machen wollte. Hab's nun mal in ein Testprojekt extrahiert und mit dem Oszi nachgemessen. Geht. Und komischerweise ist die Warnung bei diesem Mini-Projekt auch weg. Knulli
Re: Xst:2110 - Clock of register <..> seems to be also used in the data or control logic of that ele
Nachtrag zu den Bildern: architecture Behavioral of ClkDivTest is signal CLK20: STD_LOGIC; signal Ausgang1Buf: STD_LOGIC; signal Ausgang2Buf: STD_LOGIC; begin CLK_Proc: process(CLK, RST) variable DIV3: natural range 0 to 3; -- 60->20 MHz, NAND-Flash kann nur mit 40 MHz betrieben werden begin if RST = '0' then CLK20 <= '1'; DIV3 := 0; Ausgang2Buf <= '0'; else if (CLK'event) then Ausgang2Buf <= Not Ausgang2Buf; DIV3 := DIV3 + 1; if DIV3 = 3 then CLK20 <= Not CLK20; DIV3 := 0; end if; end if; end if; end process; Read_Proc: process(CLK20, RST) begin if RST = '0' then Ausgang1Buf <= '0'; else if (CLK20'event) then Ausgang1Buf <= Not Ausgang1Buf; end if; end if; end process; LED <= Ausgang1Buf; Ausgang1 <= Ausgang1Buf; Ausgang2 <= Ausgang2Buf; end Behavioral; END NACHTRAG... Das mit dem "AND CLK20 = '0'" und "if CLK20 = '1' then" hatte ich übrigens nur gemacht, damit ich an einer bestimmten Stelle wieder richtig einsetze, wenn ich auf irgendetwas warte... Knulli
Re: Xst:2110 - Clock of register <..> seems to be also used in the data or control logic of that ele
Knut E. schrieb: > if (CLK'event) then > Ausgang2Buf <= Not Ausgang2Buf; Ich glaube, der routet einfach nur den Takt durch, weil er sieht: mit jeder Änderung vom Takt soll der Ausgang geändert werden. Da ist nicht wirklich ein Flipflop beteiligt, oder? Was sagt der RTL-Plan? Welche Zielplattform hast du (FPGA/CPLD)?
Re: Xst:2110 - Clock of register <..> seems to be also used in the data or control logic of that ele
was uns Knut verschwieg: er nimmt eventuell einen Coolrunner2 und ISE >11 ? Denn dann meckert die Xilinx-Synthese mit dem Code aus > Beitrag "Re: Xst:2110 - Clock of register <..> seems to be also used in the data or control logic of that ele" nicht, und erzeugt einige Flipflops mit dem Namen"FDDC" welche nach Xilinx-CPLD-library-Guide > Macro: D Dual Edge Triggered Flip-Flop with Asynchronous Clear sind. Nehme ich aber einen Spartan3 so sagt mir ISE nur: > unsupported Clock statement. Ok, > if (CLK20'event) then wäre schöner geschrieben mit
1 | if rising_or_falling_edge(CLK20) |
aber gibt es das schon ?
Re: Xst:2110 - Clock of register <..> seems to be also used in the data or control logic of that ele
Es ist ein CR-II (CPLD). Hier auch nochmal das Projekt zum Ansehen des Planes. Ich benutze ISE 13.3. Aber wie gesagt, bei diesem "extracted project" ist die Warnung weg. Ich werd wohl vom ursprünglichem Projekt ausgehend mal Stück für Stück was weglassen, bis auch die Warung verschwindet. Hab ich das richtig verstanden: "'event" nimmt man besser nicht? Wird "'event" vom "Compiler" plattformspezifisch unterschiedlich umgesetzt? Klar, ich könnte auch "rising_edge(CLK20) OR falling_edge(CLK20)" schreiben. Ist halt nur etwas mehr Schreibarbeit und das ich mit "'event" bei STD_LOGIC auch noch x'n Neunzig weitere Events gemeint haben könnte, war mir bislang neu. Hab ich halt einfach aus nem Buch (Reichert/Schwarz) so entnommen ohne genauer nachzuforschen, was es noch alles bedeuten kann. Knulli
Re: Xst:2110 - Clock of register <..> seems to be also used in the data or control logic of that ele
Knut E. schrieb: > Es ist ein CR-II (CPLD) Die können das. Und nur die... ;-) > Hab ich das richtig verstanden: "'event" nimmt man besser nicht? Wird > "'event" vom "Compiler" plattformspezifisch unterschiedlich umgesetzt? 'event darf gern genommen werden und wird es auch zigmillionenfach... So z.B. auch in den Funktionen rising_edge() und falling_edge(). Aber: dort immer zusammen mit "and sig='1'" oder "and sig='0'". Und nur das kann dann von allen CPLDs und FPGAs implementiert werden. Denn das ist dann ein simples D-Flipflop. > "'event" bei STD_LOGIC auch noch x'n Neunzig weitere Events gemeint > haben könnte, war mir bislang neu. 'event bedeut einfach "jede Änderung" Und das kann bei std_logic auch ein Übergang von 'X' nach 'U' sein, oder von '1' nach 'H'. Wobei die "natürlich" nur für den Simulator interessant sind. In der Hardware gibt es nur die Übergänge zwischen '0' und '1' (low und high). Das erkennt der Synthesizer offenbar und macht was passendes draus...
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.