|  | // UART transmitter. | 
|  | module UART_TX( | 
|  | input rst, clk, baud_edge, data_ready, | 
|  | input [7:0] data, | 
|  | output reg tx, data_accepted | 
|  | ); | 
|  | localparam START = (1 << 0), DATA = (1 << 1), END = (1 << 2); | 
|  |  | 
|  | reg [7:0] data_reg; | 
|  | reg [2:0] data_counter; | 
|  | reg [3:0] state; | 
|  |  | 
|  | initial begin | 
|  | tx <= 1; | 
|  | data_accepted <= 0; | 
|  | end | 
|  |  | 
|  | always @(posedge clk) begin | 
|  | if(rst) begin | 
|  | state <= END; | 
|  | tx <= 1; | 
|  | data_accepted <= 0; | 
|  | end else if(baud_edge) begin | 
|  | case(state) | 
|  | START: begin | 
|  | tx <= 0; | 
|  | data_counter <= 0; | 
|  | state <= DATA; | 
|  | end | 
|  | DATA: begin | 
|  | tx <= data_reg[data_counter]; | 
|  | if(data_counter != 7) begin | 
|  | data_counter <= data_counter + 1; | 
|  | end else begin | 
|  | state <= END; | 
|  | data_counter <= 0; | 
|  | end | 
|  | end | 
|  | END: begin | 
|  | tx <= 1; | 
|  | if(data_ready) begin | 
|  | data_accepted <= 1; | 
|  | data_reg <= data; | 
|  | state <= START; | 
|  | end | 
|  | end | 
|  | default: begin | 
|  | tx <= 1; | 
|  | state <= END; | 
|  | end | 
|  | endcase | 
|  | end else begin | 
|  | data_accepted <= 0; | 
|  | end | 
|  | end | 
|  | endmodule |