summaryrefslogtreecommitdiff
path: root/hdl/command_parser.sv
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--hdl/command_parser.sv67
1 files changed, 45 insertions, 22 deletions
diff --git a/hdl/command_parser.sv b/hdl/command_parser.sv
index 964ac12..1520db4 100644
--- a/hdl/command_parser.sv
+++ b/hdl/command_parser.sv
@@ -16,19 +16,23 @@ module command_parser
16 , input bit command_ready 16 , input bit command_ready
17 , output bit command_valid 17 , output bit command_valid
18 , output ram_command_t command_data 18 , output ram_command_t command_data
19
20 , input bit loop_ready
21 , output bit loop_valid
22 , output bit loop_data
19 ); 23 );
20 24
21 bit input_byte_valid; 25 bit input_byte_valid;
22 uart_byte_t input_byte; 26 uart_byte_t input_byte;
23 27
24 bit [`RAM_ADDRESS_BITS:0] zero_count; 28 bit [`RAM_ADDRESS_BITS:0] loop_count;
25 29
26 (* syn_encoding = "one-hot" *) enum int unsigned 30 (* syn_encoding = "one-hot" *) enum int unsigned
27 { READ_COMMAND 31 { READ_COMMAND
28 , READ_ADDRESS 32 , READ_ADDRESS
29 , READ_DATA 33 , READ_DATA
30 , READ_ZERO_COUNT 34 , READ_LOOP_COUNT
31 , ZERO_MEMORY 35 , LOOP_MEMORY
32 } state; 36 } state;
33 37
34 always @(posedge clock) begin 38 always @(posedge clock) begin
@@ -38,9 +42,10 @@ module command_parser
38 for (int i = 0; i < `RAM_LINE_WORDS; i = i + 1) 42 for (int i = 0; i < `RAM_LINE_WORDS; i = i + 1)
39 command_data.mask[i] = ~0; 43 command_data.mask[i] = ~0;
40 command_data.tag = TAG; 44 command_data.tag = TAG;
45 loop_valid = 0;
41 input_byte_valid = 0; 46 input_byte_valid = 0;
42 input_byte = 0; 47 input_byte = 0;
43 zero_count = 0; 48 loop_count = 0;
44 state = state.first; 49 state = state.first;
45 end else begin 50 end else begin
46 if (echo_ready) echo_valid = 0; 51 if (echo_ready) echo_valid = 0;
@@ -54,8 +59,11 @@ module command_parser
54 input_byte_valid = 1; 59 input_byte_valid = 1;
55 input_byte = uart_data; 60 input_byte = uart_data;
56 end 61 end
62 if (loop_ready && loop_valid) begin
63 loop_valid = 0;
64 end
57 65
58 if (!command_valid) begin 66 if (!command_valid && !loop_valid) begin
59 case (state) 67 case (state)
60 68
61 READ_COMMAND: if (input_byte_valid) begin 69 READ_COMMAND: if (input_byte_valid) begin
@@ -63,18 +71,24 @@ module command_parser
63 71
64 "@": begin 72 "@": begin
65 command_data.address = 0; 73 command_data.address = 0;
74 loop_valid = 1;
75 loop_data = 0;
66 state = READ_ADDRESS; 76 state = READ_ADDRESS;
67 end 77 end
68 78
69 "?": begin 79 "?": begin
70 command_valid = 1; 80 command_valid = 1;
71 command_data.write = 0; 81 command_data.write = 0;
82 loop_valid = 1;
83 loop_data = 0;
72 end 84 end
73 85
74 "=": begin 86 "=": begin
75 command_data.write = 1; 87 command_data.write = 1;
76 for (int i = 0; i < `RAM_LINE_WORDS; i = i + 1) 88 for (int i = 0; i < `RAM_LINE_WORDS; i = i + 1)
77 command_data.data[i] = 0; 89 command_data.data[i] = 0;
90 loop_valid = 1;
91 loop_data = 0;
78 state = READ_DATA; 92 state = READ_DATA;
79 end 93 end
80 94
@@ -82,8 +96,14 @@ module command_parser
82 command_data.write = 1; 96 command_data.write = 1;
83 for (int i = 0; i < `RAM_LINE_WORDS; i = i + 1) 97 for (int i = 0; i < `RAM_LINE_WORDS; i = i + 1)
84 command_data.data[i] = 0; 98 command_data.data[i] = 0;
85 zero_count = 0; 99 loop_count = 0;
86 state = READ_ZERO_COUNT; 100 state = READ_LOOP_COUNT;
101 end
102
103 "#": begin
104 command_data.write = 0;
105 loop_count = 0;
106 state = READ_LOOP_COUNT;
87 end 107 end
88 108
89 endcase 109 endcase
@@ -129,27 +149,29 @@ module command_parser
129 input_byte_valid = 0; 149 input_byte_valid = 0;
130 end 150 end
131 151
132 READ_ZERO_COUNT: if (input_byte_valid) begin 152 READ_LOOP_COUNT: if (input_byte_valid) begin
133 if (input_byte == ":") begin 153 if (input_byte == ":") begin
134 // ignore 154 // ignore
135 end else if (input_byte >= "0" && input_byte <= "9") begin 155 end else if (input_byte >= "0" && input_byte <= "9") begin
136 zero_count = zero_count << 4; 156 loop_count = loop_count << 4;
137 zero_count[3:0] = input_byte - "0"; 157 loop_count[3:0] = input_byte - "0";
138 end else if (input_byte >= "a" && input_byte <= "f") begin 158 end else if (input_byte >= "a" && input_byte <= "f") begin
139 zero_count = zero_count << 4; 159 loop_count = loop_count << 4;
140 zero_count[3:0] = input_byte - "a" + 10; 160 loop_count[3:0] = input_byte - "a" + 10;
141 end else if (input_byte >= "A" && input_byte <= "F") begin 161 end else if (input_byte >= "A" && input_byte <= "F") begin
142 zero_count = zero_count << 4; 162 loop_count = loop_count << 4;
143 zero_count[3:0] = input_byte - "A" + 10; 163 loop_count[3:0] = input_byte - "A" + 10;
144 end else begin 164 end else begin
145 state = ZERO_MEMORY; 165 loop_valid = 1;
166 loop_data = 1;
167 state = LOOP_MEMORY;
146 end 168 end
147 input_byte_valid = 0; 169 input_byte_valid = 0;
148 end 170 end
149 171
150`ifdef SLOW_ZEROING 172`ifdef SLOW_LOOPING
151 ZERO_MEMORY: if (!echo_valid) begin 173 LOOP_MEMORY: if (!echo_valid) begin
152 if (zero_count == 0) begin 174 if (loop_count == 0) begin
153 echo_valid = 1; 175 echo_valid = 1;
154 echo_data = "\n"; 176 echo_data = "\n";
155 state = state.first; 177 state = state.first;
@@ -157,17 +179,18 @@ module command_parser
157 echo_valid = 1; 179 echo_valid = 1;
158 echo_data = "."; 180 echo_data = ".";
159 command_valid = 1; 181 command_valid = 1;
160 --zero_count; 182 --loop_count;
161 end 183 end
162 end 184 end
163`else 185`else
164 ZERO_MEMORY: begin 186 LOOP_MEMORY: begin
165 if (zero_count == 0) begin 187 if (loop_count == 0) begin
166 state = state.first; 188 state = state.first;
167 end else begin 189 end else begin
168 command_valid = 1; 190 command_valid = 1;
169 if (--zero_count == 0) 191 if (--loop_count == 0) begin
170 state = state.first; 192 state = state.first;
193 end
171 end 194 end
172 end 195 end
173`endif 196`endif