forked from tanchou/Verilog
Refactor UART FIFO implementation: update top-level module and integrate RX/TX FIFO functionality
This commit is contained in:
@@ -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 ===
|
||||||
|
@@ -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 à l’attente
|
||||||
|
end
|
||||||
|
|
||||||
leds[0] <= 0;
|
leds[0] <= 0;
|
||||||
leds[1] <= 0; // Envoi terminé
|
leds[1] <= 0;
|
||||||
end
|
end
|
||||||
endcase
|
endcase
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
endmodule
|
endmodule
|
@@ -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 ===
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user