Forum: FPGA, VHDL & Co. Xst:2110 - Clock of register <..> seems to be also used in the data or control logic of that element


von Knut E. (knulli)


Angehängte Dateien:

Lesenswert?

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

von Lattice User (Gast)


Lesenswert?

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.

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


Lesenswert?

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"

von bko (Gast)


Lesenswert?

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;

von Duke Scarring (Gast)


Lesenswert?

bko schrieb:
> CLK20 = '0'
Weil Du da ziemlich schräg das Taktsignal verwendest.

Duke

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


Lesenswert?

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.

von Knut E. (knulli)


Angehängte Dateien:

Lesenswert?

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

von Knut E. (knulli)


Lesenswert?

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

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


Lesenswert?

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

von bko (Gast)


Lesenswert?

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 ?

von Knut E. (knulli)


Angehängte Dateien:

Lesenswert?

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

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


Lesenswert?

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