|
1 | 1 | // |
2 | 2 | // |
3 | | -// File Name : eu.v |
4 | | -// Used on : MCL86jr Board |
| 3 | +// File Name : mcl86_eu_core.v |
| 4 | +// Used on : |
5 | 5 | // Author : Ted Fried, MicroCore Labs |
6 | 6 | // Creation : 10/8/2015 |
7 | 7 | // Code Type : Synthesizable |
|
19 | 19 | // Revision 1.0 10/8/15 |
20 | 20 | // Initial revision |
21 | 21 | // |
22 | | -// Revision 2.0 3/21/21 |
23 | | -// Fixed overflow flag calculations |
| 22 | +// Revision 2.0 11/6/22 |
| 23 | +// Changed overflow flag calculation into rtl instead of microcode |
24 | 24 | // |
25 | 25 | // |
26 | 26 | //------------------------------------------------------------------------ |
@@ -102,10 +102,13 @@ reg eu_tr_latched; |
102 | 102 | reg biu_done_caught; |
103 | 103 | reg eu_biu_req_d1; |
104 | 104 | reg intr_enable_delayed; |
| 105 | +reg eu_overflow_override; |
| 106 | +reg eu_add_overflow8_fixed; |
| 107 | +reg eu_add_overflow16_fixed; |
105 | 108 | wire eu_prefix_rep; |
106 | 109 | wire eu_prefix_repnz; |
107 | 110 | wire eu_tf_debounce; |
108 | | -wire eu_prefix_lock ; |
| 111 | +wire eu_prefix_lock; |
109 | 112 | wire eu_biu_req; |
110 | 113 | wire eu_parity; |
111 | 114 | wire eu_flag_o; |
@@ -158,12 +161,12 @@ wire [15:0] eu_alu_out; |
158 | 161 | wire [15:0] eu_operand0; |
159 | 162 | wire [15:0] eu_operand1; |
160 | 163 | wire [31:0] eu_rom_data; |
| 164 | +wire [15:0] add_total; |
| 165 | +wire [15:0] sub_total; |
| 166 | +wire [15:0] adc_total; |
| 167 | +wire [15:0] sbb_total; |
| 168 | + |
161 | 169 |
|
162 | | -wire [15:0] adc_total; |
163 | | -wire [15:0] sbb_total; |
164 | | -reg eu_overflow_fix; |
165 | | -reg eu_add_overflow8_fixed; |
166 | | -reg eu_add_overflow16_fixed; |
167 | 170 |
|
168 | 171 |
|
169 | 172 | //------------------------------------------------------------------------ |
@@ -336,11 +339,13 @@ assign intr_asserted = BIU_INTR & intr_enable_delayed; |
336 | 339 |
|
337 | 340 | assign new_instruction = (eu_rom_address[12:8]==5'h01) ? 1'b1 : 1'b0; |
338 | 341 |
|
339 | | - |
| 342 | + |
| 343 | +assign add_total = eu_register_r0 + eu_register_r1; |
340 | 344 | assign adc_total = eu_register_r0 + eu_register_r1 + eu_flag_c; |
| 345 | +assign sub_total = eu_register_r0 - eu_register_r1; |
341 | 346 | assign sbb_total = eu_register_r0 - eu_register_r1 - eu_flag_c; |
342 | 347 |
|
343 | | - |
| 348 | + |
344 | 349 | //------------------------------------------------------------------------------------------ |
345 | 350 | // |
346 | 351 | // EU Microsequencer |
@@ -418,97 +423,166 @@ else |
418 | 423 | biu_done_d1 <= BIU_DONE; |
419 | 424 | biu_done_d2 <= biu_done_d1; |
420 | 425 | eu_biu_req_d1 <= eu_biu_req; |
421 | | - if (biu_done_d1==1'b0 && BIU_DONE==1'b1) |
| 426 | + if (biu_done_d2==1'b0 && biu_done_d1==1'b1) |
422 | 427 | biu_done_caught <= 1'b1; |
423 | 428 | else if (eu_biu_req_d1==1'b1 && eu_biu_req==1'b0) |
424 | 429 | biu_done_caught <= 1'b0; |
425 | | - |
| 430 | + |
426 | 431 |
|
427 | | -// ADC - Byte |
428 | | -// |
429 | | -if (eu_rom_address == 16'h0A03) |
430 | | - begin |
431 | | - eu_overflow_fix <= 1'b1; |
432 | | - |
433 | | - if ( ( (eu_register_r0[7]==1'b0) && (eu_register_r1[7]==1'b0) && (adc_total[7]==1'b1) ) || |
434 | | - ( (eu_register_r0[7]==1'b1) && (eu_register_r1[7]==1'b1) && (adc_total[7]==1'b0) ) ) |
| 432 | + // ADD - Byte |
| 433 | + // |
| 434 | + if (eu_rom_address == 16'h09C9) |
435 | 435 | begin |
436 | | - eu_add_overflow8_fixed <= 1'b1; |
| 436 | + eu_overflow_override <= 1'b1; |
| 437 | + |
| 438 | + if ( ( (eu_register_r0[7]==1'b0) && (eu_register_r1[7]==1'b0) && (add_total[7]==1'b1) ) || |
| 439 | + ( (eu_register_r0[7]==1'b1) && (eu_register_r1[7]==1'b1) && (add_total[7]==1'b0) ) ) |
| 440 | + begin |
| 441 | + eu_add_overflow8_fixed <= 1'b1; |
| 442 | + end |
| 443 | + else |
| 444 | + begin |
| 445 | + eu_add_overflow8_fixed <= 1'b0; |
| 446 | + end |
| 447 | + end |
| 448 | + |
| 449 | + // ADC - Byte |
| 450 | + // |
| 451 | + if (eu_rom_address == 16'h0A03) |
| 452 | + begin |
| 453 | + eu_overflow_override <= 1'b1; |
| 454 | + |
| 455 | + if ( ( (eu_register_r0[7]==1'b0) && (eu_register_r1[7]==1'b0) && (adc_total[7]==1'b1) ) || |
| 456 | + ( (eu_register_r0[7]==1'b1) && (eu_register_r1[7]==1'b1) && (adc_total[7]==1'b0) ) ) |
| 457 | + begin |
| 458 | + eu_add_overflow8_fixed <= 1'b1; |
| 459 | + end |
| 460 | + else |
| 461 | + begin |
| 462 | + eu_add_overflow8_fixed <= 1'b0; |
| 463 | + end |
437 | 464 | end |
438 | | - else |
| 465 | + |
| 466 | + // SUB - Byte |
| 467 | + // |
| 468 | + if (eu_rom_address == 16'h0A46) |
439 | 469 | begin |
440 | | - eu_add_overflow8_fixed <= 1'b0; |
| 470 | + eu_overflow_override <= 1'b1; |
| 471 | + |
| 472 | + if ( ( (eu_register_r0[7]==1'b0) && (eu_register_r1[7]==1'b1) && (sub_total[7]==1'b1) ) || |
| 473 | + ( (eu_register_r0[7]==1'b1) && (eu_register_r1[7]==1'b0) && (sub_total[7]==1'b0) ) ) |
| 474 | + begin |
| 475 | + eu_add_overflow8_fixed <= 1'b1; |
| 476 | + end |
| 477 | + else |
| 478 | + begin |
| 479 | + eu_add_overflow8_fixed <= 1'b0; |
| 480 | + end |
441 | 481 | end |
442 | | - end |
443 | | - |
444 | 482 |
|
445 | | -// SBB - Byte |
446 | | -// |
447 | | -if (eu_rom_address == 16'h0AAE) |
448 | | - begin |
449 | | - eu_overflow_fix <= 1'b1; |
450 | | - |
451 | | - if ( ( (eu_register_r0[7]==1'b0) && (eu_register_r1[7]==1'b1) && (sbb_total[7]==1'b1) ) || |
452 | | - ( (eu_register_r0[7]==1'b1) && (eu_register_r1[7]==1'b0) && (sbb_total[7]==1'b0) ) ) |
| 483 | + // SBB - Byte |
| 484 | + // |
| 485 | + if (eu_rom_address == 16'h0AAE) |
453 | 486 | begin |
454 | | - eu_add_overflow8_fixed <= 1'b1; |
455 | | - end |
456 | | - else |
| 487 | + eu_overflow_override <= 1'b1; |
| 488 | + |
| 489 | + if ( ( (eu_register_r0[7]==1'b0) && (eu_register_r1[7]==1'b1) && (sbb_total[7]==1'b1) ) || |
| 490 | + ( (eu_register_r0[7]==1'b1) && (eu_register_r1[7]==1'b0) && (sbb_total[7]==1'b0) ) ) |
| 491 | + begin |
| 492 | + eu_add_overflow8_fixed <= 1'b1; |
| 493 | + end |
| 494 | + else |
| 495 | + begin |
| 496 | + eu_add_overflow8_fixed <= 1'b0; |
| 497 | + end |
| 498 | + end |
| 499 | + |
| 500 | + // ADD - Word |
| 501 | + // |
| 502 | + if (eu_rom_address == 16'h09CC) |
457 | 503 | begin |
458 | | - eu_add_overflow8_fixed <= 1'b0; |
| 504 | + eu_overflow_override <= 1'b1; |
| 505 | + |
| 506 | + if ( ( (eu_register_r0[15]==1'b0) && (eu_register_r1[15]==1'b0) && (add_total[15]==1'b1) ) || |
| 507 | + ( (eu_register_r0[15]==1'b1) && (eu_register_r1[15]==1'b1) && (add_total[15]==1'b0) ) ) |
| 508 | + begin |
| 509 | + eu_add_overflow16_fixed <= 1'b1; |
| 510 | + end |
| 511 | + else |
| 512 | + begin |
| 513 | + eu_add_overflow16_fixed <= 1'b0; |
| 514 | + end |
459 | 515 | end |
460 | | - end |
461 | 516 |
|
462 | | -// ADC - Word |
463 | | -// |
464 | | -if (eu_rom_address == 16'h0A12) |
465 | | - begin |
466 | | - eu_overflow_fix <= 1'b1; |
467 | | - |
468 | | - if ( ( (eu_register_r0[15]==1'b0) && (eu_register_r1[15]==1'b0) && (adc_total[15]==1'b1) ) || |
469 | | - ( (eu_register_r0[15]==1'b1) && (eu_register_r1[15]==1'b1) && (adc_total[15]==1'b0) ) ) |
| 517 | + // ADC - Word |
| 518 | + // |
| 519 | + if (eu_rom_address == 16'h0A12) |
470 | 520 | begin |
471 | | - eu_add_overflow16_fixed <= 1'b1; |
| 521 | + eu_overflow_override <= 1'b1; |
| 522 | + |
| 523 | + if ( ( (eu_register_r0[15]==1'b0) && (eu_register_r1[15]==1'b0) && (adc_total[15]==1'b1) ) || |
| 524 | + ( (eu_register_r0[15]==1'b1) && (eu_register_r1[15]==1'b1) && (adc_total[15]==1'b0) ) ) |
| 525 | + begin |
| 526 | + eu_add_overflow16_fixed <= 1'b1; |
| 527 | + end |
| 528 | + else |
| 529 | + begin |
| 530 | + eu_add_overflow16_fixed <= 1'b0; |
| 531 | + end |
472 | 532 | end |
473 | | - else |
| 533 | + |
| 534 | + // SUB - Word |
| 535 | + // |
| 536 | + if (eu_rom_address == 16'h0A52) |
474 | 537 | begin |
475 | | - eu_add_overflow16_fixed <= 1'b0; |
| 538 | + eu_overflow_override <= 1'b1; |
| 539 | + |
| 540 | + if ( ( (eu_register_r0[15]==1'b0) && (eu_register_r1[15]==1'b1) && (sub_total[15]==1'b1) ) || |
| 541 | + ( (eu_register_r0[15]==1'b1) && (eu_register_r1[15]==1'b0) && (sub_total[15]==1'b0) ) ) |
| 542 | + begin |
| 543 | + eu_add_overflow16_fixed <= 1'b1; |
| 544 | + end |
| 545 | + else |
| 546 | + begin |
| 547 | + eu_add_overflow16_fixed <= 1'b0; |
| 548 | + end |
476 | 549 | end |
477 | | - end |
478 | | - |
479 | 550 |
|
480 | | -// SBB - Word |
481 | | -// |
482 | | -if (eu_rom_address == 16'h0ABA) |
483 | | - begin |
484 | | - eu_overflow_fix <= 1'b1; |
485 | | - |
486 | | - if ( ( (eu_register_r0[15]==1'b0) && (eu_register_r1[15]==1'b1) && (sbb_total[15]==1'b1) ) || |
487 | | - ( (eu_register_r0[15]==1'b1) && (eu_register_r1[15]==1'b0) && (sbb_total[15]==1'b0) ) ) |
| 551 | + // SBB - Word |
| 552 | + // |
| 553 | + if (eu_rom_address == 16'h0ABA) |
488 | 554 | begin |
489 | | - eu_add_overflow16_fixed <= 1'b1; |
490 | | - end |
491 | | - else |
492 | | - begin |
493 | | - eu_add_overflow16_fixed <= 1'b0; |
| 555 | + eu_overflow_override <= 1'b1; |
| 556 | + |
| 557 | + if ( ( (eu_register_r0[15]==1'b0) && (eu_register_r1[15]==1'b1) && (sbb_total[15]==1'b1) ) || |
| 558 | + ( (eu_register_r0[15]==1'b1) && (eu_register_r1[15]==1'b0) && (sbb_total[15]==1'b0) ) ) |
| 559 | + begin |
| 560 | + eu_add_overflow16_fixed <= 1'b1; |
| 561 | + end |
| 562 | + else |
| 563 | + begin |
| 564 | + eu_add_overflow16_fixed <= 1'b0; |
| 565 | + end |
494 | 566 | end |
495 | | - end |
496 | 567 |
|
497 | | -if (eu_rom_address == 16'h0011) eu_overflow_fix <= 1'b0; |
498 | 568 |
|
499 | | - |
| 569 | + // Debounce the overflow flag override when microcode returns to the main loop |
| 570 | + // |
| 571 | + if (eu_rom_address == 16'h0011) eu_overflow_override <= 1'b0; |
| 572 | + |
| 573 | + |
| 574 | + |
500 | 575 | // Generate and store flags for addition |
501 | 576 | if (eu_stall_pipeline==1'b0 && eu_opcode_type==3'h2) |
502 | 577 | begin |
503 | 578 | eu_add_carry <= carry[16]; |
504 | 579 | eu_add_carry8 <= carry[8]; |
505 | 580 | eu_add_aux_carry <= carry[4]; |
506 | | - eu_add_overflow16 <= (eu_overflow_fix==1'b1) ? eu_add_overflow16_fixed : (carry[16] ^ carry[15]); |
507 | | - eu_add_overflow8 <= (eu_overflow_fix==1'b1) ? eu_add_overflow8_fixed : (carry[8] ^ carry[7]); |
| 581 | + eu_add_overflow16 <= (eu_overflow_override==1'b1) ? eu_add_overflow16_fixed : (carry[16] ^ carry[15]); |
| 582 | + eu_add_overflow8 <= (eu_overflow_override==1'b1) ? eu_add_overflow8_fixed : (carry[8] ^ carry[7] ); |
508 | 583 | end |
509 | 584 |
|
510 | | - |
511 | | - |
| 585 | + |
512 | 586 | // Register writeback |
513 | 587 | if (eu_stall_pipeline==1'b0 && eu_opcode_type!=3'h0 && eu_opcode_type!=3'h1) |
514 | 588 | begin |
|
0 commit comments