OpenCores
URL https://opencores.org/ocsvn/2d_game_console/2d_game_console/trunk

Subversion Repositories 2d_game_console

[/] [2d_game_console/] [trunk/] [Processor_ModelSim/] [TB_Processor.v] - Rev 2

Compare with Previous | Blame | View Log

// Time unit and simulation accuracy
`timescale 1ns/1ns
 
module TB_Processor;
 
integer	processor_output_file;	// File handler
integer	VGA_output_file;	// File handler
 
integer	six_button_select_counter;
 
// Sega Genesis Buttons status
reg	button_up;
reg	button_down;
reg	button_left;
reg	button_right;
reg	button_a;
reg	button_b;
reg	button_c;
reg	button_x;
reg	button_y;
reg	button_z;
reg	button_mode;
reg	button_start;
 
 
// 'TB_Processor' module outputs
// 'Processor' module inputs
reg	clock;
reg	reset;
reg	testbench_vsync;
reg	testbench_PLL_clock;
reg	six_button_UP_Z;
reg	six_button_DOWN_Y;
reg	six_button_LEFT_X;
reg	six_button_RIGHT_MODE;
reg	six_button_B_A;
reg	six_button_C_START;
 
// 'TB_Processor' module inputs
// 'Processor' module outputs
wire	add_overflow;
wire	sub_overflow;
wire	compare_aeb;
wire	compare_agb;
wire	compare_alb;
wire	arbiter_grant_1;
wire	arbiter_grant_2;
wire	arbiter_grant_3;
wire	arbiter_wren;
wire	cpu_ram_wren;
wire	cpu_ram_req;
wire	cpu_const_bool;
wire	pic_mem_wren;
wire	pic_mem_req;
wire	pic_cpu_req;
wire	cpu_int_ack;
wire	pic_int_ack_0;
wire	cpu_v_sync_flag;
wire	VGA_CLK;
wire	VGA_HS;
wire	VGA_VS;
wire	VGA_BLANK;
wire	six_button_mem_wren;
wire	six_button_mem_req;
wire	six_button_v_sync_flag;
wire	six_button_int_req;
wire	arbiter_grant_0;
wire	sprite_reader_mem_wren;
wire	sprite_reader_mem_req;
wire	sprite_reader_line_flag;
wire	sprite_reader_cpu_sleep;
wire	six_button_SELECT;
wire	VGA_SYNC;
wire	[15:0] add_result;
wire	[15:0] arbiter_addr;
wire	[3:0] arbiter_current_state;
wire	[15:0] arbiter_data;
wire	[3:0] arbiter_next_state;
wire	[5:0] cpu_current_state;
wire	[15:0] cpu_imm;
wire	[15:0] cpu_int_program_counter;
wire	[7:0] cpu_int_rflags;
wire	[5:0] cpu_next_state;
wire	[5:0] cpu_opcode;
wire	[127:0] cpu_pc_stack;
wire	[15:0] cpu_pc_stack_val;
wire	[15:0] cpu_program_counter;
wire	[15:0] cpu_ram_addr;
wire	[15:0] cpu_ram_data;
wire	[4:0] cpu_reg_a_num;
wire	[15:0] cpu_reg_a_val;
wire	[4:0] cpu_reg_b_num;
wire	[15:0] cpu_reg_b_val;
wire	[4:0] cpu_reg_c_num;
wire	[15:0] cpu_reg_c_val;
wire	[511:0] cpu_registers;
wire	[7:0] cpu_rflags;
wire	[2:0] cpu_rflags_index;
wire	[15:0] cpu_rom_addr;
wire	[1023:0] cpu_sprite_color;
wire	[383:0] cpu_sprite_id;
wire	[5:0] cpu_sprite_level;
wire	[639:0] cpu_sprite_x;
wire	[639:0] cpu_sprite_y;
wire	[2:0] cpu_stack_pointer;
wire	[15:0] divide_quotient;
wire	[15:0] divide_remain;
wire	[31:0] mult_result;
wire	[3:0] pic_current_state;
wire	[15:0] pic_int_mask;
wire	[15:0] pic_isr_addr;
wire	[15:0] pic_mem_addr;
wire	[3:0] pic_next_state;
wire	[15:0] ram_q;
wire	[31:0] rom_q;
wire	[15:0] six_button_buttons;
wire	[9:0] six_button_counter;
wire	[3:0] six_button_current_state;
wire	[15:0] six_button_mem_addr;
wire	[15:0] six_button_mem_data;
wire	[3:0] six_button_next_state;
wire	[4:0] sprite_reader_EstadoAtual;
wire	[4:0] sprite_reader_EstadoFuturo;
wire	[6:0] sprite_reader_level_counter;
wire	[5:0] sprite_reader_level_sprite_id;
wire	[9:0] sprite_reader_level_sprite_y;
wire	[15:0] sprite_reader_mem_addr;
wire	[15:0] sub_result;
wire	[7:0] VGA_B;
wire	[7:0] VGA_G;
wire	[9:0] VGA_h_pos;
wire	[19:0] VGA_oAddress;
wire	[7:0] VGA_R;
wire	[9:0] VGA_v_pos;
 
 
// 'Processor' module instantiation
Processor DUV(
.clock			(clock),
.reset			(reset),
.testbench_vsync	(testbench_vsync),
.testbench_PLL_clock	(testbench_PLL_clock),
.six_button_UP_Z	(six_button_UP_Z),
.six_button_DOWN_Y	(six_button_DOWN_Y),
.six_button_LEFT_X	(six_button_LEFT_X),
.six_button_RIGHT_MODE	(six_button_RIGHT_MODE),
.six_button_B_A		(six_button_B_A),
.six_button_C_START	(six_button_C_START),
 
 
.add_overflow			(add_overflow),
.sub_overflow			(sub_overflow),
.compare_aeb			(compare_aeb),
.compare_agb			(compare_agb),
.compare_alb			(compare_alb),
.arbiter_grant_1		(arbiter_grant_1),
.arbiter_grant_2		(arbiter_grant_2),
.arbiter_grant_3		(arbiter_grant_3),
.arbiter_wren			(arbiter_wren),
.cpu_ram_wren			(cpu_ram_wren),
.cpu_ram_req			(cpu_ram_req),
.cpu_const_bool			(cpu_const_bool),
.pic_mem_wren			(pic_mem_wren),
.pic_mem_req			(pic_mem_req),
.pic_cpu_req			(pic_cpu_req),
.cpu_int_ack			(cpu_int_ack),
.pic_int_ack_0			(pic_int_ack_0),
.cpu_v_sync_flag		(cpu_v_sync_flag),
.VGA_CLK			(VGA_CLK),
.VGA_HS				(VGA_HS),
.VGA_VS				(VGA_VS),
.VGA_BLANK			(VGA_BLANK),
.six_button_mem_wren		(six_button_mem_wren),
.six_button_mem_req		(six_button_mem_req),
.six_button_v_sync_flag		(six_button_v_sync_flag),
.six_button_int_req		(six_button_int_req),
.arbiter_grant_0		(arbiter_grant_0),
.sprite_reader_mem_wren		(sprite_reader_mem_wren),
.sprite_reader_mem_req		(sprite_reader_mem_req),
.sprite_reader_line_flag	(sprite_reader_line_flag),
.sprite_reader_cpu_sleep	(sprite_reader_cpu_sleep),
.six_button_SELECT		(six_button_SELECT),
.VGA_SYNC			(VGA_SYNC),
.add_result			(add_result),
.arbiter_addr			(arbiter_addr),
.arbiter_current_state		(arbiter_current_state),
.arbiter_data			(arbiter_data),
.arbiter_next_state		(arbiter_next_state),
.cpu_current_state		(cpu_current_state),
.cpu_imm			(cpu_imm),
.cpu_int_program_counter	(cpu_int_program_counter),
.cpu_int_rflags			(cpu_int_rflags),
.cpu_next_state			(cpu_next_state),
.cpu_opcode			(cpu_opcode),
.cpu_pc_stack			(cpu_pc_stack),
.cpu_pc_stack_val		(cpu_pc_stack_val),
.cpu_program_counter		(cpu_program_counter),
.cpu_ram_addr			(cpu_ram_addr),
.cpu_ram_data			(cpu_ram_data),
.cpu_reg_a_num			(cpu_reg_a_num),
.cpu_reg_a_val			(cpu_reg_a_val),
.cpu_reg_b_num			(cpu_reg_b_num),
.cpu_reg_b_val			(cpu_reg_b_val),
.cpu_reg_c_num			(cpu_reg_c_num),
.cpu_reg_c_val			(cpu_reg_c_val),
.cpu_registers			(cpu_registers),
.cpu_rflags			(cpu_rflags),
.cpu_rflags_index		(cpu_rflags_index),
.cpu_rom_addr			(cpu_rom_addr),
.cpu_sprite_color		(cpu_sprite_color),
.cpu_sprite_id			(cpu_sprite_id),
.cpu_sprite_level		(cpu_sprite_level),
.cpu_sprite_x			(cpu_sprite_x),
.cpu_sprite_y			(cpu_sprite_y),
.cpu_stack_pointer		(cpu_stack_pointer),
.divide_quotient		(divide_quotient),
.divide_remain			(divide_remain),
.mult_result			(mult_result),
.pic_current_state		(pic_current_state),
.pic_int_mask			(pic_int_mask),
.pic_isr_addr			(pic_isr_addr),
.pic_mem_addr			(pic_mem_addr),
.pic_next_state			(pic_next_state),
.ram_q				(ram_q),
.rom_q				(rom_q),
.six_button_buttons		(six_button_buttons),
.six_button_counter		(six_button_counter),
.six_button_current_state	(six_button_current_state),
.six_button_mem_addr		(six_button_mem_addr),
.six_button_mem_data		(six_button_mem_data),
.six_button_next_state		(six_button_next_state),
.sprite_reader_EstadoAtual	(sprite_reader_EstadoAtual),
.sprite_reader_EstadoFuturo	(sprite_reader_EstadoFuturo),
.sprite_reader_level_counter	(sprite_reader_level_counter),
.sprite_reader_level_sprite_id	(sprite_reader_level_sprite_id),
.sprite_reader_level_sprite_y	(sprite_reader_level_sprite_y),
.sprite_reader_mem_addr		(sprite_reader_mem_addr),
.sub_result			(sub_result),
.VGA_B				(VGA_B),
.VGA_G				(VGA_G),
.VGA_h_pos			(VGA_h_pos),
.VGA_oAddress			(VGA_oAddress),
.VGA_R				(VGA_R),
.VGA_v_pos			(VGA_v_pos)
 
);
 
// Data Transfer Instructions
parameter opcode_lw				= 6'b001001;
parameter opcode_sw				= 6'b001010;
parameter opcode_limm				= 6'b001100;
// Arithmetic Instructions
parameter opcode_add				= 6'b010001;
parameter opcode_sub				= 6'b010010;
parameter opcode_mul				= 6'b010100;
parameter opcode_div				= 6'b010101;
// Logical Instructions
parameter opcode_and				= 6'b100001;
parameter opcode_or				= 6'b100010;
parameter opcode_cmp				= 6'b100100;
parameter opcode_not				= 6'b100101;
// Control Transfer Instructions (Immediate)
parameter opcode_jmp				= 6'b101001;
parameter opcode_brfl				= 6'b101010;
parameter opcode_call				= 6'b101011;
parameter opcode_ret				= 6'b101100;
parameter opcode_iret				= 6'b101101;
parameter opcode_nop				= 6'b101110;
// Control Transfer Instructions (Register)
parameter opcode_jr				= 6'b011001;
parameter opcode_brflr 				= 6'b011010;
parameter opcode_callr				= 6'b011011;
// Graphical instructions
parameter opcode_sprite_id			= 6'b110001;
parameter opcode_sprite_color			= 6'b110010;
parameter opcode_sprite_pos			= 6'b110100;
parameter opcode_wait_vsync			= 6'b110111;
 
 
parameter breakpoint_pc_1 = 5947;	// SUCCESS
parameter breakpoint_pc_2 = 5948;	// ERROR
 
parameter breakpoint_pc_3 = 5949;	// INTERRUPT
parameter breakpoint_pc_4 = 6110;	// INTERRUPT RETURN
 
// Initial assignments
initial
begin
	six_button_select_counter = -1;
 
	testbench_PLL_clock = 0;
	clock = 0;
	reset = 0;
	#40 reset = 1;	// Reset on at 40ns
	#40 reset = 0;	// Reset off at 80ns
 
	// Open file to save VGA output data
	VGA_output_file = $fopen("VGA_Output_Data.out","w");
	if (VGA_output_file == 0)
	begin
		$display("VGA_output_file handle was NULL");
		$finish;
	end
 
	// Open file to save instructions output data
	processor_output_file = $fopen("Processor_Output_Data.out","w");
	if (processor_output_file == 0)
	begin
		$display("processor_output_file handle was NULL");
		$finish;
	end
end
 
 
// 20ns clock cycle (50 Mhz)
always #10 clock = !clock;
 
// 40ns clock cycle (25 Mhz) for VGA_Interface module
always #20 testbench_PLL_clock = !testbench_PLL_clock;
 
 
always @ (posedge sprite_reader_cpu_sleep)
begin
	$fwrite(processor_output_file, "=====================================\n");
	$fwrite(processor_output_file, "========== CPU SLEEP ON!! ==========\n");
	$fwrite(processor_output_file, "=====================================\n");
	$display("\n\nCPU SLEEP ON!!");
end
 
always @ (negedge sprite_reader_cpu_sleep)
begin
	$fwrite(processor_output_file, "=====================================\n");
	$fwrite(processor_output_file, "========== CPU SLEEP OFF!! ==========\n");
	$fwrite(processor_output_file, "=====================================\n");
	$display("\n\nCPU SLEEP OFF!!");
end
 
always @ (negedge clock)
begin
 
	if(cpu_current_state == 3)
	begin
 
		$fwrite(processor_output_file, "%d: ", cpu_program_counter);
 
		case (cpu_opcode)
			opcode_add:
			begin
				$fwrite(processor_output_file, "ADD\n");
			end
 
			opcode_sub:
			begin
				$fwrite(processor_output_file, "SUB\n");
			end
 
			opcode_mul:
			begin
				$fwrite(processor_output_file, "MUL\n");
			end
 
			opcode_div:
			begin
				$fwrite(processor_output_file, "DIV\n");
			end
 
			opcode_and:
			begin
				$fwrite(processor_output_file, "AND\n");
			end
 
			opcode_or:
			begin
				$fwrite(processor_output_file, "OR\n");
			end
 
			opcode_cmp:
			begin
				$fwrite(processor_output_file, "CMP\n");
			end
 
			opcode_not:
			begin
				$fwrite(processor_output_file, "NOT\n");
			end
 
			opcode_sprite_id:
			begin
				$fwrite(processor_output_file, "SPRITE_ID\n");
			end
 
			opcode_sprite_color:
			begin
				$fwrite(processor_output_file, "SPRITE_COLOR\n");
			end
 
			opcode_sprite_pos:
			begin
				$fwrite(processor_output_file, "SPRITE_POS\n");
			end
 
			opcode_limm:
			begin
				$fwrite(processor_output_file, "LIMM\n");
			end
 
			opcode_lw:
			begin
				$fwrite(processor_output_file, "LW\n");
			end
 
			opcode_sw:
			begin
				$fwrite(processor_output_file, "SW\n");
			end
 
			opcode_jmp:
			begin
				$fwrite(processor_output_file, "JMP\n");
			end
 
			opcode_jr:
			begin
				$fwrite(processor_output_file, "JR\n");
			end
 
			opcode_brfl:
			begin
				$fwrite(processor_output_file, "BRFL\n");
			end
 
			opcode_brflr:
			begin
				$fwrite(processor_output_file, "BRFLR\n");
			end
 
			opcode_nop:
			begin
				$fwrite(processor_output_file, "NOP\n");
			end
 
			opcode_call:
			begin
				$fwrite(processor_output_file, "CALL\n");
			end
 
			opcode_callr:
			begin
				$fwrite(processor_output_file, "CALLR\n");
			end
 
			opcode_ret:
			begin
				$fwrite(processor_output_file, "RET\n");
			end
 
			opcode_wait_vsync:
			begin
				$fwrite(processor_output_file, "WAIT_VSYNC\n");
			end
 
			opcode_iret:
			begin
				$fwrite(processor_output_file, "IRET\n");
			end
 
			default:
			begin
				$fwrite(processor_output_file, "ILLEGAL INSTRUCTION\n");
			end
 
		endcase
 
 
		if(cpu_program_counter == breakpoint_pc_1)
		begin
			$fwrite(processor_output_file, "=====================================\n");
			$fwrite(processor_output_file, "============== SUCCESS ==============\n");
			$fwrite(processor_output_file, "=====================================\n");
			$display("\n\nSuccess!!");
			//$fclose(processor_output_file);
			//$stop;
		end
 
		if(cpu_program_counter == breakpoint_pc_2)
		begin
			$fwrite(processor_output_file, "=====================================\n");
			$fwrite(processor_output_file, "=============== ERROR ===============\n");
			$fwrite(processor_output_file, "=====================================\n");
			$display("\n\nError!!");
			$fclose(processor_output_file);
			$stop;
		end
 
		if(cpu_program_counter == breakpoint_pc_3)
		begin
			$fwrite(processor_output_file, "=====================================\n");
			$fwrite(processor_output_file, "============= INTERRUPT =============\n");
			$fwrite(processor_output_file, "=====================================\n");
			$display("\n\Interrupt!!");
			//$fclose(processor_output_file);
			//$stop;
		end
 
		if(cpu_program_counter == breakpoint_pc_4)
		begin
			$fwrite(processor_output_file, "=====================================\n");
			$fwrite(processor_output_file, "========== INTERRUPT RETURN =========\n");
			$fwrite(processor_output_file, "=====================================\n");
			$display("\n\Interrupt Return!!");
			//$fclose(processor_output_file);
			//$stop;
		end
	end
end
 
always @ (negedge testbench_PLL_clock)
begin
	if (VGA_v_pos == 0)
	begin
		if (VGA_h_pos < 799)
		begin
			$fwrite(VGA_output_file, "%.5d ", VGA_h_pos);
		end
 
		else
		begin
			$fwrite(VGA_output_file, "%.5d ", VGA_h_pos);
			$fwrite(VGA_output_file, "\n");
		end
	end
 
	else
	begin
		if (VGA_h_pos < 799)
		begin
			$fwrite(VGA_output_file, "%.5d ", { VGA_B[7:3],VGA_G[7:2],VGA_R[7:3] } );
		end
		else
		begin
			$fwrite(VGA_output_file, "%.5d ", { VGA_B[7:3],VGA_G[7:2],VGA_R[7:3] } );
			$fwrite(VGA_output_file, "\n");
		end
	end
 
	if ( (VGA_v_pos == 524) && (VGA_h_pos == 799) )
	begin
		$fwrite(VGA_output_file, "\n\n");
		$fwrite(VGA_output_file, "*************************************************");
		$fwrite(VGA_output_file, "\n\n");
	end
end
 
always
begin
 
	// Button UP and A pressed - Active low
	button_up	= 0;
	button_down	= 1;
	button_left	= 1;
	button_right	= 1;
	button_a	= 0;
	button_b	= 1;
	button_c	= 1;
	button_x	= 1;
	button_y	= 1;
	button_z	= 1;
	button_mode	= 1;
	button_start	= 1;
 
	#20000000 ;	// Wait 20 ms = 20.000.000 ns
 
	// Button UP and A pressed - Active low
	button_up	= 0;
	button_down	= 1;
	button_left	= 1;
	button_right	= 1;
	button_a	= 0;
	button_b	= 1;
	button_c	= 1;
	button_x	= 1;
	button_y	= 1;
	button_z	= 1;
	button_mode	= 1;
	button_start	= 1;
 
	#20000000 ;	// Wait 20 ms = 20.000.000 ns
 
	// Button LEFT and B pressed - Active low
	button_up	= 1;
	button_down	= 1;
	button_left	= 0;
	button_right	= 1;
	button_a	= 1;
	button_b	= 0;
	button_c	= 1;
	button_x	= 1;
	button_y	= 1;
	button_z	= 1;
	button_mode	= 1;
	button_start	= 1;
 
	#20000000 ;	// Wait 20 ms = 20.000.000 ns
 
	// Button LEFT and B pressed - Active low
	button_up	= 1;
	button_down	= 1;
	button_left	= 0;
	button_right	= 1;
	button_a	= 1;
	button_b	= 0;
	button_c	= 1;
	button_x	= 1;
	button_y	= 1;
	button_z	= 1;
	button_mode	= 1;
	button_start	= 1;
 
	#20000000 ;	// Wait 20 ms = 20.000.000 ns
 
	$display("\n\nSTOP!!");
	$stop;
end
 
always @ (six_button_SELECT)
begin
	if (six_button_select_counter < 7)
		six_button_select_counter = six_button_select_counter+1;
	else
		six_button_select_counter = 0;
 
	case (six_button_select_counter)
		0:
		begin
			six_button_UP_Z		= button_up;
			six_button_DOWN_Y	= button_down;
			six_button_LEFT_X	= button_left;
			six_button_RIGHT_MODE	= button_right;
			six_button_B_A		= button_b;
			six_button_C_START	= button_c;
		end
 
		1:
		begin
			six_button_UP_Z		= button_up;
			six_button_DOWN_Y	= button_down;
			six_button_LEFT_X	= 0;
			six_button_RIGHT_MODE	= 0;
			six_button_B_A		= button_a;
			six_button_C_START	= button_start;
		end
 
		2:
		begin
			six_button_UP_Z		= button_up;
			six_button_DOWN_Y	= button_down;
			six_button_LEFT_X	= button_left;
			six_button_RIGHT_MODE	= button_right;
			six_button_B_A		= button_b;
			six_button_C_START	= button_c;
		end
 
		3:
		begin
			six_button_UP_Z		= button_up;
			six_button_DOWN_Y	= button_down;
			six_button_LEFT_X	= 0;
			six_button_RIGHT_MODE	= 0;
			six_button_B_A		= button_a;
			six_button_C_START	= button_start;
		end
 
		4:
		begin
			six_button_UP_Z		= button_up;
			six_button_DOWN_Y	= button_down;
			six_button_LEFT_X	= button_left;
			six_button_RIGHT_MODE	= button_right;
			six_button_B_A		= button_b;
			six_button_C_START	= button_c;
		end
 
		5:
		begin
			six_button_UP_Z		= 0;
			six_button_DOWN_Y	= 0;
			six_button_LEFT_X	= 0;
			six_button_RIGHT_MODE	= 0;
			six_button_B_A		= button_a;
			six_button_C_START	= button_start;
		end
 
		6:
		begin
			six_button_UP_Z		= button_z;
			six_button_DOWN_Y	= button_y;
			six_button_LEFT_X	= button_x;
			six_button_RIGHT_MODE	= button_mode;
			six_button_B_A		= button_b;
			six_button_C_START	= button_c;
		end
 
		7:
		begin
			six_button_UP_Z		= 1;
			six_button_DOWN_Y	= 1;
			six_button_LEFT_X	= 1;
			six_button_RIGHT_MODE	= 1;
			six_button_B_A		= button_a;
			six_button_C_START	= button_start;
		end
 
		default:
		begin
			six_button_UP_Z		= button_up;
			six_button_DOWN_Y	= button_down;
			six_button_LEFT_X	= button_left;
			six_button_RIGHT_MODE	= button_right;
			six_button_B_A		= button_b;
			six_button_C_START	= button_c;
		end
 
	endcase
end
 
endmodule
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.