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