3 * Copyright (C) 2007, 2008, 2009, 2010 Sebastien Bourdeauducq
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, version 3 of the License.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 parameter csr_addr = 4'h0,
20 parameter clk_freq = 100000000,
21 parameter baud = 115200,
22 parameter break_en_default = 1'b0
30 output reg [31:0] csr_do,
45 wire uart_tx_transceiver;
47 uart_transceiver transceiver(
52 .uart_tx(uart_tx_transceiver),
63 .break(break_transceiver)
66 assign uart_tx = thru_en ? uart_rx : uart_tx_transceiver;
67 assign break = break_en & break_transceiver;
70 wire csr_selected = csr_a[13:10] == csr_addr;
72 assign irq = (tx_event & tx_irq_en) | (rx_event & rx_irq_en);
74 assign tx_data = csr_di[7:0];
75 assign tx_wr = csr_selected & csr_we & (csr_a[2:0] == 3'b000);
77 parameter default_divisor = clk_freq/baud/16;
87 always @(posedge sys_clk) begin
89 divisor <= default_divisor;
92 break_en <= break_en_default;
111 if(csr_selected) begin
113 3'b000: csr_do <= rx_data;
114 3'b001: csr_do <= divisor;
115 3'b010: csr_do <= {tx_event, rx_event, thre};
116 3'b011: csr_do <= {thru_en, tx_irq_en, rx_irq_en};
117 3'b100: csr_do <= {break_en};
121 3'b000:; /* handled by transceiver */
122 3'b001: divisor <= csr_di[15:0];
124 /* write one to clear */
131 rx_irq_en <= csr_di[0];
132 tx_irq_en <= csr_di[1];
133 thru_en <= csr_di[2];
135 3'b100: break_en <= csr_di[0];