Line 33... |
Line 33... |
//Verilog provides a `default_nettype none compiler directive. When
|
//Verilog provides a `default_nettype none compiler directive. When
|
//this directive is set, implicit data types are disabled, which will make any
|
//this directive is set, implicit data types are disabled, which will make any
|
//undeclared signal name a syntax error.This is very usefull to avoid annoying
|
//undeclared signal name a syntax error.This is very usefull to avoid annoying
|
//automatic 1 bit long wire declaration where you don't want them to be!
|
//automatic 1 bit long wire declaration where you don't want them to be!
|
`default_nettype none
|
`default_nettype none
|
|
|
|
//The clock cycle
|
|
`define CLOCK_CYCLE 5
|
|
`define CLOCK_PERIOD 10
|
//---------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------
|
//Defines the Scale. This very important because it sets the fixed point precsision.
|
//Defines the Scale. This very important because it sets the fixed point precsision.
|
//The Scale defines the number bits that are used as the decimal part of the number.
|
//The Scale defines the number bits that are used as the decimal part of the number.
|
//The code has been written in such a way that allows you to change the value of the
|
//The code has been written in such a way that allows you to change the value of the
|
//Scale, so that it is possible to experimet with different scenarios. SCALE can be
|
//Scale, so that it is possible to experimet with different scenarios. SCALE can be
|
Line 68... |
Line 72... |
//that is used for the jump familiy of instructions (see Documentation).
|
//that is used for the jump familiy of instructions (see Documentation).
|
//Also the MSB of Operand is used by the decoder to distinguish
|
//Also the MSB of Operand is used by the decoder to distinguish
|
//between Type I and Type II instructions.
|
//between Type I and Type II instructions.
|
`define INSTRUCTION_WIDTH 64//55
|
`define INSTRUCTION_WIDTH 64//55
|
`define INSTRUCTION_OP_LENGTH 16//7
|
`define INSTRUCTION_OP_LENGTH 16//7
|
|
`define INSTRUCTION_IMM_BITPOS 54
|
`define INSTRUCTION_IMM_BIT 6 //don't change this!
|
`define INSTRUCTION_IMM_BIT 6 //don't change this!
|
|
|
//Defines the Lenght of Memory blocks
|
//Defines the Lenght of Memory blocks
|
`define DATA_ROW_WIDTH 96
|
`define DATA_ROW_WIDTH 96
|
`define DATA_ADDRESS_WIDTH 16
|
`define DATA_ADDRESS_WIDTH 16
|
`define ROM_ADDRESS_WIDTH 16
|
`define ROM_ADDRESS_WIDTH 16
|
|
`define ROM_ADDRESS_SEL_MASK `ROM_ADDRESS_WIDTH'h8000
|
|
|
//---------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------
|
//Defines the ucode memory entry point for the various ucode routines
|
//Defines the ucode memory entry point for the various ucode routines
|
`define INITIAL_UCODE_ADDRESS `ROM_ADDRESS_WIDTH'd0
|
|
`define CPPU_UCODE_ADDRESS `ROM_ADDRESS_WIDTH'd14
|
|
`define RGU_UCODE_ADDRESS `ROM_ADDRESS_WIDTH'd17
|
`define ENTRYPOINT_ADRR_INITIAL `ROM_ADDRESS_WIDTH'd0 //0 - This should always be zero
|
`define AABBIU_UCODE_ADDRESS `ROM_ADDRESS_WIDTH'd33
|
`define ENTRYPOINT_ADRR_CPPU `ROM_ADDRESS_WIDTH'd14 //E
|
`define BIU_UCODE_ADDRESS `ROM_ADDRESS_WIDTH'd121
|
`define ENTRYPOINT_ADRR_RGU `ROM_ADDRESS_WIDTH'd17 //11
|
`define PSU_UCODE_ADRESS `ROM_ADDRESS_WIDTH'd196
|
`define ENTRYPOINT_ADRR_AABBIU `ROM_ADDRESS_WIDTH'd33 //21
|
`define PSU_UCODE_ADRESS2 `ROM_ADDRESS_WIDTH'd212
|
`define ENTRYPOINT_ADRR_BIU `ROM_ADDRESS_WIDTH'd121 //79
|
`define TCC_UCODE_ADDRESS `ROM_ADDRESS_WIDTH'd154
|
`define ENTRYPOINT_ADRR_PSU `ROM_ADDRESS_WIDTH'd196 //C4
|
`define DEBUG_LOG_REGISTERS `ROM_ADDRESS_WIDTH'd221
|
`define ENTRYPOINT_ADRR_PSU2 `ROM_ADDRESS_WIDTH'd212 //D4
|
`define NPG_UCODE_ADDRESS `ROM_ADDRESS_WIDTH'd24
|
`define ENTRYPOINT_ADRR_TCC `ROM_ADDRESS_WIDTH'd154 //9A
|
|
`define ENTRYPOINT_ADRR_DEBUG_LOG_REGISTERS `ROM_ADDRESS_WIDTH'd221 //DD
|
|
`define ENTRYPOINT_ADRR_NPG `ROM_ADDRESS_WIDTH'd24 //18
|
|
|
|
|
|
`define ENTRYPOINT_INDEX_INITIAL `ROM_ADDRESS_WIDTH'h8000
|
|
`define ENTRYPOINT_INDEX_CPPU `ROM_ADDRESS_WIDTH'h8001
|
|
`define ENTRYPOINT_INDEX_RGU `ROM_ADDRESS_WIDTH'h8002
|
|
`define ENTRYPOINT_INDEX_AABBIU `ROM_ADDRESS_WIDTH'h8003
|
|
`define ENTRYPOINT_INDEX_BIU `ROM_ADDRESS_WIDTH'h8004
|
|
`define ENTRYPOINT_INDEX_PSU `ROM_ADDRESS_WIDTH'h8005
|
|
`define ENTRYPOINT_INDEX_PSU2 `ROM_ADDRESS_WIDTH'h8006
|
|
`define ENTRYPOINT_INDEX_TCC `ROM_ADDRESS_WIDTH'h8007
|
|
`define ENTRYPOINT_INDEX_DEBUG_LOG_REGISTERS `ROM_ADDRESS_WIDTH'h8008
|
|
`define ENTRYPOINT_INDEX_NPG `ROM_ADDRESS_WIDTH'h8009
|
|
|
`define USER_AABBIU_UCODE_ADDRESS `ROM_ADDRESS_WIDTH'b1000000000000000
|
`define USER_AABBIU_UCODE_ADDRESS `ROM_ADDRESS_WIDTH'b1000000000000000
|
//---------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------
|
//This handy little macro allows me to print stuff either to STDOUT or a file.
|
//This handy little macro allows me to print stuff either to STDOUT or a file.
|
//Notice that the compilation vairable DUMP_CODE must be set if you want to print
|
//Notice that the compilation vairable DUMP_CODE must be set if you want to print
|
Line 119... |
Line 139... |
`define CREG_PROJECTION_WINDOW_MAX `DATA_ADDRESS_WIDTH'd3 //0003
|
`define CREG_PROJECTION_WINDOW_MAX `DATA_ADDRESS_WIDTH'd3 //0003
|
`define CREG_RESOLUTION `DATA_ADDRESS_WIDTH'd4 //0004
|
`define CREG_RESOLUTION `DATA_ADDRESS_WIDTH'd4 //0004
|
`define CREG_TEXTURE_SIZE `DATA_ADDRESS_WIDTH'd5 //0005
|
`define CREG_TEXTURE_SIZE `DATA_ADDRESS_WIDTH'd5 //0005
|
`define CREG_PIXEL_2D_POSITION `DATA_ADDRESS_WIDTH'd6 //0008
|
`define CREG_PIXEL_2D_POSITION `DATA_ADDRESS_WIDTH'd6 //0008
|
`define CREG_FIRST_LIGTH `DATA_ADDRESS_WIDTH'd7 //0007
|
`define CREG_FIRST_LIGTH `DATA_ADDRESS_WIDTH'd7 //0007
|
|
`define CREG_FIRST_LIGTH_DIFFUSE `DATA_ADDRESS_WIDTH'd7 //0008
|
//OK, so from address 0x06 to 0x0F is where the lights are,watch out values are harcoded
|
//OK, so from address 0x06 to 0x0F is where the lights are,watch out values are harcoded
|
//for now!! (look in ROM.v for hardcoded values!!!)
|
//for now!! (look in ROM.v for hardcoded values!!!)
|
|
|
|
|
|
|
Line 171... |
Line 192... |
`define CREG_V1 `DATA_ADDRESS_WIDTH'd51 //002c
|
`define CREG_V1 `DATA_ADDRESS_WIDTH'd51 //002c
|
`define CREG_UV1 `DATA_ADDRESS_WIDTH'd52 //002d
|
`define CREG_UV1 `DATA_ADDRESS_WIDTH'd52 //002d
|
`define CREG_V2 `DATA_ADDRESS_WIDTH'd53 //002e
|
`define CREG_V2 `DATA_ADDRESS_WIDTH'd53 //002e
|
`define CREG_UV2 `DATA_ADDRESS_WIDTH'd54 //002f
|
`define CREG_UV2 `DATA_ADDRESS_WIDTH'd54 //002f
|
`define CREG_TRI_DIFFUSE `DATA_ADDRESS_WIDTH'd55 //0030
|
`define CREG_TRI_DIFFUSE `DATA_ADDRESS_WIDTH'd55 //0030
|
`define COLOR_ACC `DATA_ADDRESS_WIDTH'd56 //0031
|
`define CREG_COLOR_ACC `DATA_ADDRESS_WIDTH'd56 //0031
|
`define CREG_LAST_t `DATA_ADDRESS_WIDTH'd58 //0033
|
`define CREG_LAST_t `DATA_ADDRESS_WIDTH'd58 //0033
|
`define CREG_E1_LAST `DATA_ADDRESS_WIDTH'd59 //0034
|
`define CREG_E1_LAST `DATA_ADDRESS_WIDTH'd59 //0034
|
`define CREG_E2_LAST `DATA_ADDRESS_WIDTH'd60 //0035
|
`define CREG_E2_LAST `DATA_ADDRESS_WIDTH'd60 //0035
|
`define CREG_TRI_DIFFUSE_LAST `DATA_ADDRESS_WIDTH'd61 //0036
|
`define CREG_TRI_DIFFUSE_LAST `DATA_ADDRESS_WIDTH'd61 //0036
|
`define CREG_LAST_u `DATA_ADDRESS_WIDTH'd62 //0037
|
`define CREG_LAST_u `DATA_ADDRESS_WIDTH'd62 //0037
|
Line 214... |
Line 235... |
//meaning: b4b3 = 01 => X jump type, b4b3 = 10 => Y jump type, finally
|
//meaning: b4b3 = 01 => X jump type, b4b3 = 10 => Y jump type, finally
|
//b4b3 = 11 means Z jump type.
|
//b4b3 = 11 means Z jump type.
|
//All this is just to tell you: Don't play with these values!
|
//All this is just to tell you: Don't play with these values!
|
|
|
// *** Type I Instructions (OP DST REG1 REG2) ***
|
// *** Type I Instructions (OP DST REG1 REG2) ***
|
`define RETURN `INSTRUCTION_OP_LENGTH'b0_000000 //0
|
`define NOP `INSTRUCTION_OP_LENGTH'b0_000000 //0
|
`define ADD `INSTRUCTION_OP_LENGTH'b0_000001 //1
|
`define ADD `INSTRUCTION_OP_LENGTH'b0_000001 //1
|
`define SUB `INSTRUCTION_OP_LENGTH'b0_000010 //2
|
`define SUB `INSTRUCTION_OP_LENGTH'b0_000010 //2
|
`define DIV `INSTRUCTION_OP_LENGTH'b0_000011 //3
|
`define DIV `INSTRUCTION_OP_LENGTH'b0_000011 //3
|
`define MUL `INSTRUCTION_OP_LENGTH'b0_000100 //4
|
`define MUL `INSTRUCTION_OP_LENGTH'b0_000100 //4
|
`define MAG `INSTRUCTION_OP_LENGTH'b0_000101 //5
|
`define MAG `INSTRUCTION_OP_LENGTH'b0_000101 //5
|
`define NOP `INSTRUCTION_OP_LENGTH'b0_000110 //6
|
//`define NOP `INSTRUCTION_OP_LENGTH'b0_000110 //6
|
`define COPY `INSTRUCTION_OP_LENGTH'b0_000111 //7
|
`define COPY `INSTRUCTION_OP_LENGTH'b0_000111 //7
|
`define JGX `INSTRUCTION_OP_LENGTH'b0_001_000 //8
|
`define JGX `INSTRUCTION_OP_LENGTH'b0_001_000 //8
|
`define JLX `INSTRUCTION_OP_LENGTH'b0_001_001 //9
|
`define JLX `INSTRUCTION_OP_LENGTH'b0_001_001 //9
|
`define JEQX `INSTRUCTION_OP_LENGTH'b0_001_010 //10
|
`define JEQX `INSTRUCTION_OP_LENGTH'b0_001_010 //10
|
`define JNEX `INSTRUCTION_OP_LENGTH'b0_001_011 //11
|
`define JNEX `INSTRUCTION_OP_LENGTH'b0_001_011 //11
|
Line 271... |
Line 292... |
`define INCY `INSTRUCTION_OP_LENGTH'b0_101_100 // R.Y = S1.Y + 1
|
`define INCY `INSTRUCTION_OP_LENGTH'b0_101_100 // R.Y = S1.Y + 1
|
`define INCZ `INSTRUCTION_OP_LENGTH'b0_101_101 // R.Z = S1.Z + 1
|
`define INCZ `INSTRUCTION_OP_LENGTH'b0_101_101 // R.Z = S1.Z + 1
|
|
|
|
|
//*** Type II Instructions (OP DST REG1 IMM) ***
|
//*** Type II Instructions (OP DST REG1 IMM) ***
|
`define SETX `INSTRUCTION_OP_LENGTH'b1_000000 //64
|
`define RETURN `INSTRUCTION_OP_LENGTH'b1_000000 //64 0x40
|
`define SETY `INSTRUCTION_OP_LENGTH'b1_000001 //65
|
`define SETX `INSTRUCTION_OP_LENGTH'b1_000001 //65 0x41
|
`define SETZ `INSTRUCTION_OP_LENGTH'b1_000010 //66
|
`define SETY `INSTRUCTION_OP_LENGTH'b1_000010 //66
|
`define SWIZZLE3D `INSTRUCTION_OP_LENGTH'b1_000011 //67
|
`define SETZ `INSTRUCTION_OP_LENGTH'b1_000011 //67
|
`define JMP `INSTRUCTION_OP_LENGTH'b1_011_000 //56
|
`define SWIZZLE3D `INSTRUCTION_OP_LENGTH'b1_000100 //68
|
|
`define JMP `INSTRUCTION_OP_LENGTH'b1_011000 //56
|
|
|
//-------------------------------------------------------------
|
//-------------------------------------------------------------
|
|
|
|
|
`define SWIZZLE_XXX 32'd0
|
`define SWIZZLE_XXX 32'd0
|
`define SWIZZLE_YYY 32'd1
|
`define SWIZZLE_YYY 32'd1
|