Wie löse ich Routing-Probleme in Artix7?

Ich arbeite mit Artix 7 (xc7a15tftg256). Beim Ausführen der Implementierung wird die folgende Fehlermeldung angezeigt:

[Platz 30-574] Schlechte Platzierung für das Routing zwischen einem IO-Pin und BUFG. Wenn diese suboptimale Bedingung für dieses Design akzeptabel ist, können Sie die Einschränkung CLOCK_DEDICATED_ROUTE in der .xdc-Datei verwenden, um diese Nachricht zu einer WARNUNG herabzustufen. Von der Verwendung dieser Überschreibung wird jedoch dringend abgeraten. Diese Beispiele können direkt in der .xdc-Datei verwendet werden, um diese Uhrregel zu überschreiben. < set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets input_IBUF] >

  • input_IBUF_inst(IBUF.O) ist gesperrtIOB_X0Y83
  • input_IBUF_BUFG_inst(BUFG.I) wird provisorisch von clockplacer aufgesetztBUFGCTRL_X0Y30

Für meine Bewerbung prüfe ich rising_edge(input). Bitte geben Sie die Lösung für dieses Problem an.

Klingt so, als würden Sie einen Nicht-Takteingangsstift für Ihren Takteingang verwenden. Nicht alle Eingangspins können direkt zu den globalen Taktnetzen im FPGA geroutet werden. Wenn inputes sich tatsächlich um ein Taktsignal handelt und Sie ein benutzerdefiniertes Board verwenden, würde ich sagen, führen Sie ein Redesign durch und stellen Sie sicher, dass Sie einen korrekten, dedizierten Takteingang verwenden. Wenn inputes sich nicht um eine Uhr als solche handelt, sondern nur um ein Signal, auf das Sie flankentriggern möchten, warum verwenden Sie stattdessen nicht einfach ein "echtes" Taktsignal, um es abzutasten?
Fügen Sie während der Synthese IOBs hinzu? Oder verwenden Sie das IBUF in Ihrem Design? In diesem Fall sollten Sie es entfernen und das Tool entscheiden lassen.

Antworten (1)

Es wird empfohlen, taktfähige Pins (CC-Pins) für Takteingänge zu verwenden. Diese können zu BUFGs geroutet werden.

Aber der Fehler ist in einem anderen Teil Ihres Codes. Wie du geschrieben hast, verwendest du

if rising_edge(input) then

Sie können rise_edge nicht für Netze ohne Takt verwenden, dies befördert sie zu einem Netz mit Takt, was die Eingabe nicht ist.

Der richtige Weg ist, den Eingang mit 2 D-FF zu synchronisieren und danach eine Flankenerkennung hinzuzufügen (3. D-FF, Not-Gate, And-Gate). Alle FF werden von Ihrer Systemuhr gesteuert.

input_meta <= input      when rising_edge(Clock);  -- 1st synchronizer D-FF
input_sync <= input_meta when rising_edge(Clock);  -- 2nd synchronizer D-FF
input_d    <= input_sync when rising_edge(Clock);  -- edge detection D-FF (d = delayed)
input_re   <= not input_d and input_sync;          -- edge detection equation (re = rising edge)

process(Clock)
begin
  if rising_edge(Clock) then
    if (input_re = '1') then
      -- do something
    end if;
  end if;
end process;
"if risinig_edge(input) then" ist vollkommen in Ordnung, warum denken Sie, dass es nicht richtig ist? Nur weil es INPUT heißt, heißt das nicht, dass es keine Uhr sein kann!
@FarhadA Meine Antwort besteht aus zwei Teilen: 1) in Bezug auf die Verwendung von CC-Pins für Takteingänge und 2) die Verwendung von Rising_edge in Netzen ohne Takt. Wie Sie sehen, fügt Vivado ein IBUF und ein BUFG für die Eingabe ein, da das OP rising_edge(input). Also hat er entweder ein echtes Taktnetz benannt input(umständliche Benennung für eine Uhr) oder das OP hat eine steigende_Flanke für ein Datensignal verwendet, was (in den meisten Fällen) für die Synthese falsch ist. Das Eingeben von Taktsignalen in ein FPGA an nicht taktfähigen Pins ist ein Designfehler.