This patch adds UART BREAK support. A BREAK signal violates the framing by
transmitting a logical 0 for a period that is at least longer than one
frame.
---
 cores/uart/rtl/uart.v             |   18 +++++++++++++++---
 cores/uart/rtl/uart_transceiver.v |    9 +++++++--
 2 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/cores/uart/rtl/uart.v b/cores/uart/rtl/uart.v
index 3c487df..83a317c 100644
--- a/cores/uart/rtl/uart.v
+++ b/cores/uart/rtl/uart.v
@@ -32,7 +32,9 @@ module uart #(
        output tx_irq,
 
        input uart_rx,
-       output uart_tx
+       output uart_tx,
+
+       output break
 );
 
 reg [15:0] divisor;
@@ -40,7 +42,6 @@ wire [7:0] rx_data;
 wire [7:0] tx_data;
 wire tx_wr;
 
-reg thru;
 wire uart_tx_transceiver;
 
 uart_transceiver transceiver(
@@ -57,10 +58,13 @@ uart_transceiver transceiver(
 
        .tx_data(tx_data),
        .tx_wr(tx_wr),
-       .tx_done(tx_irq)
+       .tx_done(tx_irq),
+
+       .break(break_transceiver)
 );
 
 assign uart_tx = thru ? uart_rx : uart_tx_transceiver;
+assign break = break_en & break_transceiver;
 
 /* CSR interface */
 wire csr_selected = csr_a[13:10] == csr_addr;
@@ -70,24 +74,32 @@ assign tx_wr = csr_selected & csr_we & (csr_a[1:0] == 
2'b00);
 
 parameter default_divisor = clk_freq/baud/16;
 
+reg thru;
+reg break_en;
+
 always @(posedge sys_clk) begin
        if(sys_rst) begin
                divisor <= default_divisor;
                csr_do <= 32'd0;
                thru <= 1'b0;
+               break_en <= 1'b1;
        end else begin
                csr_do <= 32'd0;
+               if (break)
+                       break_en <= 1'b0;
                if(csr_selected) begin
                        case(csr_a[1:0])
                                2'b00: csr_do <= rx_data;
                                2'b01: csr_do <= divisor;
                                2'b10: csr_do <= thru;
+                               2'b11: csr_do <= break_en;
                        endcase
                        if(csr_we) begin
                                case(csr_a[1:0])
                                        2'b00:; /* handled by transceiver */
                                        2'b01: divisor <= csr_di[15:0];
                                        2'b10: thru <= csr_di[0];
+                                       2'b11: break_en <= csr_di[0];
                                endcase
                        end
                end
diff --git a/cores/uart/rtl/uart_transceiver.v 
b/cores/uart/rtl/uart_transceiver.v
index 2348610..dc350bb 100644
--- a/cores/uart/rtl/uart_transceiver.v
+++ b/cores/uart/rtl/uart_transceiver.v
@@ -30,7 +30,9 @@ module uart_transceiver(
 
        input [7:0] tx_data,
        input tx_wr,
-       output reg tx_done
+       output reg tx_done,
+
+       output reg break
 );
 
 //-----------------------------------------------------------------
@@ -77,9 +79,11 @@ always @(posedge sys_clk) begin
                rx_busy <= 1'b0;
                rx_count16  <= 4'd0;
                rx_bitcount <= 4'd0;
+               break <= 1'b0;
                uart_rx_r <= 1'b0;
        end else begin
                rx_done <= 1'b0;
+               break <= 1'b0;
 
                if(enable16) begin
                        uart_rx_r <= uart_rx2;
@@ -103,7 +107,8 @@ always @(posedge sys_clk) begin
                                                if(uart_rx2) begin // stop bit 
ok
                                                        rx_data <= rx_reg;
                                                        rx_done <= 1'b1;
-                                               end // ignore RX error
+                                               end else if(rx_reg == 8'h00) // 
break condition
+                                                       break <= 1'b1;
                                        end else
                                                rx_reg <= {uart_rx2, 
rx_reg[7:1]};
                                end
-- 
1.7.2.3

_______________________________________________
http://lists.milkymist.org/listinfo.cgi/devel-milkymist.org
IRC: #milkymist@Freenode
Twitter: www.twitter.com/milkymistvj
Ideas? http://milkymist.uservoice.com

Reply via email to