[Division de fréquence d'horloge dans FPGA] - le principe et la mise en œuvre de la division de fréquence d'horloge

[Division de fréquence d'horloge dans FPGA] - le principe et la mise en œuvre de la division de fréquence d'horloge

La division de fréquence d'horloge est une technologie très courante dans la conception de FPGA. Elle peut modifier la synchronisation du système en ajustant la fréquence du signal d'horloge sans affecter la transmission des données, de manière à atteindre l'objectif de contrôler la vitesse de fonctionnement du système. Cet article présentera en détail le principe et la mise en œuvre de la division de fréquence d'horloge.

Il existe deux méthodes courantes de division de fréquence d'horloge dans les FPGA : la division de fréquence matérielle et la division de fréquence logicielle. La division de fréquence matérielle fait référence à l'utilisation du circuit de comptage à l'intérieur du FPGA pour compter le signal d'horloge haute fréquence d'entrée, puis produire un signal d'horloge basse fréquence ; tandis que la division de fréquence logicielle consiste à réaliser le changement de fréquence d'horloge en ajustant le rapport cyclique du signal d'horloge. Ci-dessous, je prendrai le langage Verilog HDL comme exemple pour vous montrer l'implémentation spécifique de ces deux méthodes.

Le premier est la méthode de mise en œuvre de la division de fréquence matérielle. Nous pouvons compter en entrant une horloge haute fréquence dans le module de compteur, et lorsque la valeur accumulée atteint le seuil défini, un signal d'horloge basse fréquence peut être émis. code afficher comme ci-dessous:

module clk_div(
  input wire clk_in,   // 输入时钟信号
  input wire rst_in,   // 复位信号
  output reg clk_out   // 输出分频后的时钟信号
);

  parameter DIV = 10;  // 分频系数
  reg [log2(DIV) - 1:0] cnt;

  always @ (posedge clk_in or negedge rst_in) begin
    if (!rst_in) begin
      cnt <= 0;
      clk_out <= 0;
    end else begin
      cnt <= cnt + 1;
      if (cnt == DIV - 1) begin
        cnt <= 0;
        clk_out <= ~clk_out;
      end
    end
  end

endmodule

Dans le code ci-dessus, nous utilisons le compteur modulo

Guess you like

Origin blog.csdn.net/Jack_user/article/details/132053476