| // Bi-direction UART. | 
 | module UART ( | 
 |     input rst, | 
 |     // IO ports | 
 |     input clk, | 
 |     input rx, | 
 |     output tx, | 
 |     // Tx data port | 
 |     input tx_data_ready, | 
 |     input [7:0] tx_data, | 
 |     output tx_data_accepted, | 
 |     // Rx data port | 
 |     output [7:0] rx_data, | 
 |     output rx_data_ready, | 
 |     output rx_framing_error | 
 | ); | 
 |     // COUNTER*OVERSAMPLE == effective baud rate. | 
 |     // | 
 |     // So given a 100 MHz clock (100000000), an 8x oversample and a counter | 
 |     // of 25, (100000000/(8*25)) => 500000 baud. | 
 |     // | 
 |     // BAUDGEN generates an edge COUNTER clock cycles. | 
 |     // Two BAUDGEN's are used, one for the Tx which is at the baudrate, and | 
 |     // one for the Rx which is at OVERSAMPLE times the baudrate. | 
 |     parameter COUNTER = 25; | 
 |     parameter OVERSAMPLE = 8; | 
 |  | 
 |     wire tx_baud_edge; | 
 |     wire rx_baud_edge; | 
 |  | 
 |     BAUDGEN #(.COUNTER(COUNTER*OVERSAMPLE)) tx_baud ( | 
 |         .clk(clk), | 
 |         .rst(rst), | 
 |         .baud_edge(tx_baud_edge) | 
 |     ); | 
 |  | 
 |     UART_TX tx_gen( | 
 |         .rst(rst), | 
 |         .clk(clk), | 
 |         .baud_edge(tx_baud_edge), | 
 |         .data_ready(tx_data_ready), | 
 |         .data(tx_data), | 
 |         .tx(tx), | 
 |         .data_accepted(tx_data_accepted) | 
 |     ); | 
 |  | 
 |     BAUDGEN #(.COUNTER(COUNTER)) rx_baud ( | 
 |         .clk(clk), | 
 |         .rst(rst), | 
 |         .baud_edge(rx_baud_edge) | 
 |     ); | 
 |  | 
 |     UART_RX rx_gen( | 
 |         .rst(rst), | 
 |         .clk(clk), | 
 |         .baud_edge(rx_baud_edge), | 
 |         .rx(rx), | 
 |         .data(rx_data), | 
 |         .data_ready(rx_data_ready), | 
 |         .framing_error(rx_framing_error) | 
 |     ); | 
 | endmodule |