summaryrefslogtreecommitdiff
path: root/hdl/rs232.sv
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--hdl/rs232.sv23
1 files changed, 23 insertions, 0 deletions
diff --git a/hdl/rs232.sv b/hdl/rs232.sv
index 41403a6..420f273 100644
--- a/hdl/rs232.sv
+++ b/hdl/rs232.sv
@@ -13,10 +13,12 @@ module rs232_tx
13 13
14 bit hold_valid; 14 bit hold_valid;
15 uart_byte_t hold; 15 uart_byte_t hold;
16 bit parity;
16 17
17 (* syn_encoding = "one-hot" *) enum int unsigned 18 (* syn_encoding = "one-hot" *) enum int unsigned
18 { START 19 { START
19 , DATA 20 , DATA
21 , PARITY
20 , STOP1 22 , STOP1
21 , STOP2 23 , STOP2
22 } state; 24 } state;
@@ -28,12 +30,14 @@ module rs232_tx
28 out_ready = 0; 30 out_ready = 0;
29 tx = 1; 31 tx = 1;
30 hold_valid = 0; 32 hold_valid = 0;
33 parity = 0;
31 state = state.first; 34 state = state.first;
32 data_bits = 0; 35 data_bits = 0;
33 end else begin 36 end else begin
34 if (out_ready && out_valid) begin 37 if (out_ready && out_valid) begin
35 hold_valid = 1; 38 hold_valid = 1;
36 hold = out_data; 39 hold = out_data;
40 parity = 0;
37 state = state.first; 41 state = state.first;
38 data_bits = 0; 42 data_bits = 0;
39 end 43 end
@@ -48,12 +52,18 @@ module rs232_tx
48 52
49 DATA: begin 53 DATA: begin
50 tx = hold[data_bits]; 54 tx = hold[data_bits];
55 parity = parity ^ tx;
51 if (data_bits == `UART_BYTE_BITS-1) 56 if (data_bits == `UART_BYTE_BITS-1)
52 state = state.next; 57 state = state.next;
53 else 58 else
54 ++data_bits; 59 ++data_bits;
55 end 60 end
56 61
62 PARITY: begin
63 tx = parity;
64 state = state.next;
65 end
66
57 STOP1: begin 67 STOP1: begin
58 tx = 1; 68 tx = 1;
59 state = state.next; 69 state = state.next;
@@ -90,11 +100,13 @@ module rs232_rx
90 (* syn_encoding = "one-hot" *) enum int unsigned 100 (* syn_encoding = "one-hot" *) enum int unsigned
91 { START 101 { START
92 , DATA 102 , DATA
103 , PARITY
93 , STOP 104 , STOP
94 } state; 105 } state;
95 106
96 uart_byte_t buffer; 107 uart_byte_t buffer;
97 bit [$clog2(`UART_BYTE_BITS):0] data_bits; 108 bit [$clog2(`UART_BYTE_BITS):0] data_bits;
109 bit parity;
98 110
99 always @(posedge clock) begin 111 always @(posedge clock) begin
100 if (reset) begin 112 if (reset) begin
@@ -102,6 +114,7 @@ module rs232_rx
102 state = state.first; 114 state = state.first;
103 buffer = 0; 115 buffer = 0;
104 data_bits = 0; 116 data_bits = 0;
117 parity = 0;
105 end else begin 118 end else begin
106 if (in_ready && in_valid) 119 if (in_ready && in_valid)
107 in_valid = 0; 120 in_valid = 0;
@@ -113,17 +126,27 @@ module rs232_rx
113 state = state.next; 126 state = state.next;
114 buffer = 0; 127 buffer = 0;
115 data_bits = 0; 128 data_bits = 0;
129 parity = 0;
116 end 130 end
117 end 131 end
118 132
119 DATA: begin 133 DATA: begin
120 buffer[data_bits] = rx; 134 buffer[data_bits] = rx;
135 parity = parity ^ rx;
121 if (data_bits == `UART_BYTE_BITS-1) 136 if (data_bits == `UART_BYTE_BITS-1)
122 state = state.next; 137 state = state.next;
123 else 138 else
124 ++data_bits; 139 ++data_bits;
125 end 140 end
126 141
142 PARITY: begin
143 parity = parity ^ rx;
144 if (parity == 0)
145 state = state.next;
146 else
147 state = state.first;
148 end
149
127 STOP: begin 150 STOP: begin
128 if (!in_valid && rx == 1) begin 151 if (!in_valid && rx == 1) begin
129 in_valid = 1; 152 in_valid = 1;