From 596d47d356af71cbee3fee440d7f16a8f4812a6c Mon Sep 17 00:00:00 2001 From: Gamenight77 Date: Mon, 28 Apr 2025 14:30:29 +0200 Subject: [PATCH] Refactor ws2812_driver module for improved timing and data handling --- .../distance_ws2812_display/ws2812_driver.v | 60 +++++++++++++------ 1 file changed, 41 insertions(+), 19 deletions(-) diff --git a/Semaine_3/Capteur_recule_bidirectionel_V2/distance_ws2812_display/ws2812_driver.v b/Semaine_3/Capteur_recule_bidirectionel_V2/distance_ws2812_display/ws2812_driver.v index c26751d..cc17493 100644 --- a/Semaine_3/Capteur_recule_bidirectionel_V2/distance_ws2812_display/ws2812_driver.v +++ b/Semaine_3/Capteur_recule_bidirectionel_V2/distance_ws2812_display/ws2812_driver.v @@ -1,27 +1,49 @@ -module ws2812_driver( - input wire clk, +module ws2812_driver ( + input wire clk, // horloge principale du FPGA input wire [23:0] color, // couleur RGB (8 bits par composant) output reg ws2812_dout // broche de données vers la LED ); reg [7:0] bit_count; // compteur de bits pour envoyer les données reg [23:0] shift_reg; // registre pour envoyer la couleur + reg [7:0] clk_div; // Diviseur de fréquence pour ralentir l'horloge (prescaler) + + // Paramètres de timing en cycles de l'horloge du FPGA + localparam T0H = 7; // 0.35 µs (haut) -> 7 cycles à 27 MHz + localparam T1H = 14; // 0.7 µs (haut) -> 14 cycles à 27 MHz + localparam T0L = 15; // 0.8 µs (bas) -> 15 cycles à 27 MHz + localparam T1L = 11; // 0.6 µs (bas) -> 11 cycles à 27 MHz + localparam RES = 150; // Temps de réinitialisation en cycles de 27 MHz (50 µs min) + + reg [15:0] timing_counter; // Compteur pour les impulsions always @(posedge clk) begin - - if (bit_count == 0) begin - shift_reg <= color; // Charger la couleur à transmettre - ws2812_dout <= 1'b0; // Commencer par envoyer un "0" - end else begin - // Envoyer chaque bit un à un en contrôlant la durée de l'impulsion - ws2812_dout <= shift_reg[23]; // Le bit le plus significatif - shift_reg <= shift_reg << 1; // Décalage des bits - end - // Incrémentation du compteur de bits - if (bit_count < 24) - bit_count <= bit_count + 1; - else - bit_count <= 0; // Réinitialiser pour envoyer la prochaine couleur - - end -endmodule + if (timing_counter == 0) begin + if (bit_count == 0) begin + // Charger la couleur dans l'ordre GRB (Green, Red, Blue) + shift_reg <= {color[7:0], color[15:8], color[23:16]}; // GRB : Green, Red, Blue + ws2812_dout <= 1'b0; // Commencer par envoyer un "0" + end else begin + // Décalage des bits pour envoyer les données + if (shift_reg[23]) begin + // T1H: 0.7µs haut, 0.6µs bas (pour un bit "1") + ws2812_dout <= 1'b1; + timing_counter <= T1H; + end else begin + // T0H: 0.35µs haut, 0.8µs bas (pour un bit "0") + ws2812_dout <= 1'b0; + timing_counter <= T0H; + end + shift_reg <= shift_reg << 1; // Décalage des bits + end + // Incrémentation du compteur de bits + if (bit_count < 24) + bit_count <= bit_count + 1; + else + bit_count <= 0; // Réinitialiser pour envoyer la prochaine couleur + end else begin + // Maintenir l'impulsion pendant la durée déterminée + timing_counter <= timing_counter - 1; + end + end +endmodule \ No newline at end of file