diff options
| author | Julian Blake Kongslie | 2022-04-22 22:43:36 -0700 |
|---|---|---|
| committer | Julian Blake Kongslie | 2022-04-22 22:43:36 -0700 |
| commit | 1aa35d02a3675a2da94f264364681ee7b71111fb (patch) | |
| tree | 647a6855381d8066237e60ff6a4f78a8361d5902 | |
| parent | Transmit two stop bits to RS232 uart. (diff) | |
| download | multipdp8-1aa35d02a3675a2da94f264364681ee7b71111fb.tar.xz | |
Transmit and receive an even parity bit in RS232 uart.
Diffstat (limited to '')
| -rw-r--r-- | hdl/rs232.sv | 23 |
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; |
