📄 oci.v
字号:
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;
parameter[7:0] ACALL_5 = 8'b10110001;
parameter[7:0] CPL_BIT = 8'b10110010;
parameter[7:0] CPL_C = 8'b10110011;
parameter[7:0] CJNE_A_N = 8'b10110100;
parameter[7:0] CJNE_A_ADDR = 8'b10110101;
parameter[7:0] CJNE_IR0_N = 8'b10110110;
parameter[7:0] CJNE_IR1_N = 8'b10110111;
parameter[7:0] CJNE_R0_N = 8'b10111000;
parameter[7:0] CJNE_R1_N = 8'b10111001;
parameter[7:0] CJNE_R2_N = 8'b10111010;
parameter[7:0] CJNE_R3_N = 8'b10111011;
parameter[7:0] CJNE_R4_N = 8'b10111100;
parameter[7:0] CJNE_R5_N = 8'b10111101;
parameter[7:0] CJNE_R6_N = 8'b10111110;
parameter[7:0] CJNE_R7_N = 8'b10111111;
// C0H - CFh
parameter[7:0] PUSH = 8'b11000000;
parameter[7:0] AJMP_6 = 8'b11000001;
parameter[7:0] CLR_BIT = 8'b11000010;
parameter[7:0] CLR_C = 8'b11000011;
parameter[7:0] SWAP_A = 8'b11000100;
parameter[7:0] XCH_ADDR = 8'b11000101;
parameter[7:0] XCH_IR0 = 8'b11000110;
parameter[7:0] XCH_IR1 = 8'b11000111;
parameter[7:0] XCH_R0 = 8'b11001000;
parameter[7:0] XCH_R1 = 8'b11001001;
parameter[7:0] XCH_R2 = 8'b11001010;
parameter[7:0] XCH_R3 = 8'b11001011;
parameter[7:0] XCH_R4 = 8'b11001100;
parameter[7:0] XCH_R5 = 8'b11001101;
parameter[7:0] XCH_R6 = 8'b11001110;
parameter[7:0] XCH_R7 = 8'b11001111;
// D0H - DFh
parameter[7:0] POP = 8'b11010000;
parameter[7:0] ACALL_6 = 8'b11010001;
parameter[7:0] SETB_BIT = 8'b11010010;
parameter[7:0] SETB_C = 8'b11010011;
parameter[7:0] DA_A = 8'b11010100;
parameter[7:0] DJNZ_ADDR = 8'b11010101;
parameter[7:0] XCHD_IR0 = 8'b11010110;
parameter[7:0] XCHD_IR1 = 8'b11010111;
parameter[7:0] DJNZ_R0 = 8'b11011000;
parameter[7:0] DJNZ_R1 = 8'b11011001;
parameter[7:0] DJNZ_R2 = 8'b11011010;
parameter[7:0] DJNZ_R3 = 8'b11011011;
parameter[7:0] DJNZ_R4 = 8'b11011100;
parameter[7:0] DJNZ_R5 = 8'b11011101;
parameter[7:0] DJNZ_R6 = 8'b11011110;
parameter[7:0] DJNZ_R7 = 8'b11011111;
// E0H - EFh
parameter[7:0] MOVX_A_IDPTR = 8'b11100000;
parameter[7:0] AJMP_7 = 8'b11100001;
parameter[7:0] MOVX_A_IR0 = 8'b11100010;
parameter[7:0] MOVX_A_IR1 = 8'b11100011;
parameter[7:0] CLR_A = 8'b11100100;
parameter[7:0] MOV_A_ADDR = 8'b11100101;
parameter[7:0] MOV_A_IR0 = 8'b11100110;
parameter[7:0] MOV_A_IR1 = 8'b11100111;
parameter[7:0] MOV_A_R0 = 8'b11101000;
parameter[7:0] MOV_A_R1 = 8'b11101001;
parameter[7:0] MOV_A_R2 = 8'b11101010;
parameter[7:0] MOV_A_R3 = 8'b11101011;
parameter[7:0] MOV_A_R4 = 8'b11101100;
parameter[7:0] MOV_A_R5 = 8'b11101101;
parameter[7:0] MOV_A_R6 = 8'b11101110;
parameter[7:0] MOV_A_R7 = 8'b11101111;
// F0H - FFh
parameter[7:0] MOVX_IDPTR_A = 8'b11110000;
parameter[7:0] ACALL_7 = 8'b11110001;
parameter[7:0] MOVX_IR0_A = 8'b11110010;
parameter[7:0] MOVX_IR1_A = 8'b11110011;
parameter[7:0] CPL_A = 8'b11110100;
parameter[7:0] MOV_ADDR_A = 8'b11110101;
parameter[7:0] MOV_IR0_A = 8'b11110110;
parameter[7:0] MOV_IR1_A = 8'b11110111;
parameter[7:0] MOV_R0_A = 8'b11111000;
parameter[7:0] MOV_R1_A = 8'b11111001;
parameter[7:0] MOV_R2_A = 8'b11111010;
parameter[7:0] MOV_R3_A = 8'b11111011;
parameter[7:0] MOV_R4_A = 8'b11111100;
parameter[7:0] MOV_R5_A = 8'b11111101;
parameter[7:0] MOV_R6_A = 8'b11111110;
parameter[7:0] MOV_R7_A = 8'b11111111;
//-----------------------------------------------------------------
// Interrupt reset values
//-----------------------------------------------------------------
parameter[4:0] VECT_RV = 5'b00000; // Interrupt Vector reset value
parameter[3:0] IS_REG_RV = 4'b0000; // In Service Register reset value
//-----------------------------------------------------------------
// Interrupt Vector locations
//-----------------------------------------------------------------
// external interrupt 0
parameter[4:0] VECT_E0 = 5'b00000;
// timer 0 overflow
parameter[4:0] VECT_TF0 = 5'b00001;
// external interrupt 1
parameter[4:0] VECT_E1 = 5'b00010;
// timer 1 overflow
parameter[4:0] VECT_TF1 = 5'b00011;
// serial channel 0
parameter[4:0] VECT_SER0 = 5'b00100;
// timer 2 overflow/ext. reload
parameter[4:0] VECT_TF2 = 5'b00101;
// A/D converter
parameter[4:0] VECT_ADC = 5'b01000;
// external interrupt 2
parameter[4:0] VECT_EX2 = 5'b01001;
// external interrupt 3
parameter[4:0] VECT_EX3 = 5'b01010;
// external interrupt 4
parameter[4:0] VECT_EX4 = 5'b01011;
// external interrupt 5
parameter[4:0] VECT_EX5 = 5'b01100;
// external interrupt 6
parameter[4:0] VECT_EX6 = 5'b01101;
// serial channel 1
parameter[4:0] VECT_SER1 = 5'b10000;
//-----------------------------------------------------------------
// Start address location
//-----------------------------------------------------------------
parameter[15:0] ADDR_RV = 16'b0000000000000000; //
//-----------------------------------------------------------------
// RAM & SFR address reset value
//-----------------------------------------------------------------
parameter[7:0] RAM_SFR_ADDR_RV= 8'b00000000; //
//-----------------------------------------------------------------
// Data register reset value
//-----------------------------------------------------------------
parameter[7:0] DATAREG_RV = 8'b00000000; //
//-----------------------------------------------------------------
// High ordered half of address during indirect addressing
//-----------------------------------------------------------------
parameter[7:0] ADDR_HIGH_RI = 8'b00000000; //
//-----------------------------------------------------------------
// Watchdog Timer reset value
//-----------------------------------------------------------------
parameter[6:0] WDTH_RV = 7'b0000000; // High ordered WDT
parameter[7:0] WDTL_RV = 8'b00000000; // Low ordered WDT
//-----------------------------------------------------------------
// Watchdog Timer reset state
//-----------------------------------------------------------------
parameter[14:0] WDT_RS = 15'b111111111111100; // X"7FFC"
//*******************************************************************--
// Control signals inputs
input clk; // Global clock input
input rst; // Internal reset input
// CPU input signals
input [3:0] cycle;
input [3:0] nrcycles;
input codefetche;
input datafetche;
input debugfetche;
// Clock control input signal
input mempsackint;
// memory control input signal
input flush;
// program memory input
input [7:0] memdatai;
// OCI inputs
input debugreq; // Debug Request
input debugstep; // Debug Step
// OCI outputs
output debugstepff; // Debug Step FF
wire debugstepff;
output debugack; // Debug Acknowledge
wire debugack;
output a5instr; // 0xA5 instruction fetched
wire a5instr;
output fetch;
wire fetch;
//*******************************************************************--
// Internal control signals
reg debug_ack;
reg a5_instr;
reg debugstep_ff;
//------------------------------------------------------------------
// Debug Acknowledge driver
//------------------------------------------------------------------
assign debugack = debug_ack ;
//------------------------------------------------------------------
// 0xA5 instruction detector driver
//------------------------------------------------------------------
assign a5instr = a5_instr ;
//------------------------------------------------------------------
// fetch write
//------------------------------------------------------------------
assign fetch = ((codefetche | debugfetche | datafetche)
&
(mempsackint) & (~flush)) ? 1'b1 : 1'b0 ;
//------------------------------------------------------------------
// Debug Acknowledge
//------------------------------------------------------------------
always @(posedge clk)
begin : debug_ack_proc
//------------------------------------------------------------------
if (rst)
//-----------------------------------
// Synchronous reset
//-----------------------------------
begin
debug_ack <= 1'b0 ;
end
else
//-----------------------------------
// Synchronous write
//-----------------------------------
begin
if ((a5_instr | debugreq) & (~debug_ack & cycle == nrcycles))
begin
debug_ack <= 1'b1 ;
end
else if (debugstep_ff & mempsackint)
begin
debug_ack <= 1'b0 ;
end
else if ((~a5_instr) & (~debugreq))
begin
// KG if not debug request
debug_ack <= 1'b0 ; //
end
end
end
//------------------------------------------------------------------
// 0xA5 instruction detector
//------------------------------------------------------------------
always @(posedge clk)
begin : a5_instr_proc
//------------------------------------------------------------------
if (rst)
//-----------------------------------
// Synchronous reset
//-----------------------------------
begin
a5_instr <= 1'b0 ;
end
else
//-----------------------------------
// Synchronous write
//-----------------------------------
begin
if (codefetche & mempsackint & memdatai == UNKNOWN)
begin
// KG & debug_enable
a5_instr <= 1'b1 ;
end
else if (debugreq)
begin
a5_instr <= 1'b0 ;
end
end
end
//------------------------------------------------------------------
// Debug Step FF
//------------------------------------------------------------------
always @(posedge clk)
begin : debugstep_proc
//------------------------------------------------------------------
if (rst)
//-----------------------------------
// Synchronous reset
//-----------------------------------
begin
debugstep_ff <= 1'b0 ;
end
else
//-----------------------------------
// Synchronous write
//-----------------------------------
begin
if (debugstep)
begin
debugstep_ff <= 1'b1 ;
end
else if (mempsackint)
begin
debugstep_ff <= 1'b0 ;
end
end
end
//------------------------------------------------------------------
// debugstepff output
//------------------------------------------------------------------
assign debugstepff = debugstep_ff ;
endmodule // module OCDSI
//*******************************************************************--
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -