OpenCores
URL https://opencores.org/ocsvn/theia_gpu/theia_gpu/trunk

Subversion Repositories theia_gpu

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /theia_gpu/branches/beta_1.1/rtl/CONTROL
    from Rev 18 to Rev 58
    Reverse comparison

Rev 18 → Rev 58

/Unit_Control.v
0,0 → 1,1048
/**********************************************************************************
Theia, Ray Cast Programable graphic Processing Unit.
Copyright (C) 2010 Diego Valverde (diego.valverde.g@gmail.com)
 
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
***********************************************************************************/
/**********************************************************************************
Description:
 
This is the main Finite State Machine.
 
**********************************************************************************/
 
`timescale 1ns / 1ps
`include "aDefinitions.v"
 
`define CU_AFTER_RESET_STATE 0
`define CU_WAIT_FOR_INITIAL_CONFIGURATION 1
`define CU_TRIGGER_CONFIGURATION_DATA_READ 2
`define CU_WAIT_FOR_CONFIG_DATA_READ 3
`define CU_ACK_CONFIG_DATA_READ 4
`define CU_PRECALCULATE_CONSTANTS 5
`define CU_WAIT_FOR_CONSTANT 6
`define CU_ACK_PRECALCULATE_CONSTANTS 7
`define CU_WAIT_FOR_TASK 8
`define CU_READ_TASK_DATA 9
`define CU_WAIT_TASK_DATA_READ 10
`define CU_ACK_TASK_DATA_READ 11
`define CU_TRIGGER_RGU 12
`define CU_WAIT_FOR_RGU 13
`define CU_ACK_RGU 14
`define CU_TRIGGER_GEO 15
`define CU_WAIT_FOR_GEO_SYNC 16
//`define CU_CHECK_AABBIU_REQUEST 17
`define CU_TRIGGER_TCC 17
//`define CU_CHECK_BIU_REQUEST 18
`define CU_TRIGGER_TFF 18
//`define CU_CHECK_GEO_DONE 19
`define CU_WAIT_FOR_TFF 19
`define CU_TRIGGER_AABBIU 20
`define CU_WAIT_FOR_AABBIU 21
`define CU_TRIGGER_BIU 22
`define CU_WAIT_FOR_BIU 23
`define CU_ACK_UCODE 24
`define CU_TRIGGER_PSU 25
`define CU_WAIT_FOR_PSU 26
`define CU_ACK_PSU 27
`define CU_TRIGGER_PCU 28
`define CU_WAIT_FOR_PCU 29
`define CU_ACK_PCU 30
`define CU_CHECK_HIT 31
`define CU_CLEAR_REGISTERS 32
`define CU_WAIT_CLEAR_REGISTERS 33
`define CU_ACK_CLEAR_REGISTERS 34
`define CU_TRIGGER_PSU_WITH_TEXTURE 35
`define WAIT_FOR_TCC 36
`define CU_TRIGGER_NPU 37
`define CU_WAIT_NPU 38
`define CU_ACK_NPU 39
`define CU_PERFORM_INTIAL_CONFIGURATION 40
`define CU_SET_PICTH 41
 
//--------------------------------------------------------------
module ControlUnit
(
 
input wire Clock,
input wire Reset,
input wire[15:0] iControlRegister,
input wire iExternalBus_DataReady,
input wire iBusUnitDone,
output reg oGFUEnable,
input wire iTriggerAABBIURequest,
input wire iTriggerBIURequest,
input wire iTriggertTCCRequest,
output reg oUCodeEnable,
output reg[`ROM_ADDRESS_WIDTH-1:0] oUCodeInstructioPointer,
input wire iUCodeDone,
input wire iUCodeReturnValue,
input wire iGFUDone,
input wire iGEOSync,
output reg oTriggerTFF,
input wire iTFFDone,
input wire MST_I,
output reg[2:0] oRamBusOwner,
input wire iIODone,
output reg oSetCurrentPitch,
//output reg //oIncCurrentPitch,
//output wire[`WIDTH-1:0] oPitchInitialValue,
output reg oIOWritePixel
);
 
//Internal State Machine varibles
reg [5:0] CurrentState;
reg [5:0] NextState;
integer ucode_file;
reg rResetHitFlop,rHitFlopEnable;
wire wHit;
 
`ifdef DUMP_CODE
integer log;
initial
begin
$display("Opening ucode dump file....\n");
ucode_file = $fopen("CU.log","w");
end
 
`endif
 
 
wire[`ROM_ADDRESS_WIDTH-1:0] wAABBIUAddress;
assign wAABBIUAddress = (iControlRegister[`CR_USER_AABBIU] == 1'b1) ? `USER_AABBIU_UCODE_ADDRESS : `AABBIU_UCODE_ADDRESS;
//--------------------------------------------------------------
FFToggleOnce_1Bit FFTO1
(
.Clock( Clock ),
.Reset( rResetHitFlop ),
.Enable( rHitFlopEnable && iUCodeDone ),
.S( iUCodeReturnValue ),
.Q( wHit )
);
//--------------------------------------------------------------
 
`ifdef DEBUG
always @ ( wHit )
begin
`LOGME "*** Triangle HIT ***\n");
end
`endif
 
//Next states logic and Reset sequence
always @(posedge Clock or posedge Reset)
begin
if (Reset)
CurrentState <= `CU_AFTER_RESET_STATE;
else
CurrentState <= NextState;
end
 
//--------------------------------------------------------------
always @ ( * )
begin
case (CurrentState)
//-----------------------------------------
`CU_AFTER_RESET_STATE:
begin
`ifdef DEBUG
`LOGME"%d CU_AFTER_RESET_STATE\n",$time);
`endif
oRamBusOwner <= 0;
oUCodeInstructioPointer <= `INITIAL_UCODE_ADDRESS;
oGFUEnable <= 0;
oUCodeEnable <= 0;
oIOWritePixel <= 0;
rResetHitFlop <= 1;
rHitFlopEnable <= 0;
oTriggerTFF <= 0;
oSetCurrentPitch <= 1;
//oIncCurrentPitch <= 0;
NextState <= `CU_WAIT_FOR_INITIAL_CONFIGURATION;
end
//-----------------------------------------
`CU_WAIT_FOR_INITIAL_CONFIGURATION:
begin
$display("CU_WAIT_FOR_INITIAL_CONFIGURATION");
// `ifdef DEBUG
// `LOGME"%d Control: CU_WAIT_FOR_INITIAL_CONFIGURATION\n",$time);
// `endif
oRamBusOwner <= 0;
oUCodeInstructioPointer <= 0;
oGFUEnable <= 0;
oUCodeEnable <= 0;
oIOWritePixel <= 0;
rResetHitFlop <= 1;
rHitFlopEnable <= 0;
oTriggerTFF <= 0;
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
if ( MST_I )
NextState <= `CU_PERFORM_INTIAL_CONFIGURATION;//`CU_WAIT_FOR_CONFIG_DATA_READ;
else
NextState <= `CU_WAIT_FOR_INITIAL_CONFIGURATION;
end
//-----------------------------------------
`CU_PERFORM_INTIAL_CONFIGURATION:
begin
oRamBusOwner <= 0;
oUCodeInstructioPointer <= 0;
oGFUEnable <= 0;
oUCodeEnable <= 0;
oIOWritePixel <= 0;
rResetHitFlop <= 1;
rHitFlopEnable <= 0;
oTriggerTFF <= 0;
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
if ( MST_I )
NextState <= `CU_PERFORM_INTIAL_CONFIGURATION;//`CU_WAIT_FOR_CONFIG_DATA_READ;
else
NextState <= `CU_CLEAR_REGISTERS;
end
//-----------------------------------------
`CU_CLEAR_REGISTERS:
begin
`ifdef DEBUG
`LOGME"%d CU_CLEAR_REGISTERS\n",$time);
`endif
oRamBusOwner <= `REG_BUS_OWNED_BY_UCODE;
oUCodeInstructioPointer <= `INITIAL_UCODE_ADDRESS;
oGFUEnable <= 0;
oUCodeEnable <= 1; //*
oIOWritePixel <= 0;
rResetHitFlop <= 0;
rHitFlopEnable <= 0;
oTriggerTFF <= 0;
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
NextState <= `CU_WAIT_CLEAR_REGISTERS;
end
//-----------------------------------------
`CU_WAIT_CLEAR_REGISTERS:
begin
// `ifdef DEBUG
// `LOGME"%d CU_WAIT_CLEAR_REGISTERS\n",$time);
// `endif
oRamBusOwner <= `REG_BUS_OWNED_BY_UCODE;
oUCodeInstructioPointer <= `INITIAL_UCODE_ADDRESS;
oGFUEnable <= 0;
oUCodeEnable <= 0;
oIOWritePixel <= 0;
rResetHitFlop <= 0;
rHitFlopEnable <= 0;
oTriggerTFF <= 0;
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
if ( iUCodeDone )
NextState <= `CU_ACK_CLEAR_REGISTERS;
else
NextState <= `CU_WAIT_CLEAR_REGISTERS;
end
//-----------------------------------------
`CU_ACK_CLEAR_REGISTERS:
begin
`ifdef DEBUG
`LOGME"%d CU_ACK_CLEAR_REGISTERS\n", $time);
`endif
oRamBusOwner <= 0;
oUCodeInstructioPointer <= 0;
oGFUEnable <= 0;
oUCodeEnable <= 0; //*
oIOWritePixel <= 0;
rResetHitFlop <= 0;
rHitFlopEnable <= 0;
oTriggerTFF <= 0;
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
NextState <= `CU_WAIT_FOR_CONFIG_DATA_READ;
end
//-----------------------------------------
`CU_WAIT_FOR_CONFIG_DATA_READ:
begin
$display("CU_WAIT_FOR_CONFIG_DATA_READ");
// `ifdef DEBUG
// `LOGME"%d Control: CU_WAIT_FOR_CONFIG_DATA_READ\n",$time);
// `endif
 
oRamBusOwner <= 0;//`REG_BUS_OWNED_BY_BCU;
oUCodeInstructioPointer <= 0;
oGFUEnable <= 0;
oUCodeEnable <= 0;
oIOWritePixel <= 0;
rResetHitFlop <= 0;
rHitFlopEnable <= 0;
oTriggerTFF <= 0;
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
if ( MST_I == 0 )
NextState <= `CU_PRECALCULATE_CONSTANTS;
else
NextState <= `CU_WAIT_FOR_CONFIG_DATA_READ;
end
//-----------------------------------------
`CU_PRECALCULATE_CONSTANTS:
begin
$display("CU_PRECALCULATE_CONSTANTS");
`ifdef DEBUG
`LOGME"%d Control: CU_PRECALCULATE_CONSTANTS\n", $time);
`endif
oRamBusOwner <= `REG_BUS_OWNED_BY_UCODE;
oUCodeInstructioPointer <= `CPPU_UCODE_ADDRESS;
oGFUEnable <= 0;
oUCodeEnable <= 1; //*
oIOWritePixel <= 0;
rResetHitFlop <= 0;
rHitFlopEnable <= 0;
oTriggerTFF <= 0;
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
NextState <= `CU_WAIT_FOR_CONSTANT;
end
//-----------------------------------------
`CU_WAIT_FOR_CONSTANT:
begin
// `ifdef DEBUG
// `LOGME"%d Control: CU_WAIT_FOR_CONSTANT\n", $time);
// `endif
 
 
oRamBusOwner <= `REG_BUS_OWNED_BY_UCODE;
oUCodeInstructioPointer <= `CPPU_UCODE_ADDRESS;
oGFUEnable <= 0;
oUCodeEnable <= 0; //*
oIOWritePixel <= 0;
rResetHitFlop <= 0;
rHitFlopEnable <= 0;
oTriggerTFF <= 0;
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
if ( iUCodeDone )
NextState <= `CU_ACK_PRECALCULATE_CONSTANTS;
else
NextState <= `CU_WAIT_FOR_CONSTANT;
end
//-----------------------------------------
`CU_ACK_PRECALCULATE_CONSTANTS:
begin
$display("CU_ACK_PRECALCULATE_CONSTANTS");
`ifdef DEBUG
`LOGME"%d Control: CU_ACK_PRECALCULATE_CONSTANTS\n", $time);
`endif
oRamBusOwner <= 0;//`REG_BUS_OWNED_BY_BCU;
oUCodeInstructioPointer <= 0;
oGFUEnable <= 0;
oUCodeEnable <= 0; //*
oIOWritePixel <= 0;
rResetHitFlop <= 0;
rHitFlopEnable <= 0;
oTriggerTFF <= 0;
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
NextState <= `CU_TRIGGER_RGU;//CU_WAIT_FOR_TASK;
end
//-----------------------------------------
`CU_TRIGGER_RGU:
begin
`ifdef DEBUG
`LOGME"%d Control: CU_TRIGGER_RGU\n",$time);
`endif
oRamBusOwner <= `REG_BUS_OWNED_BY_UCODE;
oUCodeInstructioPointer <= `RGU_UCODE_ADDRESS;
oGFUEnable <= 0;
oUCodeEnable <= 1; //*
oIOWritePixel <= 0;
rResetHitFlop <= 0;
rHitFlopEnable <= 0;
oTriggerTFF <= 0;
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
NextState <= `CU_WAIT_FOR_RGU;
end
//-----------------------------------------
`CU_WAIT_FOR_RGU:
begin
 
// `ifdef DEBUG
// `LOGME"%d Control: CU_WAIT_FOR_RGU\n",$time);
// `endif
oRamBusOwner <= `REG_BUS_OWNED_BY_UCODE;
oUCodeInstructioPointer <= 0;
oGFUEnable <= 0;
oUCodeEnable <= 0;
oIOWritePixel <= 0;
rResetHitFlop <= 0;
rHitFlopEnable <= 0;
oTriggerTFF <= 0;
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
if ( iUCodeDone )
NextState <= `CU_ACK_RGU;
else
NextState <= `CU_WAIT_FOR_RGU;
end
//-----------------------------------------
`CU_ACK_RGU:
begin
`ifdef DEBUG
`LOGME"%d Control: CU_ACK_RGU\n",$time);
`endif
oRamBusOwner <= `REG_BUS_OWNED_BY_UCODE;
oUCodeInstructioPointer <= 0;
oGFUEnable <= 0;
oUCodeEnable <= 0; //*
oIOWritePixel <= 0;
rResetHitFlop <= 0;
rHitFlopEnable <= 0;
oTriggerTFF <= 0;
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
if ( iUCodeDone == 0)
NextState <= `CU_TRIGGER_GEO;
else
NextState <= `CU_ACK_RGU;
end
//-----------------------------------------
`CU_TRIGGER_GEO:
begin
`ifdef DEBUG
`LOGME"%d Control: CU_TRIGGER_GEO\n",$time);
`endif
oRamBusOwner <= `REG_BUS_OWNED_BY_GFU;
oUCodeInstructioPointer <= 0;
oUCodeEnable <= 0;
oGFUEnable <= 1;
oIOWritePixel <= 0;
rResetHitFlop <= 1; //*
rHitFlopEnable <= 0;
oTriggerTFF <= 0;
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
NextState <= `CU_WAIT_FOR_GEO_SYNC;
end
//-----------------------------------------
`CU_WAIT_FOR_GEO_SYNC:
begin
`ifdef DEBUG
`LOGME"%d Control: CU_WAIT_FOR_GEO_SYNC\n",$time);
`endif
oRamBusOwner <= `REG_BUS_OWNED_BY_GFU;
oUCodeInstructioPointer <= 0;
oUCodeEnable <= 0;
oGFUEnable <= 0; //Change AUg 15
oIOWritePixel <= 0;
rResetHitFlop <= 0;
rHitFlopEnable <= 0;
oTriggerTFF <= 0;
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
if (iGEOSync & iTriggerAABBIURequest )
NextState <= `CU_TRIGGER_AABBIU;
else if (iGEOSync & iTriggerBIURequest)
NextState <= `CU_TRIGGER_BIU;
else if (iGEOSync & iTriggertTCCRequest )
NextState <= `CU_TRIGGER_TCC;
else if (iGEOSync & iGFUDone )
NextState <= `CU_CHECK_HIT;
else
NextState <= `CU_WAIT_FOR_GEO_SYNC;
 
end
//-----------------------------------------
`CU_TRIGGER_TCC:
begin
//$display("CU_TRIGGER_TCC");
`ifdef DEBUG
`LOGME"%d Control: CU_TRIGGER_TCC\n",$time);
`endif
oRamBusOwner <= `REG_BUS_OWNED_BY_UCODE;
oUCodeInstructioPointer <= `TCC_UCODE_ADDRESS;
oUCodeEnable <= 1; //*
oGFUEnable <= 0;
oIOWritePixel <= 0;
rResetHitFlop <= 0;
rHitFlopEnable <= 0;
oTriggerTFF <= 0;
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
NextState <= `WAIT_FOR_TCC;
end
//-----------------------------------------
`WAIT_FOR_TCC:
begin
//$display("WAIT_FOR_TCC");
oRamBusOwner <= `REG_BUS_OWNED_BY_UCODE;
oUCodeInstructioPointer <= `TCC_UCODE_ADDRESS;
oUCodeEnable <= 0; //*
oGFUEnable <= 0;
oIOWritePixel <= 0;
rResetHitFlop <= 0;
rHitFlopEnable <= 0;
oTriggerTFF <= 0;
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
if ( iUCodeDone )
NextState <= `CU_ACK_UCODE;
else
NextState <= `WAIT_FOR_TCC;
end
//-----------------------------------------
/*
Was there any hit at all?
At this point, all the triangles in the list
have been traversed looking for a hit with our ray.
There are 3 possibilities:
1) The was not a single hit, then just paint a black
pixel on the screen and send it via PCU.
2)There was a hit and Texturing is not enabled, then trigger the PSU with
no texturing
2) There was a hit and Texturing is enabled, then fetch the texture
values corresponding to the triangle that we hitted.
*/
`CU_CHECK_HIT:
begin
`ifdef DEBUG
`LOGME"%d Control: CU_CHECK_HIT\n",$time);
`endif
oRamBusOwner <= `REG_BUS_OWNED_BY_GFU;
oUCodeInstructioPointer <= 0;
oUCodeEnable <= 0;
oGFUEnable <= 0; ///CHANGED Aug 15
oIOWritePixel <= 0;
rResetHitFlop <= 0;
rHitFlopEnable <= 0;
oTriggerTFF <= 0;
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
if (wHit && !iControlRegister[`CR_EN_TEXTURE] )
NextState <= `CU_TRIGGER_PSU;
else if (wHit && iControlRegister[`CR_EN_TEXTURE])
NextState <= `CU_TRIGGER_TFF; //Fetch the texture values from external RAM
else
NextState <= `CU_TRIGGER_PCU; //Make sure contents of the OUT_REG are ZERo!
end
//-----------------------------------------
/*
Get the texture values from external RAM.
GFU already took care of calculating the correct
texture addresses for the 4 coordinates so now lets
just ask for them.
*/
`CU_TRIGGER_TFF:
begin
`ifdef DEBUG
`LOGME"%d Control: CU_TRIGGER_TFF\n",$time);
`endif
//$display("CU_TRIGGER_TFF");
oRamBusOwner <= `REG_BUS_OWNED_BY_GFU;
oUCodeInstructioPointer <= 0;
oUCodeEnable <= 0;
oGFUEnable <= 1;
oIOWritePixel <= 0;
rResetHitFlop <= 0;
rHitFlopEnable <= 0;
oTriggerTFF <= 1; //*
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
NextState <= `CU_WAIT_FOR_TFF;
end
//-----------------------------------------
`CU_WAIT_FOR_TFF:
begin
oRamBusOwner <= `REG_BUS_OWNED_BY_GFU;
oUCodeInstructioPointer <= 0;
oUCodeEnable <= 0;
oGFUEnable <= 0; //Changed Aug 14
oIOWritePixel <= 0;
rResetHitFlop <= 0;
rHitFlopEnable <= 0;
oTriggerTFF <= 0;
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
if (iTFFDone)
NextState <= `CU_TRIGGER_PSU_WITH_TEXTURE;
else
NextState <= `CU_WAIT_FOR_TFF;
end
//-----------------------------------------
`CU_TRIGGER_PSU_WITH_TEXTURE:
begin
`ifdef DEBUG
`LOGME"%d Control: CU_TRIGGER_PSU_WITH_TEXTURE\n",$time);
`endif
oRamBusOwner <= `REG_BUS_OWNED_BY_UCODE;
oUCodeInstructioPointer <= `PSU_UCODE_ADRESS2;
oUCodeEnable <= 1;
oGFUEnable <= 0;
oIOWritePixel <= 0;
rResetHitFlop <= 0;
rHitFlopEnable <= 0;
oTriggerTFF <= 0;
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
NextState <= `CU_WAIT_FOR_PSU;
end
//-----------------------------------------
`CU_TRIGGER_AABBIU:
begin
`ifdef DEBUG
`LOGME"%d Control: CU_TRIGGER_AABBIU\n",$time);
`endif
// $stop();
oRamBusOwner <= wAABBIUAddress;//`REG_BUS_OWNED_BY_UCODE;
oUCodeInstructioPointer <=`AABBIU_UCODE_ADDRESS;
oUCodeEnable <= 1;
oGFUEnable <= 1;
oIOWritePixel <= 0;
rResetHitFlop <= 0;
rHitFlopEnable <= 0;
oTriggerTFF <= 0;
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
NextState <= `CU_WAIT_FOR_AABBIU;
end
//-----------------------------------------
`CU_WAIT_FOR_AABBIU:
begin
// `ifdef DEBUG
// `LOGME"%d Control: CU_WAIT_FOR_AABBIU\n",$time);
// `endif
 
 
// $display("iUCodeDone",iUCodeDone);
oRamBusOwner <= `REG_BUS_OWNED_BY_UCODE;
oUCodeInstructioPointer <= `AABBIU_UCODE_ADDRESS;
oUCodeEnable <= 0;
oGFUEnable <= 1;
oIOWritePixel <= 0;
rResetHitFlop <= 0;
rHitFlopEnable <= 0;
oTriggerTFF <= 0;
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
if ( iUCodeDone )
begin
// $display("iUCodeDone\n",iUCodeDone);
// $stop();
NextState <= `CU_ACK_UCODE;
end
else
NextState <= `CU_WAIT_FOR_AABBIU;
end
//-----------------------------------------
`CU_TRIGGER_BIU:
begin
`ifdef DEBUG
`LOGME"%d Control: CU_TRIGGER_BIU\n",$time);
`endif
oRamBusOwner <= `REG_BUS_OWNED_BY_UCODE;
oUCodeInstructioPointer <= `BIU_UCODE_ADDRESS;
oUCodeEnable <= 1;
oGFUEnable <= 1;
oIOWritePixel <= 0;
rResetHitFlop <= 0;//1;
rHitFlopEnable <= 1;
oTriggerTFF <= 0;
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
// $stop();
NextState <= `CU_WAIT_FOR_BIU;
end
//-----------------------------------------
`CU_WAIT_FOR_BIU:
begin
// `ifdef DEBUG
// `LOGME"%d Control: CU_WAIT_FOR_BIU\n",$time);
// `endif
oRamBusOwner <= `REG_BUS_OWNED_BY_UCODE;
oUCodeInstructioPointer <= `BIU_UCODE_ADDRESS;
oUCodeEnable <= 0;
oGFUEnable <= 1;
oIOWritePixel <= 0;
rResetHitFlop <= 0;
rHitFlopEnable <= 1;
oTriggerTFF <= 0;
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
if ( iUCodeDone )
NextState <= `CU_ACK_UCODE;
else
NextState <= `CU_WAIT_FOR_BIU;
end
//-----------------------------------------
/*
ACK UCODE by setting oUCodeEnable = 0
*/
`CU_ACK_UCODE:
begin
`ifdef DEBUG
`LOGME"%d Control: CU_ACK_UCODE\n",$time);
`endif
oRamBusOwner <= `REG_BUS_OWNED_BY_GFU;
oUCodeInstructioPointer <= 0; //*
oUCodeEnable <= 0; //*
oGFUEnable <= 0; //Changed Aug 15
oIOWritePixel <= 0;
rResetHitFlop <= 0;
rHitFlopEnable <= 0;
oTriggerTFF <= 0;
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
// $stop();
if ( iUCodeDone == 0 )
NextState <= `CU_WAIT_FOR_GEO_SYNC;
else
NextState <= `CU_ACK_UCODE;
end
//-----------------------------------------
/*
Here we no longer use GFU so set Enable to zero
*/
`CU_TRIGGER_PSU:
begin
`ifdef DEBUG
`LOGME"%d Control: CU_TRIGGER_PSU\n",$time);
`endif
oRamBusOwner <= `REG_BUS_OWNED_BY_UCODE;
oUCodeInstructioPointer <= `PSU_UCODE_ADRESS;
oUCodeEnable <= 1;
oGFUEnable <= 0;//*
oIOWritePixel <= 0;
rResetHitFlop <= 0;
rHitFlopEnable <= 0;
oTriggerTFF <= 0;
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
NextState <= `CU_WAIT_FOR_PSU;
end
//-----------------------------------------
`CU_WAIT_FOR_PSU:
begin
// `ifdef DEBUG
// `LOGME"%d Control: CU_TRIGGER_PSU\n",$time);
// `endif
oRamBusOwner <= `REG_BUS_OWNED_BY_UCODE;
oUCodeInstructioPointer <= `PSU_UCODE_ADRESS;
oUCodeEnable <= 0;
oGFUEnable <= 0;
oIOWritePixel <= 0;
rResetHitFlop <= 0;
rHitFlopEnable <= 0;
oTriggerTFF <= 0;
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
if ( iUCodeDone )
NextState <= `CU_ACK_PSU;
else
NextState <= `CU_WAIT_FOR_PSU;
end
//-----------------------------------------
`CU_ACK_PSU:
begin
`ifdef DEBUG
`LOGME"%d Control: CU_ACK_PSU\n",$time);
`endif
oRamBusOwner <= `REG_BUS_OWNED_BY_UCODE;
oUCodeInstructioPointer <= 0; //*
oUCodeEnable <= 0; //*
oGFUEnable <= 0;
oIOWritePixel <= 0;
rResetHitFlop <= 0;
rHitFlopEnable <= 0;
oTriggerTFF <= 0;
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
if ( iUCodeDone == 0)
NextState <= `CU_TRIGGER_PCU;
else
NextState <= `CU_ACK_PSU;
end
//-----------------------------------------
/*
Trigger the Pixel Commit.
*/
`CU_TRIGGER_PCU:
begin
`ifdef DEBUG
`LOGME"%d Control: CU_TRIGGER_PCU\n",$time);
`endif
oRamBusOwner <= `REG_BUS_OWNED_BY_GFU;
oUCodeInstructioPointer <= 0; //*
oUCodeEnable <= 0; //*
oGFUEnable <= 0;
oIOWritePixel <= 1; //*
rResetHitFlop <= 0;
rHitFlopEnable <= 0;
oTriggerTFF <= 0;
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
NextState <= `CU_SET_PICTH;
end
//-----------------------------------------
`CU_SET_PICTH:
begin
oRamBusOwner <= `REG_BUS_OWNED_BY_GFU;
oUCodeInstructioPointer <= 0; //*
oUCodeEnable <= 0; //*
oGFUEnable <= 0;
oIOWritePixel <= 1; //*
rResetHitFlop <= 0;
rHitFlopEnable <= 0;
oTriggerTFF <= 0;
oSetCurrentPitch <= 1; //*
//oIncCurrentPitch <= 0;
NextState <= `CU_WAIT_FOR_PCU;
end
//-----------------------------------------
`CU_WAIT_FOR_PCU:
begin
// `ifdef DEBUG
// `LOGME"%d Control: CU_WAIT_FOR_PCU\n",$time);
// `endif
oRamBusOwner <= `REG_BUS_OWNED_BY_GFU;
oUCodeInstructioPointer <= 0; //*
oUCodeEnable <= 0; //*
oGFUEnable <= 0;
oIOWritePixel <= 1;
rResetHitFlop <= 0;
rHitFlopEnable <= 0;
oTriggerTFF <= 0;
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
if ( iIODone )
NextState <= `CU_ACK_PCU;
else
NextState <= `CU_WAIT_FOR_PCU;
end
//-----------------------------------------
`CU_ACK_PCU:
begin
`ifdef DEBUG
`LOGME"%d Control: CU_ACK_PCU\n",$time);
`endif
oRamBusOwner <= `REG_BUS_OWNED_BY_GFU;
oUCodeInstructioPointer <= 0; //*
oUCodeEnable <= 0; //*
oGFUEnable <= 0;
oIOWritePixel <= 0;
rResetHitFlop <= 0;
rHitFlopEnable <= 0;
oTriggerTFF <= 0;
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
 
NextState <= `CU_TRIGGER_NPU;
end
//-----------------------------------------
`CU_TRIGGER_NPU: //Next Pixel Unit
begin
`ifdef DEBUG
`LOGME"%d Control: CU_TRIGGER_NPU\n",$time);
`endif
oRamBusOwner <= `REG_BUS_OWNED_BY_UCODE;
oUCodeInstructioPointer <= `NPG_UCODE_ADDRESS; //*
oUCodeEnable <= 1; //*
oGFUEnable <= 0;
oIOWritePixel <= 0;
rResetHitFlop <= 0;
rHitFlopEnable <= 0;
oTriggerTFF <= 0;
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
 
NextState <= `CU_WAIT_NPU;
end
//-----------------------------------------
`CU_WAIT_NPU:
begin
oRamBusOwner <= `REG_BUS_OWNED_BY_UCODE;
oUCodeInstructioPointer <= `NPG_UCODE_ADDRESS;
oUCodeEnable <= 0;
oGFUEnable <= 0;
oIOWritePixel <= 0;
rResetHitFlop <= 0;
rHitFlopEnable <= 0;
oTriggerTFF <= 0;
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
if ( iUCodeDone )
NextState <= `CU_ACK_NPU;
else
NextState <= `CU_WAIT_NPU;
end
//-----------------------------------------
`CU_ACK_NPU:
begin
`ifdef DEBUG
`LOGME"%d Control: CU_ACK_PSU\n",$time);
`endif
oRamBusOwner <= `REG_BUS_OWNED_BY_UCODE;
oUCodeInstructioPointer <= 0; //*
oUCodeEnable <= 0; //*
oGFUEnable <= 0;
oIOWritePixel <= 0;
rResetHitFlop <= 0;
rHitFlopEnable <= 0;
oTriggerTFF <= 0;
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
if ( iUCodeDone == 0)
NextState <= `CU_TRIGGER_RGU;
else
NextState <= `CU_ACK_NPU;
end
//-----------------------------------------
default:
begin
`ifdef DEBUG
`LOGME"%d Control: ERRO Undefined State\n",$time);
`endif
oRamBusOwner <= 0;
oUCodeInstructioPointer <= 0;
oUCodeEnable <= 0;
oGFUEnable <= 0;
oIOWritePixel <= 0;
rResetHitFlop <= 0;
rHitFlopEnable <= 0;
oTriggerTFF <= 0;
oSetCurrentPitch <= 0;
//oIncCurrentPitch <= 0;
NextState <= `CU_AFTER_RESET_STATE;
end
//-----------------------------------------
 
endcase
end //always
endmodule

powered by: WebSVN 2.1.0

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