Xilinx FPGA, Fehler beim Erstellen des generierten Takts

Ich habe gerade ein Digilent Basys 3-Board (Artix-7 FPGA) bekommen und versuche, ein Programm zu erstellen, um Daten über die UART-USB-Verbindung zu übertragen. Ich habe ein Modul geschrieben, aber als ich versuchte, es zu implementieren, bekam ich einen Timing-Fehler. Ich habe den standardmäßigen 100-MHz-Takt verwendet, der mit dem Board geliefert wird. Ich denke jetzt, ich brauche etwas langsameres wie 50 MHz. Ich glaube nicht, dass ich die Standarduhr ändern kann, da diese von der Platine auf 100 MHz festgelegt ist, also denke ich, dass ich eine generierte Uhr erstellen muss. Ich habe meiner xdc-Datei die folgenden Zeilen hinzugefügt.

set_property PACKAGE_PIN W5 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
create_clock -period 10.000 -name sys_clk_pin -waveform {0.000 5.000} -add [get_ports clk]

create_generated_clock -divide_by 2 -source [get_ports clk] [get_ports clk2]

Ich bekomme dann den Fehler. Die erzeugte Uhr clk2 hat keinen logischen Pfad von der Hauptuhr sys_clk_pin. Übersehe ich einen Schritt. Muss ich etwas mehr tun, als es in der XDC-Datei zu erstellen? Hier ist der Header für mein Top-Level-Modul.

module serial_emitter(
    output RsTx,
    input RsRx,
    input clk,
    input clk2,
    output [3:0] an,
    output [6:0] seg);

Ich möchte, dass die langsamere Uhr dem clk2-Eingang zugeordnet wird.

Warum nicht eine Taktteilerkomponente verwenden?
Also habe ich die Clock Wizzard IP verwendet, um eine generierte Uhr zu erstellen, die zu funktionieren scheint. Ich denke, ich muss die Einschränkung in diesem Fall nicht zur XDC-Datei hinzufügen?
create_generated_clockAnweisungen sind nichts anderes als Anweisungen an den statischen Timing-Analysator, um zu beschreiben, welche Uhren was sind. Sie müssen tatsächlich die Logik oder Primitive implementieren , die die Uhr erzeugen.
Ich denke, Sie sollten auch Ihr UART-Modul überprüfen, da ein normaler UART mit bis zu 250 MHz auf einem FPGA der 7er-Serie laufen kann. Wenn die Timing-Analyse fehlerhafte Pfade meldet, haben Sie überprüft, was mit diesen Pfaden schief läuft?

Antworten (1)

Sie haben die Uhr für die statische Timing-Analyse eingeschränkt, aber Sie haben nie die Logik geschrieben, um eine Uhr durch zwei zu teilen:

reg r_clk_div;
always @(posedge i_clk) begin

   r_clk_div  <=  !r_clk_div;

end

assign o_clk2 = r_clk_div;

Dies sollte zu einem DFF synthetisieren, das durch den Eingangstakt getaktet wird, Q über einen Inverter mit D verbunden ist, und dann ist der Q-Ausgang Ihr neuer Takt. Ihre Einschränkung teilt den Tools mit, dass Sie diese Uhr aus einer vorhandenen Uhr / Ressource generiert haben, und sie entsprechend zu behandeln.

Beachten Sie, dass ich für diesen Teiler keinen Reset habe, da ich in Ihrem Modul keinen gesehen habe, aber es ist möglicherweise keine schlechte Idee, vorübergehende Metastabilität zu vermeiden.

Entschuldigung für Tippfehler, ich bin auf dem Handy.

Ich frage mich nur, wie ich einen Reset hinzufügen kann. Ist es ein Signal, das generiert wird, wenn das Gerät startet? Wie würde ich diesen Port meinem Top-Level-Modul hinzufügen und ihn der XDC-Datei hinzufügen?
Ich denke, Sie müssen irgendwo in Ihrem Design einen Reset haben - ich wette, das Digilent-Board hat bereits einen Reset mit einem Pin verdrahtet. Stellen Sie sich das so vor - wie stellen Sie sicher, dass all Ihre schönen Peripheriegeräte und Register, die Sie geschrieben haben, in dem gewünschten Zustand starten?
Generieren Sie auf diese Weise keine Uhren. Verwenden Sie stattdessen ein DCM oder PLL.
Ein DCM/PLL ist der bessere Weg, um einen Takt zu erzeugen, stimmte. Sie sind einfach nicht immer in einem FPGA verfügbar, und diese Anwendung scheint so einfach zu sein, dass ein einfaches DFF die Arbeit erledigt und ein bisschen lehrreicher ist.