forked from tanchou/Verilog
50 lines
1.6 KiB
Coq
50 lines
1.6 KiB
Coq
![]() |
module rx_fifo #(
|
||
|
parameter WIDTH = 8, // Taille des données (8 bits)
|
||
|
parameter DEPTH = 16 // Taille de la FIFO
|
||
|
)(
|
||
|
input clk,
|
||
|
input rst_p,
|
||
|
input [WIDTH-1:0] rx_data_in,
|
||
|
input rx_data_valid, // Indique que les données reçues sont valides
|
||
|
output reg [WIDTH-1:0] rx_data_out,
|
||
|
output reg rx_data_ready, // Indique que les données peuvent être lues
|
||
|
output reg fifo_empty, // FIFO vide
|
||
|
output reg fifo_full // FIFO pleine
|
||
|
);
|
||
|
|
||
|
reg [WIDTH-1:0] fifo_mem [DEPTH-1:0]; // Mémoire FIFO
|
||
|
reg [4:0] wr_ptr = 0; // Pointeur d'écriture
|
||
|
reg [4:0] rd_ptr = 0; // Pointeur de lecture
|
||
|
reg [4:0] fifo_count = 0; // Compteur d'éléments dans la FIFO
|
||
|
|
||
|
always @(posedge clk or posedge rst_p) begin
|
||
|
if (rst_p) begin
|
||
|
wr_ptr <= 0;
|
||
|
rd_ptr <= 0;
|
||
|
fifo_count <= 0;
|
||
|
rx_data_ready <= 0;
|
||
|
fifo_empty <= 1;
|
||
|
fifo_full <= 0;
|
||
|
end else begin
|
||
|
// Écriture dans la FIFO
|
||
|
if (rx_data_valid && !fifo_full) begin
|
||
|
fifo_mem[wr_ptr] <= rx_data_in;
|
||
|
wr_ptr <= wr_ptr + 1;
|
||
|
fifo_count <= fifo_count + 1;
|
||
|
end
|
||
|
|
||
|
// Lecture de la FIFO
|
||
|
if (!fifo_empty) begin
|
||
|
rx_data_out <= fifo_mem[rd_ptr];
|
||
|
rd_ptr <= rd_ptr + 1;
|
||
|
fifo_count <= fifo_count - 1;
|
||
|
end
|
||
|
|
||
|
// Mise à jour des indicateurs de vide et de plein
|
||
|
fifo_empty <= (fifo_count == 0);
|
||
|
fifo_full <= (fifo_count == DEPTH);
|
||
|
rx_data_ready <= !fifo_empty;
|
||
|
end
|
||
|
end
|
||
|
endmodule
|