2021-02-15 22:55:09 +00:00
|
|
|
package cpu_pkg;
|
|
|
|
|
2021-02-16 23:05:46 +00:00
|
|
|
//
|
|
|
|
// 4 | ST0_ADDR -> ST1_DEC -> ST2_EXEC -> ST3_NOP
|
|
|
|
// 12 | '-> ST2_DEC -> ST3_DEC -> ST4_EXEC -> .... -> ST11_NOP
|
|
|
|
//
|
2021-02-15 22:55:09 +00:00
|
|
|
typedef enum {
|
|
|
|
ST0_ADDR,
|
|
|
|
ST1_DEC,
|
|
|
|
ST2_EXEC,
|
2021-02-16 21:13:50 +00:00
|
|
|
ST2_DEC,
|
|
|
|
ST3_DEC,
|
2021-02-19 21:53:13 +00:00
|
|
|
ST3_EXEC,
|
2021-02-16 21:13:50 +00:00
|
|
|
ST4_EXEC
|
2021-02-15 22:55:09 +00:00
|
|
|
} state_t;
|
|
|
|
|
2021-02-16 23:05:46 +00:00
|
|
|
typedef enum logic [2:0] {
|
|
|
|
REG8_B = 3'h00,
|
|
|
|
REG8_C = 3'h01,
|
|
|
|
REG8_D = 3'h02,
|
|
|
|
REG8_E = 3'h03,
|
|
|
|
REG8_H = 3'h04,
|
2021-02-19 21:53:13 +00:00
|
|
|
REG8_L = 3'h05,
|
|
|
|
REG8_PHL = 3'h06,
|
|
|
|
REG8_A = 3'h07
|
2021-02-16 23:05:46 +00:00
|
|
|
} reg8_t;
|
|
|
|
|
2021-02-17 22:40:24 +00:00
|
|
|
typedef enum logic [1:0] {
|
|
|
|
REG16_BC = 2'h00,
|
|
|
|
REG16_DE = 2'h01,
|
|
|
|
REG16_HL = 2'h02,
|
|
|
|
REG16_SP_AF = 2'h03
|
|
|
|
} reg16_t;
|
|
|
|
|
2021-02-20 15:00:01 +00:00
|
|
|
typedef enum logic [1:0] {
|
|
|
|
CC_NZ = 2'h00,
|
|
|
|
CC_Z = 2'h01,
|
|
|
|
CC_NC = 2'h02,
|
|
|
|
CC_C = 2'h03
|
|
|
|
} cc_t;
|
|
|
|
|
2021-02-19 21:53:13 +00:00
|
|
|
typedef enum logic [3:0] {
|
|
|
|
ALU_OP_ADD = 4'h00,
|
|
|
|
ALU_OP_ADC = 4'h01,
|
|
|
|
ALU_OP_SUB = 4'h02,
|
|
|
|
ALU_OP_SBC = 4'h03,
|
|
|
|
ALU_OP_AND = 4'h04,
|
|
|
|
ALU_OP_XOR = 4'h05,
|
|
|
|
ALU_OP_OR = 4'h06,
|
|
|
|
ALU_OP_CP = 4'h07,
|
2021-02-20 15:56:22 +00:00
|
|
|
ALU_OP_BIT = 4'h08,
|
|
|
|
ALU_OP_NOP = 4'h09
|
2021-02-16 23:05:46 +00:00
|
|
|
} alu_op_t;
|
|
|
|
|
2021-02-18 23:22:26 +00:00
|
|
|
typedef enum logic [1:0] {
|
|
|
|
ALU16_OP_ADD = 2'h00,
|
|
|
|
ALU16_INC = 2'h01,
|
|
|
|
ALU16_DEC = 2'h02
|
|
|
|
} alu16_op_t;
|
|
|
|
|
2021-02-16 23:05:46 +00:00
|
|
|
typedef enum {
|
|
|
|
OP_SRC_A,
|
2021-02-17 22:40:24 +00:00
|
|
|
OP_SRC_REG8,
|
2021-02-19 21:53:13 +00:00
|
|
|
OP_SRC_OPERAND8,
|
2021-02-18 23:22:26 +00:00
|
|
|
OP_SRC_OPERAND16,
|
|
|
|
OP_SRC_REG16
|
2021-02-16 23:05:46 +00:00
|
|
|
} op_src_t;
|
|
|
|
|
|
|
|
typedef enum {
|
2021-02-20 15:56:22 +00:00
|
|
|
OP_DEST_A,
|
2021-02-19 21:53:13 +00:00
|
|
|
OP_DEST_REG8,
|
2021-02-20 15:56:22 +00:00
|
|
|
OP_DEST_REG16,
|
|
|
|
OP_DEST_MEMORY
|
2021-02-16 23:05:46 +00:00
|
|
|
} op_dest_t;
|
|
|
|
|
|
|
|
typedef enum {
|
|
|
|
SP_SRC_OPERAND16
|
|
|
|
} sp_src_t;
|
|
|
|
|
2021-02-17 22:40:24 +00:00
|
|
|
typedef enum {
|
|
|
|
ADR_SRC_PC,
|
2021-02-20 22:10:47 +00:00
|
|
|
ADR_SRC_HL,
|
|
|
|
ADR_SRC_REG8 // extended with FF
|
2021-02-17 22:40:24 +00:00
|
|
|
} adr_src_t;
|
|
|
|
|
2021-02-20 15:00:01 +00:00
|
|
|
typedef enum {
|
|
|
|
PC_SRC_SEQ,
|
|
|
|
PC_SRC_OPERAND8
|
|
|
|
} pc_src_t;
|
|
|
|
|
2021-02-15 22:55:09 +00:00
|
|
|
endpackage
|
2021-02-17 22:40:24 +00:00
|
|
|
|
|
|
|
`define DEF_FF(register, next, we, rst_value) \
|
|
|
|
always_ff @(posedge clk_i or negedge nreset_i) begin \
|
|
|
|
if (~nreset_i) begin \
|
|
|
|
register <= (rst_value); \
|
|
|
|
end else if ((we)) begin \
|
|
|
|
register <= (next); \
|
|
|
|
end \
|
|
|
|
end
|