forked from tanchou/Verilog
		
	
		
			
	
	
		
			57 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Coq
		
	
	
	
	
	
		
		
			
		
	
	
			57 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Coq
		
	
	
	
	
	
|   | module uart_tx( | ||
|  |     input wire clk,           | ||
|  |     input wire start,       // Signal de démarrage de la transmission | ||
|  |     input wire [7:0] data,  // Données à transmettre | ||
|  |     output reg tx,          // Sortie de transmission | ||
|  |     output reg busy         // Indicateur de transmission en cours | ||
|  | ); | ||
|  | 
 | ||
|  |     parameter CLK_FREQ = 27_000_000;              | ||
|  |     parameter BAUD_RATE = 115_200;              | ||
|  |      | ||
|  |     localparam BIT_PERIOD = CLK_FREQ / BAUD_RATE;  | ||
|  | 
 | ||
|  |     reg [3:0] bit_index;             | ||
|  |     reg [15:0] clk_count;            | ||
|  |     reg [7:0]  tx_data   = 0; | ||
|  | 
 | ||
|  |     initial begin | ||
|  |         tx = 1;                      // État idle (1) | ||
|  |         busy = 0;                    // Pas de transmission en cours | ||
|  |     end | ||
|  | 
 | ||
|  |     always @(posedge clk) begin | ||
|  |         if (start && !busy) begin | ||
|  | 
 | ||
|  |             busy <= 1;              // Démarrer la transmission | ||
|  |             bit_index <= 0;         // Réinitialiser l'index du bit | ||
|  |             clk_count <= 0;         // Réinitialiser le compteur d'horloge | ||
|  |             tx_data   <= data; | ||
|  |             tx <= 1;                // État idle (1) | ||
|  | 
 | ||
|  |         end else if (busy) begin | ||
|  | 
 | ||
|  |             if (clk_count < BIT_PERIOD - 1) begin | ||
|  |                 clk_count <= clk_count + 1;     | ||
|  |                  | ||
|  |             end else begin | ||
|  |                 clk_count <= 0;                  | ||
|  | 
 | ||
|  |                 if (bit_index == 0) begin | ||
|  |                     tx <= 0;                    // Start bit (0) | ||
|  |                 end else if (bit_index < 9) begin | ||
|  |                     tx <= tx_data[bit_index - 1];  // Transmettre les données (8 bits) | ||
|  |                 end else if (bit_index == 9) begin | ||
|  |                     tx <= 1;                    // Stop bit (1) | ||
|  |                 end else begin | ||
|  |                     busy <= 0;                  // Fin de la transmission | ||
|  |                 end | ||
|  | 
 | ||
|  |                 bit_index <= bit_index + 1;     // Passer au bit suivant | ||
|  |             end | ||
|  | 
 | ||
|  |         end else begin | ||
|  |             tx <= 1;                            // État idle (1) | ||
|  |         end | ||
|  |     end | ||
|  | endmodule |