📄 cpu.v
字号:
//*******************************************************************--
// Copyright (c) 1999-2003 Evatronix SA --
//*******************************************************************--
// Please review the terms of the license agreement before using --
// this file. If you are not an authorized user, please destroy this --
// source code file and notify Evatronix SA immediately that you --
// inadvertently received an unauthorized copy. --
//*******************************************************************--
//---------------------------------------------------------------------
// Project name : R80515
// Project description : R80515 Microcontroller Unit
//
// File name : cpu.v
// File contents : Module CONTROL_UNIT
// Purpose : Control Processor Unit
//
// Destination library : R80515_LIB
//
// Design Engineer : M.B. D.K.
// Quality Engineer : M.B.
// Version : 1.15.V04
// Last modification : 2003-04-14
//---------------------------------------------------------------------
`timescale 1 ns / 1 ns // timescale for following modules
//*******************************************************************--
// Modifications with respect to Version 1.01.E00 :
// 1.02.E00 :
// 2000-01-31 : Modified intack driver in respect to the
// : no interrupt LCALL
// 1.02.E00 :
// 2000-02-02 : Added intcall output
// 1.04.E03 :
// 2000-08-17 : Reduced number of cycles for mul and div instructions
// : from 8 to 5 cycles because invalid loading arguments
// 1.10.E00 :
// 2001-09-03 : Added stoppmu input port
// : Implemented pmu stop mode to the nr_decodr_proc and
// : codefetch_proc
// 1.10.V02 :
// 2002-01-03 : Integer type of curcycle, nr_cycles, nr_bytes,
// : nr_cycles_a, nr_bytes_a changed into a vector.
// 1.11.E00 :
// 2002-04-04 : Added On-Chip Debug Support related logic
// 2002-04-04 : Added debugreq, debugack, debugstep, a5instr,
// : debugfetche, nrcycles ports and modified dependent logic
// 1.11.V02 :
// 2002-08-09 : Added mempsack port and modified mempsack related logic
// 1.15.E00 :
// 2002-10-13 : Added memack port
//*******************************************************************--
module CONTROL_UNIT (
clk,
rst,
mempsackint,
memackint,
intreq,
stretch,
stoppmu,
debugreq,
debugack,
debugstep,
a5instr,
debugfetche,
instr,
cycle,
nrcycles,
codefetche,
datafetche,
rmwinstr,
intack,
intret,
intcall,
memdatai,
sfrwe
);
// Declarations
//`include "utility.v"
//------------------------------------------------------------------
//---------------------------------------------------------------
// Special Function Register locations
//---------------------------------------------------------------
// 80h - 87h
parameter[6:0] P0_ID = 7'b0000000;
parameter[6:0] SP_ID = 7'b0000001;
parameter[6:0] DPL_ID = 7'b0000010;
parameter[6:0] DPH_ID = 7'b0000011;
parameter[6:0] DPL1_ID = 7'b0000100;
parameter[6:0] DPH1_ID = 7'b0000101;
parameter[6:0] PCON_ID = 7'b0000111;
parameter[6:0] WDTREL_ID = 7'b0000110;
// 88h - 8Fh
parameter[6:0] TCON_ID = 7'b0001000;
parameter[6:0] TMOD_ID = 7'b0001001;
parameter[6:0] TL0_ID = 7'b0001010;
parameter[6:0] TL1_ID = 7'b0001011;
parameter[6:0] TH0_ID = 7'b0001100;
parameter[6:0] TH1_ID = 7'b0001101;
parameter[6:0] CKCON_ID = 7'b0001110;
// 90h - 97h
parameter[6:0] P1_ID = 7'b0010000;
parameter[6:0] DPS_ID = 7'b0010010;
// 98h - 9Fh
parameter[6:0] S0CON_ID = 7'b0011000;
parameter[6:0] S0BUF_ID = 7'b0011001;
parameter[6:0] IEN2_ID = 7'b0011010;
parameter[6:0] S1CON_ID = 7'b0011011;
parameter[6:0] S1BUF_ID = 7'b0011100;
parameter[6:0] S1RELL_ID = 7'b0011101;
// A0h - A7h
parameter[6:0] P2_ID = 7'b0100000;
// A8h - AFh
parameter[6:0] IEN0_ID = 7'b0101000;
parameter[6:0] IP0_ID = 7'b0101001;
parameter[6:0] S0RELL_ID = 7'b0101010;
// B0h - B7h
parameter[6:0] P3_ID = 7'b0110000;
// B8h - BFh
parameter[6:0] IEN1_ID = 7'b0111000;
parameter[6:0] IP1_ID = 7'b0111001;
parameter[6:0] S0RELH_ID = 7'b0111010;
parameter[6:0] S1RELH_ID = 7'b0111011;
// C0h - C7h
parameter[6:0] IRCON_ID = 7'b1000000;
parameter[6:0] CCEN_ID = 7'b1000001;
parameter[6:0] CCL1_ID = 7'b1000010;
parameter[6:0] CCH1_ID = 7'b1000011;
parameter[6:0] CCL2_ID = 7'b1000100;
parameter[6:0] CCH2_ID = 7'b1000101;
parameter[6:0] CCL3_ID = 7'b1000110;
parameter[6:0] CCH3_ID = 7'b1000111;
// C8h - CFh
parameter[6:0] T2CON_ID = 7'b1001000;
parameter[6:0] T2MOD_ID = 7'b1001001;
parameter[6:0] CRCL_ID = 7'b1001010;
parameter[6:0] CRCH_ID = 7'b1001011;
parameter[6:0] TL2_ID = 7'b1001100;
parameter[6:0] TH2_ID = 7'b1001101;
// D0h - D7h
parameter[6:0] PSW_ID = 7'b1010000;
// D8h - DFh
parameter[6:0] ADCON_ID = 7'b1011000;
// E0h - E7h
parameter[6:0] ACC_ID = 7'b1100000;
// E8h - EFh
parameter[6:0] MD0_ID = 7'b1101001;
parameter[6:0] MD1_ID = 7'b1101010;
parameter[6:0] MD2_ID = 7'b1101011;
parameter[6:0] MD3_ID = 7'b1101100;
parameter[6:0] MD4_ID = 7'b1101101;
parameter[6:0] MD5_ID = 7'b1101110;
parameter[6:0] ARCON_ID = 7'b1101111;
// F0h - F7h
parameter[6:0] B_ID = 7'b1110000;
parameter[6:0] EIP_ID = 7'b1110101;
// F8h - FFh
parameter[6:0] PIO_ID = 7'b1111000;
//---------------------------------------------------------------
// Special Function Register reset values
//---------------------------------------------------------------
// 80h - 87h
parameter[7:0] P0_RV = 8'b11111111;
parameter[7:0] SP_RV = 8'b00000111;
parameter[7:0] DPL_RV = 8'b00000000;
parameter[7:0] DPH_RV = 8'b00000000;
parameter[7:0] DPL1_RV = 8'b00000000;
parameter[7:0] DPH1_RV = 8'b00000000;
parameter[7:0] PCON_RV = 8'b00000000;
parameter[7:0] WDTREL_RV = 8'b00000000;
// 88h - 8Fh
parameter[7:0] TCON_RV = 8'b00000000;
parameter[7:0] TMOD_RV = 8'b00000000;
parameter[7:0] TL0_RV = 8'b00000000;
parameter[7:0] TL1_RV = 8'b00000000;
parameter[7:0] TH0_RV = 8'b00000000;
parameter[7:0] TH1_RV = 8'b00000000;
parameter[7:0] CKCON_RV = 8'b00000001;
// 90h - 97h
parameter[7:0] P1_RV = 8'b11111111;
parameter[7:0] DPS_RV = 8'b00000000;
// 98h - 9Fh
parameter[7:0] S0CON_RV = 8'b00000000;
parameter[7:0] S0BUF_RV = 8'b00000000;
parameter[7:0] IEN2_RV = 8'b00000000;
parameter[7:0] S1CON_RV = 8'b00000000;
parameter[7:0] S1BUF_RV = 8'b00000000;
parameter[7:0] S1RELL_RV = 8'b00000000;
// A0h - A7h
parameter[7:0] P2_RV = 8'b11111111;
// A8h - AFh
parameter[7:0] IEN0_RV = 8'b00000000;
parameter[7:0] IP0_RV = 8'b00000000;
parameter[7:0] IP0_RW = 8'b01000000; // Watchdog reset
parameter[7:0] S0RELL_RV = 8'b11011001;
// B0h - B7h
parameter[7:0] P3_RV = 8'b11111111;
// B8h - BFh
parameter[7:0] IEN1_RV = 8'b00000000;
parameter[7:0] IP1_RV = 8'b00000000;
parameter[7:0] S0RELH_RV = 8'b00000011;
parameter[7:0] S1RELH_RV = 8'b00000000;
// C0h - C7h
parameter[7:0] IRCON_RV = 8'b00000000;
parameter[7:0] CCEN_RV = 8'b00000000;
parameter[7:0] CCL1_RV = 8'b00000000;
parameter[7:0] CCH1_RV = 8'b00000000;
parameter[7:0] CCL2_RV = 8'b00000000;
parameter[7:0] CCH2_RV = 8'b00000000;
parameter[7:0] CCL3_RV = 8'b00000000;
parameter[7:0] CCH3_RV = 8'b00000000;
// C8h - CFh
parameter[7:0] T2CON_RV = 8'b00000000;
parameter[7:0] T2MOD_RV = 8'b00000000;
parameter[7:0] CRCL_RV = 8'b00000000;
parameter[7:0] CRCH_RV = 8'b00000000;
parameter[7:0] TL2_RV = 8'b00000000;
parameter[7:0] TH2_RV = 8'b00000000;
// D0h - D7h
parameter[7:0] PSW_RV = 8'b00000000;
// D8h - DFh
parameter[7:0] ADCON_RV = 8'b00000000;
// E0h - E7h
parameter[7:0] ACC_RV = 8'b00000000;
// E8h - EFh
parameter[7:0] MD0_RV = 8'b00000000;
parameter[7:0] MD1_RV = 8'b00000000;
parameter[7:0] MD2_RV = 8'b00000000;
parameter[7:0] MD3_RV = 8'b00000000;
parameter[7:0] MD4_RV = 8'b00000000;
parameter[7:0] MD5_RV = 8'b00000000;
parameter[7:0] ARCON_RV = 8'b00000000;
// F0h - F7h
parameter[7:0] B_RV = 8'b00000000;
parameter[7:0] EIP_RV = 8'b00000000;
// F8h - FFh
parameter[7:0] PIO_RV = 8'b00001111;
//-----------------------------------------------------------------
// Instruction Mnemonics
//-----------------------------------------------------------------
// 00H - 0Fh
parameter[7:0] NOP = 8'b00000000;
parameter[7:0] AJMP_0 = 8'b00000001;
parameter[7:0] LJMP = 8'b00000010;
parameter[7:0] RR_A = 8'b00000011;
parameter[7:0] INC_A = 8'b00000100;
parameter[7:0] INC_ADDR = 8'b00000101;
parameter[7:0] INC_IR0 = 8'b00000110;
parameter[7:0] INC_IR1 = 8'b00000111;
parameter[7:0] INC_R0 = 8'b00001000;
parameter[7:0] INC_R1 = 8'b00001001;
parameter[7:0] INC_R2 = 8'b00001010;
parameter[7:0] INC_R3 = 8'b00001011;
parameter[7:0] INC_R4 = 8'b00001100;
parameter[7:0] INC_R5 = 8'b00001101;
parameter[7:0] INC_R6 = 8'b00001110;
parameter[7:0] INC_R7 = 8'b00001111;
// 10H - 1Fh
parameter[7:0] JBC_BIT = 8'b00010000;
parameter[7:0] ACALL_0 = 8'b00010001;
parameter[7:0] LCALL = 8'b00010010;
parameter[7:0] RRC_A = 8'b00010011;
parameter[7:0] DEC_A = 8'b00010100;
parameter[7:0] DEC_ADDR = 8'b00010101;
parameter[7:0] DEC_IR0 = 8'b00010110;
parameter[7:0] DEC_IR1 = 8'b00010111;
parameter[7:0] DEC_R0 = 8'b00011000;
parameter[7:0] DEC_R1 = 8'b00011001;
parameter[7:0] DEC_R2 = 8'b00011010;
parameter[7:0] DEC_R3 = 8'b00011011;
parameter[7:0] DEC_R4 = 8'b00011100;
parameter[7:0] DEC_R5 = 8'b00011101;
parameter[7:0] DEC_R6 = 8'b00011110;
parameter[7:0] DEC_R7 = 8'b00011111;
// 20H - 2Fh
parameter[7:0] JB_BIT = 8'b00100000;
parameter[7:0] AJMP_1 = 8'b00100001;
parameter[7:0] RET = 8'b00100010;
parameter[7:0] RL_A = 8'b00100011;
parameter[7:0] ADD_N = 8'b00100100;
parameter[7:0] ADD_ADDR = 8'b00100101;
parameter[7:0] ADD_IR0 = 8'b00100110;
parameter[7:0] ADD_IR1 = 8'b00100111;
parameter[7:0] ADD_R0 = 8'b00101000;
parameter[7:0] ADD_R1 = 8'b00101001;
parameter[7:0] ADD_R2 = 8'b00101010;
parameter[7:0] ADD_R3 = 8'b00101011;
parameter[7:0] ADD_R4 = 8'b00101100;
parameter[7:0] ADD_R5 = 8'b00101101;
parameter[7:0] ADD_R6 = 8'b00101110;
parameter[7:0] ADD_R7 = 8'b00101111;
// 30H - 3Fh
parameter[7:0] JNB_BIT = 8'b00110000;
parameter[7:0] ACALL_1 = 8'b00110001;
parameter[7:0] RETI = 8'b00110010;
parameter[7:0] RLC_A = 8'b00110011;
parameter[7:0] ADDC_N = 8'b00110100;
parameter[7:0] ADDC_ADDR = 8'b00110101;
parameter[7:0] ADDC_IR0 = 8'b00110110;
parameter[7:0] ADDC_IR1 = 8'b00110111;
parameter[7:0] ADDC_R0 = 8'b00111000;
parameter[7:0] ADDC_R1 = 8'b00111001;
parameter[7:0] ADDC_R2 = 8'b00111010;
parameter[7:0] ADDC_R3 = 8'b00111011;
parameter[7:0] ADDC_R4 = 8'b00111100;
parameter[7:0] ADDC_R5 = 8'b00111101;
parameter[7:0] ADDC_R6 = 8'b00111110;
parameter[7:0] ADDC_R7 = 8'b00111111;
// 40H - 4Fh
parameter[7:0] JC = 8'b01000000;
parameter[7:0] AJMP_2 = 8'b01000001;
parameter[7:0] ORL_ADDR_A = 8'b01000010;
parameter[7:0] ORL_ADDR_N = 8'b01000011;
parameter[7:0] ORL_A_N = 8'b01000100;
parameter[7:0] ORL_A_ADDR = 8'b01000101;
parameter[7:0] ORL_A_IR0 = 8'b01000110;
parameter[7:0] ORL_A_IR1 = 8'b01000111;
parameter[7:0] ORL_A_R0 = 8'b01001000;
parameter[7:0] ORL_A_R1 = 8'b01001001;
parameter[7:0] ORL_A_R2 = 8'b01001010;
parameter[7:0] ORL_A_R3 = 8'b01001011;
parameter[7:0] ORL_A_R4 = 8'b01001100;
parameter[7:0] ORL_A_R5 = 8'b01001101;
parameter[7:0] ORL_A_R6 = 8'b01001110;
parameter[7:0] ORL_A_R7 = 8'b01001111;
// 50H - 5Fh
parameter[7:0] JNC = 8'b01010000;
parameter[7:0] ACALL_2 = 8'b01010001;
parameter[7:0] ANL_ADDR_A = 8'b01010010;
parameter[7:0] ANL_ADDR_N = 8'b01010011;
parameter[7:0] ANL_A_N = 8'b01010100;
parameter[7:0] ANL_A_ADDR = 8'b01010101;
parameter[7:0] ANL_A_IR0 = 8'b01010110;
parameter[7:0] ANL_A_IR1 = 8'b01010111;
parameter[7:0] ANL_A_R0 = 8'b01011000;
parameter[7:0] ANL_A_R1 = 8'b01011001;
parameter[7:0] ANL_A_R2 = 8'b01011010;
parameter[7:0] ANL_A_R3 = 8'b01011011;
parameter[7:0] ANL_A_R4 = 8'b01011100;
parameter[7:0] ANL_A_R5 = 8'b01011101;
parameter[7:0] ANL_A_R6 = 8'b01011110;
parameter[7:0] ANL_A_R7 = 8'b01011111;
// 60H - 6Fh
parameter[7:0] JZ = 8'b01100000;
parameter[7:0] AJMP_3 = 8'b01100001;
parameter[7:0] XRL_ADDR_A = 8'b01100010;
parameter[7:0] XRL_ADDR_N = 8'b01100011;
parameter[7:0] XRL_A_N = 8'b01100100;
parameter[7:0] XRL_A_ADDR = 8'b01100101;
parameter[7:0] XRL_A_IR0 = 8'b01100110;
parameter[7:0] XRL_A_IR1 = 8'b01100111;
parameter[7:0] XRL_A_R0 = 8'b01101000;
parameter[7:0] XRL_A_R1 = 8'b01101001;
parameter[7:0] XRL_A_R2 = 8'b01101010;
parameter[7:0] XRL_A_R3 = 8'b01101011;
parameter[7:0] XRL_A_R4 = 8'b01101100;
parameter[7:0] XRL_A_R5 = 8'b01101101;
parameter[7:0] XRL_A_R6 = 8'b01101110;
parameter[7:0] XRL_A_R7 = 8'b01101111;
// 70H - 7Fh
parameter[7:0] JNZ = 8'b01110000;
parameter[7:0] ACALL_3 = 8'b01110001;
parameter[7:0] ORL_C_BIT = 8'b01110010;
parameter[7:0] JMP_A_DPTR = 8'b01110011;
parameter[7:0] MOV_A_N = 8'b01110100;
parameter[7:0] MOV_ADDR_N = 8'b01110101;
parameter[7:0] MOV_IR0_N = 8'b01110110;
parameter[7:0] MOV_IR1_N = 8'b01110111;
parameter[7:0] MOV_R0_N = 8'b01111000;
parameter[7:0] MOV_R1_N = 8'b01111001;
parameter[7:0] MOV_R2_N = 8'b01111010;
parameter[7:0] MOV_R3_N = 8'b01111011;
parameter[7:0] MOV_R4_N = 8'b01111100;
parameter[7:0] MOV_R5_N = 8'b01111101;
parameter[7:0] MOV_R6_N = 8'b01111110;
parameter[7:0] MOV_R7_N = 8'b01111111;
// 80H - 8Fh
parameter[7:0] SJMP = 8'b10000000;
parameter[7:0] AJMP_4 = 8'b10000001;
parameter[7:0] ANL_C_BIT = 8'b10000010;
parameter[7:0] MOVC_A_PC = 8'b10000011;
parameter[7:0] DIV_AB = 8'b10000100;
parameter[7:0] MOV_ADDR_ADDR = 8'b10000101;
parameter[7:0] MOV_ADDR_IR0 = 8'b10000110;
parameter[7:0] MOV_ADDR_IR1 = 8'b10000111;
parameter[7:0] MOV_ADDR_R0 = 8'b10001000;
parameter[7:0] MOV_ADDR_R1 = 8'b10001001;
parameter[7:0] MOV_ADDR_R2 = 8'b10001010;
parameter[7:0] MOV_ADDR_R3 = 8'b10001011;
parameter[7:0] MOV_ADDR_R4 = 8'b10001100;
parameter[7:0] MOV_ADDR_R5 = 8'b10001101;
parameter[7:0] MOV_ADDR_R6 = 8'b10001110;
parameter[7:0] MOV_ADDR_R7 = 8'b10001111;
// 90H - 9Fh
parameter[7:0] MOV_DPTR_N = 8'b10010000;
parameter[7:0] ACALL_4 = 8'b10010001;
parameter[7:0] MOV_BIT_C = 8'b10010010;
parameter[7:0] MOVC_A_DPTR = 8'b10010011;
parameter[7:0] SUBB_N = 8'b10010100;
parameter[7:0] SUBB_ADDR = 8'b10010101;
parameter[7:0] SUBB_IR0 = 8'b10010110;
parameter[7:0] SUBB_IR1 = 8'b10010111;
parameter[7:0] SUBB_R0 = 8'b10011000;
parameter[7:0] SUBB_R1 = 8'b10011001;
parameter[7:0] SUBB_R2 = 8'b10011010;
parameter[7:0] SUBB_R3 = 8'b10011011;
parameter[7:0] SUBB_R4 = 8'b10011100;
parameter[7:0] SUBB_R5 = 8'b10011101;
parameter[7:0] SUBB_R6 = 8'b10011110;
parameter[7:0] SUBB_R7 = 8'b10011111;
// A0H - AFh
parameter[7:0] ORL_C_NBIT = 8'b10100000;
parameter[7:0] AJMP_5 = 8'b10100001;
parameter[7:0] MOV_C_BIT = 8'b10100010;
parameter[7:0] INC_DPTR = 8'b10100011;
parameter[7:0] MUL_AB = 8'b10100100;
parameter[7:0] UNKNOWN = 8'b10100101;
parameter[7:0] MOV_IR0_ADDR = 8'b10100110;
parameter[7:0] MOV_IR1_ADDR = 8'b10100111;
parameter[7:0] MOV_R0_ADDR = 8'b10101000;
parameter[7:0] MOV_R1_ADDR = 8'b10101001;
parameter[7:0] MOV_R2_ADDR = 8'b10101010;
parameter[7:0] MOV_R3_ADDR = 8'b10101011;
parameter[7:0] MOV_R4_ADDR = 8'b10101100;
parameter[7:0] MOV_R5_ADDR = 8'b10101101;
parameter[7:0] MOV_R6_ADDR = 8'b10101110;
parameter[7:0] MOV_R7_ADDR = 8'b10101111;
// B0H - BFh
parameter[7:0] ANL_C_NBIT = 8'b10110000;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -