diff options
Diffstat (limited to '')
| -rw-r--r-- | hdl/core.sv | 73 |
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 | ||
| 40 | bit run; | ||
| 41 | assign led_run = run; | ||
| 42 | |||
| 11 | bit mem_ready; | 43 | bit mem_ready; |
| 12 | bit mem_valid; | 44 | bit mem_valid; |
| 13 | bit mem_write; | 45 | bit mem_write; |
| 14 | bit [ADDR_BITS-1:0] mem_address; | 46 | bit [ADDR_BITS-1:0] mem_address; |
| 15 | bit [DATA_BITS-1:0] mem_write_data; | 47 | bit [DATA_BITS-1:0] mem_write_data; |
| 16 | 48 | ||
| 49 | assign led_df = 0; | ||
| 50 | assign led_if = 0; | ||
| 51 | assign led_memaddr = mem_address; | ||
| 52 | |||
| 17 | bit mem_read_valid; | 53 | bit mem_read_valid; |
| 18 | bit [DATA_BITS-1:0] mem_read_data; | 54 | bit [DATA_BITS-1:0] mem_read_data; |
| 19 | 55 | ||
| 20 | mem | 56 | mem |
| 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; | |||
| 67 | bit [DATA_BITS-1:0] acc; | 104 | bit [DATA_BITS-1:0] acc; |
| 68 | bit link; | 105 | bit link; |
| 69 | 106 | ||
| 107 | assign led_pc = pc; | ||
| 108 | assign led_acc = acc; | ||
| 109 | assign led_link = link; | ||
| 110 | |||
| 111 | assign led_and = opcode == 0; | ||
| 112 | assign led_tad = opcode == 1; | ||
| 113 | assign led_isz = opcode == 2; | ||
| 114 | assign led_dca = opcode == 3; | ||
| 115 | assign led_jms = opcode == 4; | ||
| 116 | assign led_jmp = opcode == 5; | ||
| 117 | assign led_iot = opcode == 6; | ||
| 118 | assign led_opr = opcode == 7; | ||
| 119 | |||
| 70 | bit kbd_valid; | 120 | bit kbd_valid; |
| 71 | bit [DATA_BITS-1:0] kbd_data; | 121 | bit [DATA_BITS-1:0] kbd_data; |
| 72 | 122 | ||
| @@ -87,8 +137,14 @@ enum | |||
| 87 | , HALT | 137 | , HALT |
| 88 | } state; | 138 | } state; |
| 89 | 139 | ||
| 140 | assign led_fetch = state == FETCH || state == DECODE; | ||
| 141 | assign led_execute = state == AGEN || state == EXEC; | ||
| 142 | assign led_defer = state == INDIRECT || state == INDIRECTED || state == PREINC; | ||
| 143 | assign led_pause = state == MEMWAIT || state == HALT; | ||
| 144 | |||
| 90 | always_ff @(posedge clk) begin | 145 | always_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 |
