summaryrefslogtreecommitdiff
path: root/hdl/core.sv
diff options
context:
space:
mode:
Diffstat (limited to 'hdl/core.sv')
-rw-r--r--hdl/core.sv73
1 files changed, 69 insertions, 4 deletions
diff --git a/hdl/core.sv b/hdl/core.sv
index 1b61944..c0e1a63 100644
--- a/hdl/core.sv
+++ b/hdl/core.sv
@@ -6,21 +6,58 @@ module core
6 ) 6 )
7 ( input bit clk 7 ( input bit clk
8 , input bit reset 8 , input bit reset
9
10 , input bit switch_cont
11
12 , output bit [0:ADDR_BITS-1] led_pc
13 , output bit [0:ADDR_BITS-1] led_memaddr
14 , output bit [0:DATA_BITS-1] led_memdata
15 , output bit [0:DATA_BITS-1] led_acc
16 , output bit [0:DATA_BITS-1] led_mq
17 , output bit led_and
18 , output bit led_tad
19 , output bit led_isz
20 , output bit led_dca
21 , output bit led_jms
22 , output bit led_jmp
23 , output bit led_iot
24 , output bit led_opr
25 , output bit led_fetch
26 , output bit led_execute
27 , output bit led_defer
28 , output bit led_word_count
29 , output bit led_current_address
30 , output bit led_break
31 , output bit led_ion
32 , output bit led_pause
33 , output bit led_run
34 , output bit [0:4] led_step_counter
35 , output bit [0:2] led_df
36 , output bit [0:2] led_if
37 , output bit led_link
9 ); 38 );
10 39
40bit run;
41assign led_run = run;
42
11bit mem_ready; 43bit mem_ready;
12bit mem_valid; 44bit mem_valid;
13bit mem_write; 45bit mem_write;
14bit [ADDR_BITS-1:0] mem_address; 46bit [ADDR_BITS-1:0] mem_address;
15bit [DATA_BITS-1:0] mem_write_data; 47bit [DATA_BITS-1:0] mem_write_data;
16 48
49assign led_df = 0;
50assign led_if = 0;
51assign led_memaddr = mem_address;
52
17bit mem_read_valid; 53bit mem_read_valid;
18bit [DATA_BITS-1:0] mem_read_data; 54bit [DATA_BITS-1:0] mem_read_data;
19 55
20mem 56mem
21 #( .ADDR_BITS(ADDR_BITS) 57 #( .ADDR_BITS(ADDR_BITS)
22 , .DATA_BITS(DATA_BITS) 58 , .DATA_BITS(DATA_BITS)
23 , .INIT_FILE("mem/focal69.loaded.hex") 59// , .INIT_FILE("mem/focal69.loaded.hex")
60 , .INIT_FILE("build/mem/hello.hex")
24 ) 61 )
25 memory 62 memory
26 ( .clk(clk) 63 ( .clk(clk)
@@ -67,6 +104,19 @@ bit [8:0] operand;
67bit [DATA_BITS-1:0] acc; 104bit [DATA_BITS-1:0] acc;
68bit link; 105bit link;
69 106
107assign led_pc = pc;
108assign led_acc = acc;
109assign led_link = link;
110
111assign led_and = opcode == 0;
112assign led_tad = opcode == 1;
113assign led_isz = opcode == 2;
114assign led_dca = opcode == 3;
115assign led_jms = opcode == 4;
116assign led_jmp = opcode == 5;
117assign led_iot = opcode == 6;
118assign led_opr = opcode == 7;
119
70bit kbd_valid; 120bit kbd_valid;
71bit [DATA_BITS-1:0] kbd_data; 121bit [DATA_BITS-1:0] kbd_data;
72 122
@@ -87,8 +137,14 @@ enum
87 , HALT 137 , HALT
88 } state; 138 } state;
89 139
140assign led_fetch = state == FETCH || state == DECODE;
141assign led_execute = state == AGEN || state == EXEC;
142assign led_defer = state == INDIRECT || state == INDIRECTED || state == PREINC;
143assign led_pause = state == MEMWAIT || state == HALT;
144
90always_ff @(posedge clk) begin 145always_ff @(posedge clk) begin
91 if (reset) begin 146 if (reset) begin
147 run = 0;
92 mem_valid = 0; 148 mem_valid = 0;
93 rx_ready = 0; 149 rx_ready = 0;
94 tx_valid = 0; 150 tx_valid = 0;
@@ -98,7 +154,9 @@ always_ff @(posedge clk) begin
98 link = 1; 154 link = 1;
99 kbd_valid = 0; 155 kbd_valid = 0;
100 state = state.first; 156 state = state.first;
101 end else begin 157 end else if (run || switch_cont) begin
158 run = 1;
159
102 if (`lag(tx_ready)) tx_valid = 0; 160 if (`lag(tx_ready)) tx_valid = 0;
103 if (rx_ready && `lag(rx_valid)) begin 161 if (rx_ready && `lag(rx_valid)) begin
104 kbd_valid = 1; 162 kbd_valid = 1;
@@ -122,6 +180,7 @@ always_ff @(posedge clk) begin
122 mem_write = 0; 180 mem_write = 0;
123 if (`lag(mem_read_valid)) begin 181 if (`lag(mem_read_valid)) begin
124 state = FETCH; 182 state = FETCH;
183 led_memdata = `lag(mem_read_data);
125 {opcode, operand} = `lag(mem_read_data); 184 {opcode, operand} = `lag(mem_read_data);
126// $display("%o: decode %o %o", pc-1, opcode, operand); 185// $display("%o: decode %o %o", pc-1, opcode, operand);
127 // verilator lint_off WIDTH 186 // verilator lint_off WIDTH
@@ -261,10 +320,12 @@ always_ff @(posedge clk) begin
261 end 320 end
262 if (`lag(mem_read_valid)) begin 321 if (`lag(mem_read_valid)) begin
263 if (address[7:3] == 5'b00001) begin 322 if (address[7:3] == 5'b00001) begin
323 led_memdata = `lag(mem_read_data);
264 address = {{(ADDR_BITS - DATA_BITS){1'b0}}, `lag(mem_read_data)}; 324 address = {{(ADDR_BITS - DATA_BITS){1'b0}}, `lag(mem_read_data)};
265 address += 1; 325 address += 1;
266 state = PREINC; 326 state = PREINC;
267 end else begin 327 end else begin
328 led_memdata = `lag(mem_read_data);
268 address = {{(ADDR_BITS - DATA_BITS){1'b0}}, `lag(mem_read_data)}; 329 address = {{(ADDR_BITS - DATA_BITS){1'b0}}, `lag(mem_read_data)};
269 case (opcode) 330 case (opcode)
270 'o0, 'o1, 'o2: state = AGEN; 331 'o0, 'o1, 'o2: state = AGEN;
@@ -282,6 +343,7 @@ always_ff @(posedge clk) begin
282 mem_valid = 1; 343 mem_valid = 1;
283 mem_write = 1; 344 mem_write = 1;
284 mem_write_data = address[DATA_BITS-1:0]; 345 mem_write_data = address[DATA_BITS-1:0];
346 led_memdata = mem_write_data;
285 case (opcode) 347 case (opcode)
286 'o0, 'o1, 'o2: state = `lag(mem_ready) ? AGEN : PREINC; 348 'o0, 'o1, 'o2: state = `lag(mem_ready) ? AGEN : PREINC;
287 'o3, 'o4, 'o5: state = `lag(mem_ready) ? EXEC : PREINC; 349 'o3, 'o4, 'o5: state = `lag(mem_ready) ? EXEC : PREINC;
@@ -311,13 +373,14 @@ always_ff @(posedge clk) begin
311 if (! stall) begin 373 if (! stall) begin
312 state = FETCH; 374 state = FETCH;
313 case (opcode) 375 case (opcode)
314 'o0: acc &= `lag(mem_read_data); 376 'o0: begin led_memdata = `lag(mem_read_data); acc &= `lag(mem_read_data); end
315 'o1: {link, acc} += {1'b0, `lag(mem_read_data)}; 377 'o1: begin led_memdata = `lag(mem_read_data); {link, acc} += {1'b0, `lag(mem_read_data)}; end
316 'o2: begin 378 'o2: begin
317 mem_valid = 1; 379 mem_valid = 1;
318 mem_address = address; 380 mem_address = address;
319 mem_write = 1; 381 mem_write = 1;
320 mem_write_data = `lag(mem_read_data) + 1; 382 mem_write_data = `lag(mem_read_data) + 1;
383 led_memdata = mem_write_data;
321 if (mem_write_data == 0) ++pc; 384 if (mem_write_data == 0) ++pc;
322 state = MEMWAIT; 385 state = MEMWAIT;
323 end 386 end
@@ -326,6 +389,7 @@ always_ff @(posedge clk) begin
326 mem_address = address; 389 mem_address = address;
327 mem_write = 1; 390 mem_write = 1;
328 mem_write_data = acc; 391 mem_write_data = acc;
392 led_memdata = mem_write_data;
329 acc = 0; 393 acc = 0;
330 state = MEMWAIT; 394 state = MEMWAIT;
331 end 395 end
@@ -334,6 +398,7 @@ always_ff @(posedge clk) begin
334 mem_address = address; 398 mem_address = address;
335 mem_write = 1; 399 mem_write = 1;
336 mem_write_data = pc[DATA_BITS-1:0]; 400 mem_write_data = pc[DATA_BITS-1:0];
401 led_memdata = mem_write_data;
337 pc = address + 1; 402 pc = address + 1;
338 state = MEMWAIT; 403 state = MEMWAIT;
339 end 404 end