📄 alu.v
字号:
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;
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"
//*******************************************************************--
// Global control signals inputs
input clk; // Global clock input
input rst; // Global reset input
// External memory read/write acknowledge input
input mempsackint;
// CPU input signals
input [7:0] instr; // Instruction
input [3:0] cycle; // Current cycle
// Memory interface
input [7:0] memdatai; // Memory data bus
input mem2acc; // Memory to ACC write enable
// RAM Data Bus
input [7:0] ramsfrdata; // Peripheral data bus
// ALU output signals
output [7:0] accreg; // Accumulator output
wire [7:0] accreg;
output [7:0] aluresult; // ALU result
wire [7:0] aluresult;
output [1:0] regsbank; // Current bank
wire [1:0] regsbank;
output bitvalue; // Selected bit value
reg bitvalue;
output cdjump; // Condition of jump
reg cdjump;
output cyflag; // Carry flag
wire cyflag;
// Special function register interface
input [7:0] sfrdatai; // SFR data bus
output [7:0] sfrdataalu; // ALU data bus
wire [7:0] sfrdataalu;
input [6:0] sfraddr; // SFR address bus
input sfrwe; // SFR write enable
//------------------------------------------------------------------
// Main registers
reg [7:0] acc; // Accumulator
reg [7:0] b; // B register
reg [7:0] psw; // PSW register
// ALU operand registers
reg [7:0] a1; // A1 register
reg [7:0] a2; // A2 register
wire [7:0] op_a; // Operand A
wire [7:0] op_b; // Operand B
wire op_c; // Operand C (carry)
wire [7:0] bool_op; // Boolean operand
reg [2:0] bit_nr; // bit number
// ALU result registers
reg [7:0] b1; // B1 register
reg [7:0] b2; // B2 register
reg [7:0] b3; // B3 register
// PSW flags
reg ac_bit; // A carry flag
reg ov_bit; // Overflow flag
wire parity_bit; // Parity flag
// Arithmetic result vector
reg [8:0] result_b1; // B1 result
reg [8:0] result_b2; // B2 result
// Boolean result vector
reg [7:0] bool_res; // Boolean result
// Multiplication / division registers
reg [7:0] mda; // MDA register
reg [7:0] mdb; // MDB register
reg [8:0] sum; // result register
reg [8:0] sum1; // result register
// Variables
reg [4:0] b1_res_3_0;
reg [3:0] b1_res_6_4;
reg [1:0] b1_res_8_7;
reg [4:0] b2_res_3_0;
reg [3:0] b2_res_6_4;
reg [1:0] b2_res_8_7;
//------------------------------------------------------------------
// ACC register output
//------------------------------------------------------------------
assign accreg = acc ;
//------------------------------------------------------------------
// Carry flag output
//------------------------------------------------------------------
assign cyflag = psw[7] ;
//------------------------------------------------------------------
// Register select bank output
//------------------------------------------------------------------
assign regsbank = psw[4:3] ;
//------------------------------------------------------------------
// Accumulator register
//------------------------------------------------------------------
always @(posedge clk)
begin : acc_write_proc
//------------------------------------------------------------------
if (rst)
begin
//-----------------------------------
// Synchronous reset
//-----------------------------------
acc <= ACC_RV ;
end
else
begin
//-----------------------------------
// Synchronous write
//-----------------------------------
// Special function register write
//-----------------------------------
if (sfrwe & sfraddr == ACC_ID)
begin
acc <= sfrdatai ;
end
//-----------------------------------
// ALU operation write
//-----------------------------------
else if (mem2acc)
begin
if (mempsackint)
begin
acc <= memdatai ;
end
end
else
begin
case (cycle)
4'b 0001 :
begin
case (instr[7:0])
ADD_R0, ADD_R1,
ADD_R2, ADD_R3,
ADD_R4, ADD_R5,
ADD_R6, ADD_R7,
ADDC_R0, ADDC_R1,
ADDC_R2, ADDC_R3,
ADDC_R4, ADDC_R5,
ADDC_R6, ADDC_R7,
SUBB_R0, SUBB_R1,
SUBB_R2, SUBB_R3,
SUBB_R4, SUBB_R5,
SUBB_R6, SUBB_R7,
INC_A, DEC_A :
begin
if (mempsackint)
begin
acc <= result_b1[7:0] ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -