Tutorial: Hello UART (FPGAedu Board v1)

Send "Hello, World!" over serial from your FPGA.

Goal

Implement a UART transmitter in Verilog that sends a cyclic message at 115200 8N1.

Block diagram

[message ROM] -> [control FSM] -> [UART TX] -> TXD pin -> USB-Serial -> PC

Code (excerpt)

// uart_tx.v — parameterized 8N1 transmitter
module uart_tx #(parameter CLK_HZ = 12_000_000, BAUD = 115_200) (
    input  wire clk,
    input  wire start,
    input  wire [7:0] data,
    output reg  tx,
    output reg  busy
);
    localparam DIV = CLK_HZ / BAUD;
    reg [15:0] cnt;
    reg [3:0]  bit_idx;
    reg [9:0]  shift;  // start + 8 data + stop

    always @(posedge clk) begin
        if (!busy && start) begin
            shift   <= {1'b1, data, 1'b0};
            busy    <= 1;
            cnt     <= 0;
            bit_idx <= 0;
        end else if (busy) begin
            if (cnt == DIV-1) begin
                cnt   <= 0;
                tx    <= shift[0];
                shift <= {1'b1, shift[9:1]};
                if (bit_idx == 9) busy <= 0;
                else bit_idx <= bit_idx + 1;
            end else cnt <= cnt + 1;
        end
    end
endmodule

Constraints

set_io clk  35
set_io txd   8   # USB-Serial TXD pin

Test on host

picocom -b 115200 /dev/ttyUSB0
# or on Windows: PuTTY @ 115200 8N1

You should see Hello, World! repeating.

Next step

Combine with the 8x8 LED Matrix to drive a mini-display via UART.

Comments

...