Wie kann man aus dem generierten Takt einen exakten 10-Hz-Takt ableiten?

Wie erhalte ich einen genauen (oder möglichst nahen) 10-Hz-Takt aus dem generierten Takt? Der Master ist 100MHz. Ich habe dieses 32-Bit-Register verwendet, um einen Takt so nahe wie möglich an 10 kHz zu bringen, was durch Umschalten des Ausgangs erfolgt, wenn Bit 13 gesetzt ist. LED ist mein generierter clk, der natürlich bei dieser Rate ständig eingeschaltet ist, aber ich plane, die Ausgangs-LED auf den 10-Hz-Takt zu ändern und auf einem O-Scope zu überprüfen.Bild

module Clock_Divider(
input clk,
output reg LED
    );
 
reg [31:0]big_reg = 32'h0000_0000;
    always @ (posedge clk)
        begin
            if (big_reg[13] == 1'b1)
                begin big_reg <= 32'h0000_0000;
                    LED <= ~LED;
                end
            else
                big_reg <= big_reg + 1'b1;
        end
endmodule
Wenn Sie wissen, wie man aus einem 100-MHz-Takt einen 10-kHz-Takt erzeugt, wissen Sie, wie man aus einem 10-kHz-Takt einen 10-Hz-Takt erzeugt.
Sie können das DDS-Konzept verwenden, wenn Sie eine feinkörnige Auflösung benötigen. Sie würden einen 32-Bit-Akkumulator und ein 32-Bit-Abstimmregister verwenden. Jede Uhr, Akkumulator = Akkumulator + tuning_register. Der Ausgang ist Akkumulator[31]. Durch Ändern des Stimmregisters ändern Sie die Frequenz.
Für eine präzise Uhr habe ich früher von einem billigen Hardware-Quarz-Oszillator-Modul ausgegangen, z. B. 24M, 2M, 1M, 32,768 kHz, und auch einen billigen binären / dezimalen Sync / Async-Zähler verwendet, um auf 100/10/1 / 0,1 Hz zu zählen. Natürlich kann man dann hochzählen, wenn man 1.000Hz Takt hat.
"Ich habe dieses 32-Bit-Register verwendet, um einen Takt so nahe wie möglich an 10 kHz zu bringen, was durch Umschalten des Ausgangs erfolgt, wenn Bit 13 gesetzt ist." - Welche Frequenz haben Sie genau mit dieser Methode erhalten?
@BruceAbbott 12,207 kHz. Ab 1MHz/2^13.
100 MHz können in genau 10 kHz umgewandelt werden , indem einfach bis 5000 gezählt und ein Flip-Flop umgeschaltet wird.

Antworten (2)

Hier ist eine Möglichkeit: Zählen Sie bis 5 Millionen und schalten Sie dann einen Flip-Flop um. Wenn das Timing für Sie ein Problem darstellt, können Sie zuerst auf eine niedrigere Frequenz herunterteilen (z. B. durch 4 teilen) und dann in Ihrem sekundären Zähler bis 1,25 Millionen zählen.

reg [22:0] main_counter;
reg        clock_10hz;

wire       toggle;

assign  toggle = (main_counter == 23'd4_999_999);  // 5e6 including 0.

initial begin
   main_counter = 0;
   clock_10hz   = 0;
end

always @(posedge clock_100m)
    if (toggle) begin
         main_counter <= 0;
         clock_10hz   <= !clock_10hz;
    end
    else begin
         main_counter <= main_counter + 1;
    end

Update: Zähler auf 5 Millionen geändert (war 50 Millionen). OP fragt nach 10 Hz, nicht 1 Hz.

einige Vorschläge:

  1. mit einer Konstante vergleichen.
  2. Laden Sie mit einer Konstanten und zählen Sie dann herunter.
  3. Laden mit (max. Wert - Konstante) dann Test auf Überlauf/oder gesetztes Bit
  4. DDS - Füge eine Konstante hinzu, teste auf Überlauf/oder gesetztes Bit

Wenn Sie wenig Logikressourcen haben, kann ich verstehen, dass es effizienter ist, nur ein bisschen zu testen, aber offensichtlich funktioniert es am besten, wenn Ihre Konstante eine Zweierpotenz ist.