summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Blake Kongslie2022-03-27 09:30:58 -0700
committerJulian Blake Kongslie2022-03-27 09:30:58 -0700
commitdb73f4c2a7586bd4238e58a386edc33ab3906f51 (patch)
tree162caf5dc082fb616b946731f0dd2fc72190c271
parentAdd basic clock-domain-crossing FIFO. (diff)
downloadmultipdp8-db73f4c2a7586bd4238e58a386edc33ab3906f51.tar.xz
First pass at RS232 tx/rx modules.
Diffstat (limited to '')
-rw-r--r--hdl/rs232.sv131
1 files changed, 131 insertions, 0 deletions
diff --git a/hdl/rs232.sv b/hdl/rs232.sv
new file mode 100644
index 0000000..2f631f8
--- /dev/null
+++ b/hdl/rs232.sv
@@ -0,0 +1,131 @@
1`include "defs.svh"
2
3module rs232_tx
4 ( input bit clock
5 , input bit reset
6
7 , output bit out_ready
8 , input bit out_valid
9 , input uart_byte_t out_data
10
11 , output bit tx
12 );
13
14 bit hold_valid;
15 uart_byte_t hold;
16
17 (* syn_encoding = "one-hot" *) enum int unsigned
18 { START
19 , DATA
20 , STOP
21 } state;
22
23 bit [$clog2(`UART_BYTE_BITS+1):0] data_bits;
24
25 always @(posedge clock) begin
26 if (reset) begin
27 out_ready = 0;
28 tx = 1;
29 hold_valid = 0;
30 state = state.first;
31 data_bits = 0;
32 end else begin
33 if (out_ready && out_valid) begin
34 hold_valid = 1;
35 hold = out_data;
36 state = state.first;
37 data_bits = `UART_BYTE_BITS;
38 end
39
40 if (hold_valid) begin
41 case (state)
42
43 START: begin
44 tx = 0;
45 state = state.next;
46 end
47
48 DATA: begin
49 --data_bits;
50 tx = !out_data[data_bits];
51 if (data_bits == 0)
52 state = state.next;
53 end
54
55 STOP: begin
56 hold_valid = 0;
57 tx = 1;
58 state = state.next;
59 end
60
61 endcase
62 end else begin
63 tx = 1;
64 end
65
66 out_ready = !hold_valid;
67 end
68 end
69
70endmodule
71
72module rs232_rx
73 ( input bit clock
74 , input bit reset
75
76 , input bit in_ready
77 , output bit in_valid
78 , output uart_byte_t in_data
79
80 , input bit rx
81 );
82
83 (* syn_encoding = "one-hot" *) enum int unsigned
84 { START
85 , DATA
86 , STOP
87 } state;
88
89 uart_byte_t buffer;
90 bit [$clog2(`UART_BYTE_BITS+1):0] data_bits;
91
92 always @(posedge clock) begin
93 if (reset) begin
94 in_valid = 0;
95 state = state.first;
96 buffer = 0;
97 data_bits = 0;
98 end else begin
99 if (in_ready && in_valid)
100 in_valid = 0;
101
102 case (state)
103
104 START: begin
105 if (rx == 0) begin
106 state = state.next;
107 buffer = 0;
108 data_bits = `UART_BYTE_BITS;
109 end
110 end
111
112 DATA: begin
113 --data_bits;
114 buffer[data_bits] = !rx;
115 if (data_bits == 0)
116 state = state.next;
117 end
118
119 STOP: begin
120 if (!in_valid && rx == 1) begin
121 in_valid = 1;
122 in_data = data_bits;
123 end
124 state = state.next;
125 end
126
127 endcase
128 end
129 end
130
131endmodule