1
0
forked from tanchou/Verilog

Refactor UART FIFO implementation: update top-level module and integrate RX/TX FIFO functionality

This commit is contained in:
Gamenight77
2025-05-07 09:46:43 +02:00
parent 86d4f5ddd2
commit abef18227c
8 changed files with 75 additions and 62 deletions

View File

@@ -19,7 +19,7 @@ if not exist runs (
) )
echo === Étape 1 : Synthèse avec Yosys === echo === Étape 1 : Synthèse avec Yosys ===
yosys -p "read_verilog -sv src/verilog/%TOP%.v src/verilog/uart_rx.v src/verilog/uart_tx.v; synth_gowin -top %TOP% -json %JSON_FILE%" yosys -p "read_verilog -sv src/verilog/%TOP%.v IP/verilog/other_rx.v IP/verilog/other_tx.v src/verilog/uart_rx.v src/verilog/uart_tx.v; synth_gowin -top %TOP% -json %JSON_FILE%"
if errorlevel 1 goto error if errorlevel 1 goto error
echo === Étape 2 : Placement & Routage avec nextpnr-himbaechel === echo === Étape 2 : Placement & Routage avec nextpnr-himbaechel ===

View File

@@ -17,23 +17,23 @@ module top_uart_loopback (
end end
// === UART RX === // === UART RX ===
uart_rx uart_rx_inst ( other_uart_rx uart_rx_inst (
.clk(clk), .clk(clk),
.rst_p(1'b0), .rst_n(1'b1),
.rx_pin(rx), .rx_pin(rx),
.rx_received(rx_received), .rx_data_valid(rx_received),
.rx_enable(1'b1), .rx_data_ready(1'b1),
.rx_data(rx_data) .rx_data(rx_data)
); );
// === UART TX === // === UART TX ===
uart_tx uart_tx_inst ( other_uart_tx uart_tx_inst (
.clk(clk), .clk(clk),
.rst_p(1'b0), .rst_n(1'b1),
.data(tx_data), .tx_data(tx_data),
.tx_enable(tx_enable), .tx_data_valid(tx_enable),
.tx_ready(tx_ready), .tx_data_ready(tx_ready),
.tx(tx) .tx_pin(tx)
); );
// === FSM avec délai === // === FSM avec délai ===
@@ -53,34 +53,33 @@ module top_uart_loopback (
if (rx_received && tx_ready) begin if (rx_received && tx_ready) begin
tx_data <= rx_data; tx_data <= rx_data;
state <= WAIT; state <= WAIT;
leds[0] <= 0; leds[0] <= 0;
leds[1] <= 1; leds[1] <= 1;
end end
end end
WAIT: begin WAIT: begin
delay_counter <= delay_counter + 1; if (tx_ready) begin
if (delay_counter == 8'd400 && tx_ready) begin
tx_enable <= 1; tx_enable <= 1;
state <= SEND; state <= SEND;
end else begin end else begin
tx_enable <= 0; tx_enable <= 0;
end end
leds[0] <= 1;
leds[1] <= 0;
end end
SEND: begin SEND: begin
if (!tx_ready) begin // Attendre que la transmission commence
tx_enable <= 0; tx_enable <= 0;
state <= IDLE; end else if (tx_ready && tx_enable == 0) begin
state <= IDLE; // Transmission terminée, retour à lattente
end
leds[0] <= 0; leds[0] <= 0;
leds[1] <= 0; // Envoi terminé leds[1] <= 0;
end end
endcase endcase
end end
endmodule endmodule

View File

@@ -7,7 +7,7 @@ cd /d %~dp0\..
rem === Config de base === rem === Config de base ===
set DEVICE=GW2AR-LV18QN88C8/I7 set DEVICE=GW2AR-LV18QN88C8/I7
set BOARD=tangnano20k set BOARD=tangnano20k
set TOP=top_uart_loopback set TOP=top_uart_loopback_fifo
set CST_FILE=%TOP%.cst set CST_FILE=%TOP%.cst
set JSON_FILE=runs/%TOP%.json set JSON_FILE=runs/%TOP%.json
set PNR_JSON=runs/pnr_%TOP%.json set PNR_JSON=runs/pnr_%TOP%.json
@@ -19,7 +19,7 @@ if not exist runs (
) )
echo === Étape 1 : Synthèse avec Yosys === echo === Étape 1 : Synthèse avec Yosys ===
yosys -p "read_verilog -sv src/verilog/%TOP%.v src/verilog/uart_rx.v src/verilog/uart_tx.v; synth_gowin -top %TOP% -json %JSON_FILE%" yosys -p "read_verilog -sv src/verilog/%TOP%.v src/verilog/uart_rx_fifo.v src/verilog/uart_tx_fifo.v IP/verilog/fifo.v IP/verilog/uart_rx.v IP/verilog/uart_tx.v; synth_gowin -top %TOP% -json %JSON_FILE%"
if errorlevel 1 goto error if errorlevel 1 goto error
echo === Étape 2 : Placement & Routage avec nextpnr-himbaechel === echo === Étape 2 : Placement & Routage avec nextpnr-himbaechel ===

View File

@@ -1,3 +1,3 @@
@echo off @echo off
echo === Lancement de GTKWave === echo === Lancement de GTKWave ===
gtkwave runs/uart_tx_fifo.vcd gtkwave runs/uart_rx_fifo.vcd

View File

@@ -6,7 +6,7 @@ setlocal enabledelayedexpansion
set OUT=runs/sim.vvp set OUT=runs/sim.vvp
:: Top-level testbench module :: Top-level testbench module
set TOP=tb_uart_tx_fifo set TOP=tb_uart_rx_fifo
:: Répertoires contenant des fichiers .v :: Répertoires contenant des fichiers .v
set DIRS=src/verilog tests/verilog IP/verilog set DIRS=src/verilog tests/verilog IP/verilog

View File

@@ -1,65 +1,79 @@
module top_uart_loopback ( module top_uart_loopback_fifo (
input wire clk, // 27 MHz input wire clk, // 27 MHz
input wire rx, input wire rx,
output wire tx, output wire tx,
output reg [5:0] leds output reg [5:0] leds
); );
wire rx_received;
wire [7:0] rx_data;
reg [7:0] tx_data;
reg tx_enable;
wire tx_ready; // === UART TX ===
reg [7:0] wr_data;
reg wr_en;
wire tx_fifo_full;
wire [7:0] rd_data;
reg rd_en;
wire data_available;
initial begin initial begin
leds = 6'b000000; // Initialiser les LEDs à 0 leds = 6'b111111; // Initialiser les LEDs à 0
end end
// === UART RX === // === UART RX ===
uart_rx uart_rx_inst ( uart_rx_fifo uart_rx_inst (
.clk(clk), .clk(clk),
.rst_p(1'b0),
.rx_pin(rx), .rx_pin(rx),
.rx_received(rx_received), .rd_data(rd_data),
.rx_enable(1'b1), .rd_en(rd_en),
.rx_data(rx_data) .data_available(data_available)
); );
// === UART TX === // === UART TX ===
uart_tx uart_tx_inst ( uart_tx_fifo uart_tx_inst (
.clk(clk), .clk(clk),
.rst_p(1'b0), .wr_en(wr_en),
.data(tx_data), .wr_data(wr_data),
.tx_enable(tx_enable), .fifo_full(tx_fifo_full),
.tx_ready(tx_ready), .tx_pin(tx)
.tx(tx)
); );
// === FSM pour déclencher la transmission === // === FSM pour déclencher la transmission ===
localparam IDLE = 0, SEND = 1; localparam IDLE = 0, PREP_READ = 1, READ = 2, WRITE = 3;
reg state = IDLE; reg [1:0] state = IDLE;
always @(posedge clk) begin always @(posedge clk) begin
// Par défaut
wr_en <= 0;
rd_en <= 0;
// Debug visuel
leds[5] <= rx; leds[5] <= rx;
leds[4] <= tx;
leds[3] <= data_available;
leds[2] <= ~fifo_full;
case (state) case (state)
IDLE: begin IDLE: begin
tx_enable <= 0; if (data_available && !fifo_full) begin
if (rx_received && tx_ready) begin rd_en <= 1; // Mettre rd_en à 1 maintenant
tx_data <= rx_data; state <= PREP_READ;
tx_enable <= 1;
state <= SEND;
leds[0] <= 1;
leds[5:1] <= 0;
end end
end end
SEND: begin PREP_READ: begin
tx_enable <= 0; rd_en <= 1;
state <= READ;
end
READ: begin
rd_en <= 0;
wr_data <= rd_data;
state <= WRITE;
end
WRITE: begin
wr_en <= 1;
state <= IDLE; state <= IDLE;
leds[0] <= 0; // LED 0 allumée pour indiquer la réception
leds[1] <= 1; // LED 1 éteinte pour indiquer l'attente de transmission
end end
endcase endcase
end end