summaryrefslogtreecommitdiff
path: root/hdl/top.sv
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--hdl/top.sv115
1 files changed, 65 insertions, 50 deletions
diff --git a/hdl/top.sv b/hdl/top.sv
index 34b9769..54cfdc5 100644
--- a/hdl/top.sv
+++ b/hdl/top.sv
@@ -13,14 +13,14 @@ bit have_reset = 0;
13always_ff @(posedge clk) if (reset) have_reset <= 1; 13always_ff @(posedge clk) if (reset) have_reset <= 1;
14assign reset = !reset_n || !have_reset; 14assign reset = !reset_n || !have_reset;
15 15
16bit mem_ready; `define mem_ready `past(mem_ready) 16bit mem_ready;
17bit mem_valid; 17bit mem_valid;
18bit mem_write; 18bit mem_write;
19bit [ADDR_BITS-1:0] mem_address; 19bit [ADDR_BITS-1:0] mem_address;
20bit [DATA_BITS-1:0] mem_write_data; 20bit [DATA_BITS-1:0] mem_write_data;
21 21
22bit mem_read_valid; `define mem_read_valid `past(mem_read_valid) 22bit mem_read_valid;
23bit [DATA_BITS-1:0] mem_read_data; `define mem_read_data `past(mem_read_data) 23bit [DATA_BITS-1:0] mem_read_data;
24 24
25mem 25mem
26 #( .ADDR_BITS(ADDR_BITS) 26 #( .ADDR_BITS(ADDR_BITS)
@@ -41,6 +41,14 @@ mem
41 , .read_data(mem_read_data) 41 , .read_data(mem_read_data)
42 ); 42 );
43 43
44`input(mem_ready)
45`output(mem_valid)
46`output(mem_address)
47`output(mem_write)
48`output(mem_write_data)
49`input(mem_read_valid)
50`input(mem_read_data)
51
44bit rx_ready; 52bit rx_ready;
45bit rx_valid; 53bit rx_valid;
46bit [7:0] rx_data; 54bit [7:0] rx_data;
@@ -56,14 +64,21 @@ jtag_uart
56 , .reset(reset) 64 , .reset(reset)
57 65
58 , .rx_ready(rx_ready) 66 , .rx_ready(rx_ready)
59 , .rx_valid(rx_valid) `define rx_valid `past(rx_valid) 67 , .rx_valid(rx_valid)
60 , .rx_data(rx_data) `define rx_data `past(rx_data) 68 , .rx_data(rx_data)
61 69
62 , .tx_ready(tx_ready) `define tx_ready `past(tx_ready) 70 , .tx_ready(tx_ready)
63 , .tx_valid(tx_valid) 71 , .tx_valid(tx_valid)
64 , .tx_data(tx_data) 72 , .tx_data(tx_data)
65 ); 73 );
66 74
75`output(rx_ready)
76`input(rx_valid)
77`input(rx_data)
78`input(tx_ready)
79`output(tx_valid)
80`output(tx_data)
81
67bit [ADDR_BITS-1:0] pc; 82bit [ADDR_BITS-1:0] pc;
68bit [3:0] opcode; 83bit [3:0] opcode;
69bit [7:0] operand; 84bit [7:0] operand;
@@ -84,33 +99,33 @@ enum
84 99
85always_ff @(posedge clk) begin 100always_ff @(posedge clk) begin
86 if (reset) begin 101 if (reset) begin
87 mem_valid = 0; 102 mem_valid_ = 0;
88 rx_ready = 0; 103 rx_ready_ = 0;
89 tx_valid = 0; 104 tx_valid_ = 0;
90 tx_data = 0; 105 tx_data_ = 0;
91 pc = 0; 106 pc = 0;
92 acc = 0; 107 acc = 0;
93 state = state.first; 108 state = state.first;
94 end else begin 109 end else begin
95 if (`tx_ready) tx_valid = 0; 110 if (tx_ready_) tx_valid_ = 0;
96 111
97 case (state) 112 case (state)
98 FETCH: begin 113 FETCH: begin
99 mem_valid = 1; 114 mem_valid_ = 1;
100 mem_address_ = pc; 115 mem_address_ = pc;
101 mem_write = 0; 116 mem_write_ = 0;
102 if (`mem_ready) begin 117 if (mem_ready_) begin
103 state = DECODE; 118 state = DECODE;
104 ++pc; 119 ++pc;
105 end 120 end
106 end 121 end
107 122
108 DECODE: begin 123 DECODE: begin
109 mem_valid = 0; 124 mem_valid_ = 0;
110 mem_write = 0; 125 mem_write_ = 0;
111 if (`mem_read_valid) begin 126 if (mem_read_valid_) begin
112 state = FETCH; 127 state = FETCH;
113 {opcode, operand} = `mem_read_data; 128 {opcode, operand} = mem_read_data_;
114 sign_extended_operand = {{(DATA_BITS-8){operand[7]}}, operand}; 129 sign_extended_operand = {{(DATA_BITS-8){operand[7]}}, operand};
115 case (opcode) 130 case (opcode)
116 'h0: begin 131 'h0: begin
@@ -135,7 +150,7 @@ always_ff @(posedge clk) begin
135 end 150 end
136 end 151 end
137 'h6: begin 152 'h6: begin
138 mem_write_data = acc % 10 + 'h30; 153 mem_write_data_ = acc % 10 + 'h30;
139 acc = acc / 10; 154 acc = acc / 10;
140 address = {7'b0, operand[6:0]}; 155 address = {7'b0, operand[6:0]};
141 state = operand[7] ? INDIRECT : AGEN; 156 state = operand[7] ? INDIRECT : AGEN;
@@ -145,70 +160,70 @@ always_ff @(posedge clk) begin
145 end 160 end
146 161
147 INDIRECT: begin 162 INDIRECT: begin
148 mem_valid = 1; 163 mem_valid_ = 1;
149 mem_write = 0; 164 mem_write_ = 0;
150 mem_address = address; 165 mem_address_ = address;
151 state = `mem_ready ? INDIRECTED : INDIRECT; 166 state = mem_ready_ ? INDIRECTED : INDIRECT;
152 end 167 end
153 168
154 INDIRECTED: begin 169 INDIRECTED: begin
155 if (`mem_ready) begin 170 if (mem_ready_) begin
156 mem_valid = 0; 171 mem_valid_ = 0;
157 mem_write = 0; 172 mem_write_ = 0;
158 end 173 end
159 if (`mem_read_valid) begin 174 if (mem_read_valid_) begin
160 address = {{(ADDR_BITS - DATA_BITS){1'b0}}, `mem_read_data}; 175 address = {{(ADDR_BITS - DATA_BITS){1'b0}}, mem_read_data_};
161 state = AGEN; 176 state = AGEN;
162 end 177 end
163 end 178 end
164 179
165 AGEN: begin 180 AGEN: begin
166 mem_valid = 0; 181 mem_valid_ = 0;
167 mem_write = 0; 182 mem_write_ = 0;
168 state = FETCH; 183 state = FETCH;
169 case (opcode) 184 case (opcode)
170 'h2: begin 185 'h2: begin
171 mem_valid = 1; 186 mem_valid_ = 1;
172 mem_address = address; 187 mem_address_ = address;
173 state = `mem_ready ? MEMORY : AGEN; 188 state = mem_ready_ ? MEMORY : AGEN;
174 end 189 end
175 'h3: begin 190 'h3: begin
176 mem_valid = 1; 191 mem_valid_ = 1;
177 mem_address = address; 192 mem_address_ = address;
178 mem_write = 1; 193 mem_write_ = 1;
179 mem_write_data = acc; 194 mem_write_data_ = acc;
180 state = `mem_ready ? FETCH : AGEN; 195 state = mem_ready_ ? FETCH : AGEN;
181 end 196 end
182 'h5: pc = address; 197 'h5: pc = address;
183 'h6: begin 198 'h6: begin
184 mem_valid = 1; 199 mem_valid_ = 1;
185 mem_address = address; 200 mem_address_ = address;
186 mem_write = 1; 201 mem_write_ = 1;
187 state = `mem_ready ? FETCH : AGEN; 202 state = mem_ready_ ? FETCH : AGEN;
188 end 203 end
189 endcase 204 endcase
190 end 205 end
191 206
192 MEMORY: begin 207 MEMORY: begin
193 if (`mem_ready) begin 208 if (mem_ready_) begin
194 mem_valid = 0; 209 mem_valid_ = 0;
195 mem_write = 0; 210 mem_write_ = 0;
196 end 211 end
197 state = FETCH; 212 state = FETCH;
198 case (opcode) 213 case (opcode)
199 'h0: begin 214 'h0: begin
200 if (operand[6]) begin 215 if (operand[6]) begin
201 if (tx_valid) begin 216 if (tx_valid_) begin
202 state = MEMORY; 217 state = MEMORY;
203 end else begin 218 end else begin
204 tx_valid = 1; 219 tx_valid_ = 1;
205 tx_data = acc[7:0]; 220 tx_data_ = acc[7:0];
206 end 221 end
207 end 222 end
208 end 223 end
209 'h2: begin 224 'h2: begin
210 if (`mem_read_valid) begin 225 if (mem_read_valid_) begin
211 acc = acc + `mem_read_data; 226 acc = acc + mem_read_data_;
212 end else begin 227 end else begin
213 state = MEMORY; 228 state = MEMORY;
214 end 229 end