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