Files
gowin-toolchain/RTL/UartTx.v
2026-07-09 22:48:08 +02:00

63 lines
1.6 KiB
Verilog

module UartTx (
clock,
reset,
io_data_ready,
io_data_valid,
io_data_bits,
io_signal,
io_clock_enable
);
input clock;
input reset;
output wire io_data_ready;
input io_data_valid;
input [7:0] io_data_bits;
output wire io_signal;
input io_clock_enable;
reg [1:0] state;
reg [7:0] data;
reg data_waiting;
reg [2:0] bit_counter;
reg [7:0] stop_bit_wait;
wire _GEN = state == 2'h0;
wire _GEN_0 = state == 2'h1;
wire _GEN_1 = state == 2'h2;
wire [7:0] _io_signal_T = data >> bit_counter;
always @(posedge clock) begin : sv2v_autoblock_1
reg _GEN_2;
_GEN_2 = ~data_waiting & io_data_valid;
if (reset) begin
state <= 2'h0;
data_waiting <= 1'h0;
stop_bit_wait <= 8'h00;
end
else begin : sv2v_autoblock_2
reg _GEN_3;
reg _GEN_4;
reg _GEN_5;
_GEN_5 = (_GEN | _GEN_0) | _GEN_1;
_GEN_3 = stop_bit_wait == 8'h14;
_GEN_4 = &state & _GEN_3;
if (io_clock_enable) begin : sv2v_autoblock_3
reg [7:0] _GEN_6;
_GEN_6 = {(_GEN_4 ? 2'h0 : state), 1'h1, &bit_counter, 3'h4, data_waiting};
state <= _GEN_6[state * 2+:2];
end
data_waiting <= ((~io_clock_enable | _GEN_5) | ~_GEN_4) & (_GEN_2 | data_waiting);
if ((~io_clock_enable | _GEN_5) | ~(&state))
;
else
stop_bit_wait <= (_GEN_3 ? 8'h00 : stop_bit_wait + 8'h01);
end
if (_GEN_2)
data <= io_data_bits;
if (io_clock_enable) begin : sv2v_autoblock_4
reg [11:0] _GEN_7;
_GEN_7 = {bit_counter, bit_counter + 3'h1, 3'h0, bit_counter};
bit_counter <= _GEN_7[state * 3+:3];
end
end
assign io_data_ready = ~data_waiting;
assign io_signal = _GEN | (~_GEN_0 & (~_GEN_1 | _io_signal_T[0]));
endmodule