| // 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 |