From 96c234de6d858472cf2736115f91275b7ec3d417 Mon Sep 17 00:00:00 2001 From: Gamenight77 Date: Mon, 28 Apr 2025 17:13:39 +0200 Subject: [PATCH] Add UART communication modules and testbenches - Implemented rx_fifo module for receiving data with FIFO management. - Created tb_top_uart_rx_tx testbench for testing UART transmission and reception. - Developed tb_uart_rx testbench for validating UART receiver functionality. - Added tb_uart_tx testbench for testing UART transmitter behavior. - Designed top_led_uart module to interface UART with LED outputs. - Integrated top_uart_ultrasonic module for ultrasonic sensor data transmission via UART. - Implemented tx_fifo module for transmitting data with FIFO management. - Developed uart_rx module for receiving serial data with state machine control. - Created uart_top module to connect RX and TX functionalities with FIFO buffers. - Implemented uart_tx module for transmitting serial data with state machine control. --- Semaine_3/UARTV2/memo.png | Bin 0 -> 63083 bytes Semaine_3/UARTV2/rx_fifo.v | 49 +++++++++ Semaine_3/UARTV2/tb_top_uart_rx_tx.v | 69 ++++++++++++ Semaine_3/UARTV2/tb_uart_rx.v | 64 +++++++++++ Semaine_3/UARTV2/tb_uart_tx.v | 49 +++++++++ Semaine_3/UARTV2/top_led_uart.v | 61 +++++++++++ Semaine_3/UARTV2/top_uart_ultrasonic.v | 133 +++++++++++++++++++++++ Semaine_3/UARTV2/tx_fifo.v | 57 ++++++++++ Semaine_3/UARTV2/uart_rx.v | 145 +++++++++++++++++++++++++ Semaine_3/UARTV2/uart_top.v | 86 +++++++++++++++ Semaine_3/UARTV2/uart_tx.v | 133 +++++++++++++++++++++++ 11 files changed, 846 insertions(+) create mode 100644 Semaine_3/UARTV2/memo.png create mode 100644 Semaine_3/UARTV2/rx_fifo.v create mode 100644 Semaine_3/UARTV2/tb_top_uart_rx_tx.v create mode 100644 Semaine_3/UARTV2/tb_uart_rx.v create mode 100644 Semaine_3/UARTV2/tb_uart_tx.v create mode 100644 Semaine_3/UARTV2/top_led_uart.v create mode 100644 Semaine_3/UARTV2/top_uart_ultrasonic.v create mode 100644 Semaine_3/UARTV2/tx_fifo.v create mode 100644 Semaine_3/UARTV2/uart_rx.v create mode 100644 Semaine_3/UARTV2/uart_top.v create mode 100644 Semaine_3/UARTV2/uart_tx.v diff --git a/Semaine_3/UARTV2/memo.png b/Semaine_3/UARTV2/memo.png new file mode 100644 index 0000000000000000000000000000000000000000..87b7ec1d941d930e8f886bd8f54e683b8c3fd520 GIT binary patch literal 63083 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�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 UART + always @(posedge clk or posedge rst_p) begin + if (rst_p) begin + uart_start <= 1'b0; + uart_data <= 8'd0; + end else begin + uart_start <= 1'b0; // Par défaut + + if (uart_ready && !fifo_empty) begin + uart_data <= fifo_inst.fifo_mem[fifo_inst.rd_ptr]; // Lecture de la FIFO + uart_start <= 1'b1; + fifo_inst.rd_ptr <= fifo_inst.rd_ptr + 1; + fifo_inst.fifo_count <= fifo_inst.fifo_count - 1; + end + end + end + +endmodule diff --git a/Semaine_3/UARTV2/tx_fifo.v b/Semaine_3/UARTV2/tx_fifo.v new file mode 100644 index 0000000..80ff502 --- /dev/null +++ b/Semaine_3/UARTV2/tx_fifo.v @@ -0,0 +1,57 @@ +module tx_fifo #( + parameter WIDTH = 8, // Taille des données (8 bits) + parameter DEPTH = 16 // Taille de la FIFO +)( + input wire clk, + input wire rst_p, + + // Entrée utilisateur + input wire [WIDTH-1:0] tx_data_in, + input wire tx_data_valid, // Donnée disponible à écrire + output wire tx_data_ready, // FIFO prête à recevoir + + // Sortie vers UART + output reg [WIDTH-1:0] tx_data_out, + input wire uart_tx_ready, // UART demande une donnée + output reg fifo_empty, + output reg fifo_full +); + + reg [WIDTH-1:0] fifo_mem [DEPTH-1:0]; + reg [4:0] wr_ptr = 0; + reg [4:0] rd_ptr = 0; + reg [4:0] fifo_count = 0; + + always @(posedge clk or posedge rst_p) begin + if (rst_p) begin + wr_ptr <= 0; + rd_ptr <= 0; + fifo_count <= 0; + fifo_empty <= 1; + fifo_full <= 0; + tx_data_out <= 0; + end else begin + // Écriture dans FIFO + if (tx_data_valid && !fifo_full) begin + fifo_mem[wr_ptr] <= tx_data_in; + wr_ptr <= wr_ptr + 1; + fifo_count <= fifo_count + 1; + end + + // Lecture depuis FIFO + if (uart_tx_ready && !fifo_empty) begin + tx_data_out <= fifo_mem[rd_ptr]; + rd_ptr <= rd_ptr + 1; + fifo_count <= fifo_count - 1; + end + + // Mise à jour des flags + fifo_empty <= (fifo_count == 0); + fifo_full <= (fifo_count == DEPTH); + end + end + + // FIFO est prête à recevoir des données si pas pleine + assign tx_data_ready = !fifo_full; + +endmodule diff --git a/Semaine_3/UARTV2/uart_rx.v b/Semaine_3/UARTV2/uart_rx.v new file mode 100644 index 0000000..278ee7c --- /dev/null +++ b/Semaine_3/UARTV2/uart_rx.v @@ -0,0 +1,145 @@ +module uart_rx #( + parameter CLK_FREQ = 27_000_000, + parameter BAUD_RATE = 115200 +)( + input clk, //clock input + input rst_p, //asynchronous reset input, high active + input rx_data_ready, //data receiver module ready + input rx_pin, //serial data input + + output reg[7:0] rx_data, //received serial data + output reg rx_data_valid //received serial data is valid +); + +localparam CYCLE = CLK_FREQ * / BAUD_RATE; + +//state machine code +localparam S_IDLE = 1; +localparam S_START = 2; //start bit +localparam S_REC_BYTE = 3; //data bits +localparam S_STOP = 4; //stop bit +localparam S_DATA = 5; + +reg[2:0] state; +reg[2:0] next_state; + +reg rx_d0; //delay 1 clock for rx_pin +reg rx_d1; //delay 1 clock for rx_d0 +wire rx_negedge; //negedge of rx_pin +reg[7:0] rx_bits; //temporary storage of received data +reg[15:0] cycle_cnt; //baud counter +reg[2:0] bit_cnt; //bit counter + +assign rx_negedge = rx_d1 && ~rx_d0; // Front déscendant + +always@(posedge clk or negedge rst_p) // Filtrage du signial +begin + if(rst_p == 1'b1)begin + rx_d0 <= 1'b0; + rx_d1 <= 1'b0; + + end else begin + rx_d0 <= rx_pin; + rx_d1 <= rx_d0; + end +end + + +always@(posedge clk or negedge rst_p)begin // Compteur d'etat + if(rst_p == 1'b1) + state <= S_IDLE; + else + state <= next_state; +end + +always@(*)begin + case(state) + S_IDLE: + if(rx_negedge) // Detection du start bit + next_state = S_START; + else + next_state = S_IDLE; + + S_START: + if(cycle_cnt == CYCLE - 1) //one data cycle + next_state = S_REC_BYTE; + else + next_state = S_START; + + S_REC_BYTE: + if(cycle_cnt == CYCLE - 1 && bit_cnt == 3'd7) //receive 8bit data + next_state = S_STOP; + else + next_state = S_REC_BYTE; + + S_STOP: + if(cycle_cnt == CYCLE/2 - 1) //half bit cycle,to avoid missing the next byte receiver + next_state = S_DATA; + else + next_state = S_STOP; + + S_DATA: + if(rx_data_ready) //data receive complete + next_state = S_IDLE; + else + next_state = S_DATA; + + default: + next_state = S_IDLE; + endcase +end + +always@(posedge clk or negedge rst_p) +begin + if(rst_p == 1'b1) + rx_data_valid <= 1'b0; + else if(state == S_STOP && next_state != state) + rx_data_valid <= 1'b1; + else if(state == S_DATA && rx_data_ready) + rx_data_valid <= 1'b0; +end + +always@(posedge clk or negedge rst_p) +begin + if(rst_p == 1'b1) + rx_data <= 8'd0; + else if(state == S_STOP && next_state != state) + rx_data <= rx_bits;//latch received data +end + +always@(posedge clk or negedge rst_p) +begin + if(rst_p == 1'b1) + begin + bit_cnt <= 3'd0; + end + else if(state == S_REC_BYTE) + if(cycle_cnt == CYCLE - 1) + bit_cnt <= bit_cnt + 3'd1; + else + bit_cnt <= bit_cnt; + else + bit_cnt <= 3'd0; +end + + +always@(posedge clk or negedge rst_p) +begin + if(rst_p == 1'b1) + cycle_cnt <= 16'd0; + else if((state == S_REC_BYTE && cycle_cnt == CYCLE - 1) || next_state != state) + cycle_cnt <= 16'd0; + else + cycle_cnt <= cycle_cnt + 16'd1; +end +//receive serial data bit data +always@(posedge clk or negedge rst_p) +begin + if(rst_p == 1'b1) + rx_bits <= 8'd0; + else if(state == S_REC_BYTE && cycle_cnt == CYCLE/2 - 1) + rx_bits[bit_cnt] <= rx_pin; + else + rx_bits <= rx_bits; +end +endmodule \ No newline at end of file diff --git a/Semaine_3/UARTV2/uart_top.v b/Semaine_3/UARTV2/uart_top.v new file mode 100644 index 0000000..ac9739e --- /dev/null +++ b/Semaine_3/UARTV2/uart_top.v @@ -0,0 +1,86 @@ +module uart_top( + input wire clk, + input wire rst, + + input wire uart_rx, + output wire uart_tx, + + // Interfaces RX vers utilisateur + output wire [7:0] rx_data, + output wire rx_data_valid, + input wire rx_data_ready, + + // Interfaces TX depuis utilisateur + input wire [7:0] tx_data, + input wire tx_data_valid, + output wire tx_data_ready +); + + parameter CLK_FRE = 27_000_000; // Hz + parameter UART_FRE = 115200; // Baudrate + + // === Signaux internes === + wire [7:0] uart_rx_data; + wire uart_rx_data_valid; + wire uart_rx_data_ready; + + wire [7:0] uart_tx_data; + wire uart_tx_data_valid; + wire uart_tx_data_ready; + + // === FIFO RX === + rx_fifo #( + .WIDTH(8), + .DEPTH(16) + ) rx_fifo_inst ( + .clk (clk), + .rst_p (rst), + .rx_data_in (uart_rx_data), + .rx_data_valid (uart_rx_data_valid), + .rx_data_out (rx_data), + .rx_data_ready (rx_data_ready), + .fifo_empty (), // pas utilisé ici + .fifo_full () + ); + + // === FIFO TX === + tx_fifo #( + .WIDTH(8), + .DEPTH(16) + ) tx_fifo_inst ( + .clk (clk), + .rst_p (rst), + .tx_data_in (tx_data), + .tx_data_valid (tx_data_valid), + .tx_data_ready (tx_data_ready), + .tx_data_out (uart_tx_data), + .uart_tx_ready (uart_tx_data_ready) + ); + + // === Instanciation RX UART === + uart_rx #( + .CLK_FRE(CLK_FRE), + .BAUD_RATE(UART_FRE) + ) uart_rx_inst ( + .clk (clk), + .rst_p (rst), + .rx_data (uart_rx_data), + .rx_data_valid (uart_rx_data_valid), + .rx_data_ready (uart_rx_data_ready), + .rx_pin (uart_rx) + ); + + // === Instanciation TX UART === + uart_tx #( + .CLK_FRE(CLK_FRE), + .BAUD_RATE(UART_FRE) + ) uart_tx_inst ( + .clk (clk), + .rst_p (rst), + .tx_data (uart_tx_data), + .tx_data_valid (uart_tx_data_valid), + .tx_data_ready (uart_tx_data_ready), + .tx_pin (uart_tx) + ); + +endmodule diff --git a/Semaine_3/UARTV2/uart_tx.v b/Semaine_3/UARTV2/uart_tx.v new file mode 100644 index 0000000..748631e --- /dev/null +++ b/Semaine_3/UARTV2/uart_tx.v @@ -0,0 +1,133 @@ +module uart_tx #( + parameter CLK_FREQ = 27_000_000, + parameter BAUD_RATE = 115200 +)( + input wire clk, + input wire rst_p, + input wire[7:0] data, + input wire tx_data_valid, + + output wire tx, + output reg tx_data_ready +); + + localparam CYCLE = CLK_FREQ / BAUD_RATE; + + localparam IDLE = 2'd0; + localparam START = 2'd1; + localparam DATA = 2'd2; + localparam STOP = 2'd3; + + reg [1:0] state = IDLE; + reg [1:0] next_state; + reg [15:0] cycle_cnt; //baud counter + reg [3:0] bit_index = 0; + reg [15:0] clk_count = 0; + reg [7:0] tx_data = 0; + reg tx_reg; + + assign tx = tx_reg; + + always@(posedge clk or posedge rst_p)begin // Avance d'etat + if(rst_p == 1'b1) + state <= IDLE; + else + state <= next_state; + end + + always@(*) begin + case(state) + IDLE: + if(tx_data_valid == 1'b1) + next_state = START; + else + next_state = IDLE; + + START: + if(cycle_cnt == CYCLE - 1) + next_state = DATA; + else + next_state = START; + + DATA: + if(cycle_cnt == CYCLE - 1 && bit_cnt == 3'd7) + next_state = STOP; + else + next_state = DATA; + + STOP: + if(cycle_cnt == CYCLE - 1) + next_state = IDLE; + else + next_state = STOP; + default: + next_state = IDLE; + endcase + end + + always@(posedge clk or posedge rst_p)begin // tx_data_ready block + if(rst_p == 1'b1) + begin + tx_data_ready <= 1'b0; + end + + else if(state == IDLE) + if(tx_data_valid == 1'b1) + tx_data_ready <= 1'b0; + else + tx_data_ready <= 1'b1; + + else if(state == STOP && cycle_cnt == CYCLE - 1) + tx_data_ready <= 1'b1; + end + + + always@(posedge clk or posedge rst_p) begin // tx_data_latch block + if(rst_p == 1'b1)begin + tx_data_latch <= 8'd0; + + end else if(state == IDLE && tx_data_valid == 1'b1) + tx_data_latch <= tx_data; + + end + + always@(posedge clk or posedge rst_p)begin // DATA bit_cnt block + if(rst_p == 1'b1)begin + bit_cnt <= 3'd0; + + end else if(state == DATA) + if(cycle_cnt == CYCLE - 1) + bit_cnt <= bit_cnt + 3'd1; + else + bit_cnt <= bit_cnt; + else + bit_cnt <= 3'd0; + end + + + always@(posedge clk or posedge rst_p)begin // Cycle counter + if(rst_p == 1'b1) + cycle_cnt <= 16'd0; + + else if((state == DATA && cycle_cnt == CYCLE - 1) || next_state != state) + cycle_cnt <= 16'd0; + else + cycle_cnt <= cycle_cnt + 16'd1; + end + + always@(posedge clk or posedge rst_p)begin // tx state managment + if(rst_p == 1'b1) + tx_reg <= 1'b1; + else + case(state) + IDLE,STOP: + tx_reg <= 1'b1; + START: + tx_reg <= 1'b0; + DATA: + tx_reg <= tx_data_latch[bit_cnt]; // SENDING BYTE HERE + default: + tx_reg <= 1'b1; + endcase + end +endmodule