Files
riscv-ac/riscv-ac.srcs/sources_1/new/uart_tx.v

89 lines
2.4 KiB
Verilog

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: nope
// Engineer: Jose
//
// Create Date: 03/03/2026 03:02:49 AM
// Design Name: UART TX Module
// Module Name: uart_tx
// Project Name: riscv-ac
// Target Devices: Artix 7
// Tool Versions: 2025.2
// Description: Allows UART transmission
//
// Dependencies:
//
// Revision: 1.0
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module uart_tx (
input wire clk,
input wire [7:0] data_in,
input wire tx_en,
output reg tx = 1
);
// 12e6 / 115200 = 104 ciclos
localparam CLKS_PER_BIT = 868; // 104;
localparam S_IDLE = 2'b00;
localparam S_START = 2'b01;
localparam S_DATA = 2'b10;
localparam S_STOP = 2'b11;
reg [1:0] state = S_IDLE;
reg [15:0] clk_count = 0;
reg [2:0] bit_index = 0;
reg [7:0] tx_data = 0;
always @(posedge clk) begin
case (state)
S_IDLE: begin
tx <= 1;
clk_count <= 0;
bit_index <= 0;
if (tx_en) begin
tx_data <= data_in;
state <= S_START;
end
end
S_START: begin
tx <= 0;
if (clk_count < CLKS_PER_BIT - 1) begin
clk_count <= clk_count + 1;
end else begin
clk_count <= 0;
state <= S_DATA;
end
end
S_DATA: begin
tx <= tx_data[bit_index];
if (clk_count < CLKS_PER_BIT - 1) begin
clk_count <= clk_count + 1;
end else begin
clk_count <= 0;
if (bit_index == 7) begin
state <= S_STOP;
end else begin
bit_index <= bit_index + 1;
end
end
end
S_STOP: begin
tx <= 1;
if (clk_count < CLKS_PER_BIT - 1) begin
clk_count <= clk_count + 1;
end else begin
state <= S_IDLE;
end
end
endcase
end
endmodule