Wie leite ich einen Eingangstakt auf einen Ausgangspin in meinem FPGA-Design um/regeneriere ich ihn (Verilog)

Ich habe einen ADC, bei dem ich ihm 20 Taktimpulse senden muss, wenn ich Daten aus seinem internen Register lesen möchte (nachdem ich ihn ausgelöst habe, um Daten von meinem Sensor zu lesen).

Ich konnte dies in ModelSim gut simulieren, aber ich bin neu bei Verilog und wusste nicht, dass ich während der Synthese auf Probleme stoßen würde, wenn ich die Impulsfolge wie folgt erstelle:

reg [4:0] counter = 5'b10100;
parameter counter = 0;

always (posedge clk and negedge clk) 
  begin
   if (counter > 0)
     begin
       counter <= counter - 1;
       serial_out <= ~serial_out; 
     end
  end

Ich habe versucht, dies in 2 Always-Blöcke aufzuteilen: einen, der serial_out bei einem Posedge-Clk auf 1 setzt, und einen anderen, der Serial_out während eines Negedge-Clk auf 0 setzt, wobei beide prüfen, ob der Zähler größer als 0 ist. Das ist problematisch, weil ich versuche zu fahren Zähler an zwei Stellen und erhalte Fehlermeldungen, die besagen, dass mehrere Konstantentreiber für Netzzähler nicht aufgelöst werden können.

Vielleicht gibt es einen besseren Weg, dies zu tun?

Ich habe einige Posts gesehen, die vorschlagen, die clk-Frequenz zu verdoppeln, um die Daten von der Position der Uhr abzulesen. Dies würde funktionieren, aber ich muss den Takt auf 30 MHz halten (kann aus anderen Gründen nicht auf 60 MHz gehen).

Wie würden Sie vorschlagen, dass ich 20 Impulse meines immer eingeschalteten periodischen 30-MHz-Eingangstakts bedingt an einen Ausgangspin weiterleite / repliziere?

Jede Hilfe wird sehr geschätzt.

Sie müssen eine Gated Clock verwenden. electronic.stackexchange.com/questions/352464/…
Danke, ich habe gerade meinen FSM überarbeitet und eine Gated Clock eingebaut. Die Simulation wird überprüft. Ich denke, ich habe jetzt einen guten Impulszug, mit dem ich arbeiten kann, wenn ich meine Synthese mache.

Antworten (1)

Ich würde vorschlagen, ein Ausgabe-DDR-Flip-Flop zu verwenden. Wie Sie das implementieren, hängt davon ab, welches FPGA Sie verwenden. Für Xilinx wäre es ein ODDR- oder ODDR2-Grundelement. Für Altera ist es ALTDDIO_OUT.

Ich verwende ein D-Flip-Flop, dessen Ausgang mit einer Assign-Anweisung in ein UND-Gatter geht. Die Simulation wird überprüft. Ich möchte mit dieser Impulsfolge direkt einen GPIO-Pin ansteuern (dient als serielle Uhr). Ich sehe, dass Sie die Verwendung von ALTDDIO_OUT erwähnen.
Nur weil die Simulation auscheckt, bedeutet das nicht, dass sie auf dem FPGA gut funktioniert, insbesondere in Bezug auf IO.
Okay, ich bin neu dabei. Warum ist ALTDDIO_OUT erforderlich, anstatt dass ein D-Flip-Flop durch einige nicht blockierende Anweisungen während der Synthese abgeleitet wird? Ich benutze übrigens Quartus Prime.
ALTDDIO_OUT ist eine dedizierte Logik, die zwischen zwei Signalen umschaltet, wenn sich die Uhr ändert. Sie könnten dasselbe mit Flip-Flops tun, wenn sie mit der doppelten Frequenz getaktet würden, da Sie auf die fallende Taktflanke reagieren müssen, aber die dedizierte Logik gewinnt, da Sie ihr nur zwei triviale Signale zuführen können ( die nach einem niedrigen → übertragen werden '1'sollen High-Übergang und '0'nach einem High→Low-Übergang).
Das Problem ist, wie das FPGA entworfen ist. Die Ausgangspins können im Allgemeinen entweder von der Fabric-Logik oder von einem Flip-Flop angesteuert werden. Die Verzögerung von einem Flip-Flop ist konstant und vorhersagbar. Die Verzögerung von der Fabric-Logik ist nicht und wird je nach Logik und Platzierung variieren und von Gerät zu Gerät variieren. Das Problem ist nicht das Flip-Flop, das Problem besteht darin, Logik zwischen Flip-Flop und Pin zu platzieren, insbesondere wenn Sie eine bestimmte Zeitbeziehung zwischen diesem Pin und anderen Pins aufrechterhalten möchten, die möglicherweise direkt von Flip-Flops angesteuert werden.
Außerdem ist die Verzögerung für DDR-Flip-Flops und normale Flip-Flops gleich. Wenn Sie also mit einem DDR-Flip-Flop einen invertierten Takt erzeugen, ist praktisch garantiert, dass die richtige Zeitbeziehung zu Daten besteht, die mit demselben Takt von IOB getaktet werden Flip-Flops.