forked from tanchou/Verilog
Refactor ws2812_driver module for improved timing and data handling
This commit is contained in:
@@ -1,27 +1,49 @@
|
|||||||
module ws2812_driver(
|
module ws2812_driver (
|
||||||
input wire clk,
|
input wire clk, // horloge principale du FPGA
|
||||||
input wire [23:0] color, // couleur RGB (8 bits par composant)
|
input wire [23:0] color, // couleur RGB (8 bits par composant)
|
||||||
output reg ws2812_dout // broche de données vers la LED
|
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 [7:0] bit_count; // compteur de bits pour envoyer les données
|
||||||
reg [23:0] shift_reg; // registre pour envoyer la couleur
|
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
|
always @(posedge clk) begin
|
||||||
|
if (timing_counter == 0) begin
|
||||||
if (bit_count == 0) begin
|
if (bit_count == 0) begin
|
||||||
shift_reg <= color; // Charger la couleur à transmettre
|
// Charger la couleur dans l'ordre GRB (Green, Red, Blue)
|
||||||
ws2812_dout <= 1'b0; // Commencer par envoyer un "0"
|
shift_reg <= {color[7:0], color[15:8], color[23:16]}; // GRB : Green, Red, Blue
|
||||||
end else begin
|
ws2812_dout <= 1'b0; // Commencer par envoyer un "0"
|
||||||
// Envoyer chaque bit un à un en contrôlant la durée de l'impulsion
|
end else begin
|
||||||
ws2812_dout <= shift_reg[23]; // Le bit le plus significatif
|
// Décalage des bits pour envoyer les données
|
||||||
shift_reg <= shift_reg << 1; // Décalage des bits
|
if (shift_reg[23]) begin
|
||||||
end
|
// T1H: 0.7µs haut, 0.6µs bas (pour un bit "1")
|
||||||
// Incrémentation du compteur de bits
|
ws2812_dout <= 1'b1;
|
||||||
if (bit_count < 24)
|
timing_counter <= T1H;
|
||||||
bit_count <= bit_count + 1;
|
end else begin
|
||||||
else
|
// T0H: 0.35µs haut, 0.8µs bas (pour un bit "0")
|
||||||
bit_count <= 0; // Réinitialiser pour envoyer la prochaine couleur
|
ws2812_dout <= 1'b0;
|
||||||
|
timing_counter <= T0H;
|
||||||
end
|
end
|
||||||
endmodule
|
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
|
Reference in New Issue
Block a user