URL
https://opencores.org/ocsvn/theia_gpu/theia_gpu/trunk
Subversion Repositories theia_gpu
[/] [theia_gpu/] [branches/] [beta_1.2/] [rtl/] [GEO/] [Module_GeometryFetchFSM.v] - Rev 119
Go to most recent revision | Compare with Previous | Blame | View Log
/********************************************************************************** Theaia, Ray Cast Programable graphic Processing Unit. Copyright (C) 2009 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. ***********************************************************************************/ /********************************************************************************** Module Description: WIP **********************************************************************************/ `timescale 1ns / 1ps `include "aDefinitions.v" `define GFSM_AFTER_RESET 0 `define GFSM_INITIAL_STATE 1 `define GFSM_TRIGGER_AABBIU 2 `define GFSM_WAIT_FOR_AABBIU 3 `define GFSM_ACK_AABBIU 10 `define GFSM_AABBIU_HIT 4 `define GFSM_AABBIU_NO_HIT 5 `define GFSM_TRIGGER_TRIANGLE_FETCH 6 `define GFSM_WAIT_FOR_TRIANGLE_FETCH 7 `define GFSM_TRIGGER_BIU_REQUSET 8 `define GFSM_WAIT_FOR_BIU 9 `define GFSM_GET_FIRST_CHILD 11 `define GFSM_CHECK_TRIANGLE_COUNT 12 `define GFSM_CHECK_NEXT_BROTHER 13 `define GFSM_GET_BROTHER 14 `define GFSM_TRIGGER_NODE_FETCH 15 `define GFSM_FETCH_NEXT_BROTHER 16 `define GFSM_CHECK_PARENTS_BROTHER 18 `define GFSM_GET_PARENTS_BROTHER 19 `define GFSM_WAIT_FOR_NODE_FETCH 20 `define GFSM_POST_BLOCK_READ_DELAY 21 `define GFSM_TRIGGER_ROOT_NODE_FETCH 23 `define GFSM_WAIT_FOR_ROOT_NODE_FETCH 24 `define GFSM_FETCH_DATA 25 `define GFSM_WAITF_FOR_BIU_AVAILABLE 26 `define GFSM_SWAP_TRIANGLE_POINTER 27 `define GFSM_DONE 28 `define GFSM_SET_TRIANGLE_LIST_INITIAL_OFFSET 29 `define GFSM_REQUEST_TCC 30 `define GFSM_WAIT_FOR_TCC 31 `define GFSM_WAIT_STATE_PRE_TCC 32 `define GFSM_INITIAL_STATE_TEXTURE 33 `define GFSM_SET_WBM_INITIAL_ADDRESS 34 `define GFSM_REQUEST_TEXTURE 35 `define GFSM_WAIT_FOR_TEXTURE 36 `define GFSM_REQUEST_NEXT_TEXTURE 37 `define GFSM_WAIT_FOR_NEXT_TEXTURE 38 `define GFSM_INC_TEXTURE_ADDRESS 39 `define GFSM_SET_NEXT_TEXTURE_ADDR 42 `define GFSM_WAIT_FOR_IO_HIT 43 `define GFSM_WAIT_FOR_IO_NO_HIT 44 module GeometryFetchFSM ( input wire Clock, input wire Reset, //Input control signals input wire iEnable, input wire iAABBIUHit, input wire iBIUHit, input wire iUCodeDone, input wire iTexturingEnable, input wire iTriangleReadDone, //input wire iTextureReadDone, input wire iNodeReadDone, //Current Node info input wire iNode_IsLeaf, input wire[`WIDTH-1:0] iNode_Brother_Address, input wire[`WIDTH-1:0] iNode_TriangleCount, input wire[`WIDTH-1:0] iNode_Parents_Brother_Address, //input wire[`WIDTH-1:0] Node_OffsetData_Address, input wire[`WIDTH-1:0] iNode_FirstChild_Address, //input wire iBIUAvailable, //input wire Node_MaxBlocks, //Control output signals output reg oEnable_WBM, //Activate the WBM in I/O output wire[`DATA_ADDRESS_WIDTH-1:0] oAddressWBM, //This is the address that we want to read from in I/O output reg oSetAddressWBM, //This uis to tell I/O to use the adress we just set output reg oSetIOWriteBackAddr, output wire[`DATA_ADDRESS_WIDTH-1:0] oRAMTextureStoreLocation, //This is where we want to store the data comming from I/O input wire iDataAvailable, input wire iIOBusy, output reg [`WIDTH-1:0] oNodeAddress, input wire iTrigger_TFF, output reg oRequest_AABBIU, output reg oRequest_BIU, output reg oRequest_TCC, output reg oTrigger_TFU, output reg oTrigger_TNF, output reg [1:0] oWBM_Addr_Selector, //0 = TNF, 1 = TFU, 2 = TCC output reg oSync, output reg oSetTFUAddressOffset, `ifdef DEBUG input wire[`MAX_CORES-1:0] iDebug_CoreID, `endif output reg oDone ); reg [6:0] CurrentState; reg [6:0] NextState; //reg //IncTextureWriteAddress; reg IncTextureCoordRegrAddr,IncTextureCount; wire [2:0] wTextureCount; reg IncTriangleCount,ClearTriangleCount; wire [`WIDTH-1:0] wTriangleCount; //---------------------------------------- UpCounter_32 UP32_Tricount ( .Clock( Clock ), .Reset( ClearTriangleCount ), .Initial( 0 ), .Enable( IncTriangleCount ), .Q( wTriangleCount ) ); //----------------------------- UpCounter_16E TFF_VC1a ( .Clock( Clock ), .Reset( iTrigger_TFF | Reset ), .Initial( `OREG_TEX_COORD1 ), .Enable( IncTextureCoordRegrAddr ), .Q( oAddressWBM ) ); //assign oAddressWBM = `OREG_TEX_COORD1; //----------------------------- UPCOUNTER_POSEDGE # (3) TFF_VC1 ( .Clock( Clock ), .Reset( iTrigger_TFF ), .Initial( 3'b0 ), .Enable( IncTextureCount ), .Q( wTextureCount ) ); //----------------------------- assign oRAMTextureStoreLocation = `CREG_TEX_COLOR1; /* UPCOUNTER_POSEDGE # (16) TNF_TFU_2 ( .Clock( Clock ), .Reset( iTrigger_TFF ), .Initial( `CREG_TEX_COLOR1 ), .Enable( //IncTextureWriteAddress ), .Q( oRAMTextureStoreLocation ) ); */ //---------------------------------------- `define GFSM_SELECT_TFU 2'b00 //Triangle Fetch `define GFSM_SELECT_TFF 2'b01 //Texture Fetch `define GFSM_SELECT_TNF 2'b10 //Tree node fetch `define GFSM_SELECT_NULL 2'b11 //------------------------------------------------ always @(posedge Clock or posedge Reset) begin if (Reset) CurrentState <= `GFSM_AFTER_RESET; else CurrentState <= NextState; end //------------------------------------------------ always @( * ) begin case (CurrentState) //------------------------------------------ `GFSM_AFTER_RESET: begin oNodeAddress <= 0; oRequest_AABBIU <= 0; oRequest_BIU <= 0; oTrigger_TFU <= 0; oTrigger_TNF <= 0; ClearTriangleCount <= 0; IncTriangleCount <= 0; oWBM_Addr_Selector <= `GFSM_SELECT_NULL; oSync <= 0; oDone <= 0; oSetTFUAddressOffset <= 0; oRequest_TCC <= 0; IncTextureCoordRegrAddr <= 0; oSetIOWriteBackAddr <= 0; //oRAMTextureStoreLocation <= `DATA_ADDRESS_WIDTH'd0; NextState <= `GFSM_INITIAL_STATE; end //------------------------------------------ /* Here two things ca happen: 1) We are onGeometry Fetch Mode (iTrigger_TFF == 0) then get the first node in the Octant Tree, or, 2)We are on Texture Fetch Mode (iTrigger_TFF == 1) then do texture fetch stuff... */ `GFSM_INITIAL_STATE: begin oNodeAddress <= 0; oRequest_AABBIU <= 0; oRequest_BIU <= 0; oTrigger_TFU <= 0; oTrigger_TNF <= 0; ClearTriangleCount <= 1; //* IncTriangleCount <= 0; oWBM_Addr_Selector <= `GFSM_SELECT_NULL; oSync <= 0; oDone <= 0; oSetTFUAddressOffset <= 0; oRequest_TCC <= 0; IncTextureCoordRegrAddr <= 0; oSetIOWriteBackAddr <= 0; //oRAMTextureStoreLocation <= `DATA_ADDRESS_WIDTH'd0; if ( iEnable && !iTrigger_TFF ) NextState <= `GFSM_TRIGGER_ROOT_NODE_FETCH; else if (iEnable && iTrigger_TFF) NextState <= `GFSM_SET_WBM_INITIAL_ADDRESS; else NextState <= `GFSM_INITIAL_STATE; end //------------------------------------------ `GFSM_SET_WBM_INITIAL_ADDRESS: begin oNodeAddress <= 0; oRequest_AABBIU <= 0; oRequest_BIU <= 0; oTrigger_TFU <= 0; oTrigger_TNF <= 0; ClearTriangleCount <= 0; IncTriangleCount <= 0; oWBM_Addr_Selector <= `GFSM_SELECT_TFF; oSync <= 0; oDone <= 0; oSetTFUAddressOffset <= 0; oRequest_TCC <= 0; oEnable_WBM <= 0; oSetAddressWBM <= 1; //* oSetIOWriteBackAddr <= 1; //Make sure we set write back address IncTextureCount <= 0; IncTextureCoordRegrAddr <= 0; NextState <= `GFSM_REQUEST_TEXTURE; end //------------------------------------ `GFSM_REQUEST_TEXTURE: begin oNodeAddress <= 0; oRequest_AABBIU <= 0; oRequest_BIU <= 0; oTrigger_TFU <= 0; oTrigger_TNF <= 0; ClearTriangleCount <= 0; IncTriangleCount <= 0; oWBM_Addr_Selector <= `GFSM_SELECT_TFF; oSync <= 0; oDone <= 0; oSetTFUAddressOffset <= 0; oRequest_TCC <= 0; //$display("GFSM_REQUEST_TEXTURE: Texture Addr in Reg: %d",oAddressWBM); oEnable_WBM <= 1; //* oSetAddressWBM <= 0; IncTextureCount <= 0; //* IncTextureCoordRegrAddr <= 0; oSetIOWriteBackAddr <= 0; NextState <= `GFSM_WAIT_FOR_TEXTURE; end //------------------------------------ `GFSM_WAIT_FOR_TEXTURE: begin oNodeAddress <= 0; oRequest_AABBIU <= 0; oRequest_BIU <= 0; oTrigger_TFU <= 0; oTrigger_TNF <= 0; ClearTriangleCount <= 0; IncTriangleCount <= 0; oWBM_Addr_Selector <= `GFSM_SELECT_TFF; oSync <= 0; oDone <= 0; oSetTFUAddressOffset <= 0; oRequest_TCC <= 0; oEnable_WBM <= 1; oSetAddressWBM <= 0; //IncTextureWriteAddress <= 0; IncTextureCount <= 0; IncTextureCoordRegrAddr <= 0; oSetIOWriteBackAddr <= 0; //oRAMTextureStoreLocation <= `CREG_TEX_COLOR1; if ( iDataAvailable ) NextState <= `GFSM_INC_TEXTURE_ADDRESS; else NextState <= `GFSM_WAIT_FOR_TEXTURE; end //------------------------------------ `GFSM_INC_TEXTURE_ADDRESS: begin //$display("***** GFSM_REQUEST_NEXT_TEXTURE: Texture Addr in Reg: %d",oAddressWBM); oNodeAddress <= 0; oRequest_AABBIU <= 0; oRequest_BIU <= 0; oTrigger_TFU <= 0; oTrigger_TNF <= 0; ClearTriangleCount <= 0; IncTriangleCount <= 0; oWBM_Addr_Selector <= `GFSM_SELECT_TFF; oSync <= 0; oDone <= 0; oSetTFUAddressOffset <= 0; oRequest_TCC <= 0; oEnable_WBM <= 0; oSetAddressWBM <= 0; IncTextureCount <= 1; //IncTextureWriteAddress <= 0;//1; IncTextureCoordRegrAddr <= 1; //* oSetIOWriteBackAddr <= 0; //oRAMTextureStoreLocation <= `CREG_TEX_COLOR4; NextState <= `GFSM_SET_NEXT_TEXTURE_ADDR; end //------------------------------------ `GFSM_SET_NEXT_TEXTURE_ADDR: begin //$display("***** GFSM_REQUEST_NEXT_TEXTURE: Texture Addr in Reg: %d",oAddressWBM); oNodeAddress <= 0; oRequest_AABBIU <= 0; oRequest_BIU <= 0; oTrigger_TFU <= 0; oTrigger_TNF <= 0; ClearTriangleCount <= 0; IncTriangleCount <= 0; oWBM_Addr_Selector <= `GFSM_SELECT_TFF; oSync <= 0; oDone <= 0; oSetTFUAddressOffset <= 0; oRequest_TCC <= 0; oEnable_WBM <= 0; //* oSetAddressWBM <= 1; IncTextureCount <= 0; //* IncTextureCoordRegrAddr <= 0; oSetIOWriteBackAddr <= 0; //oRAMTextureStoreLocation <= `CREG_TEX_COLOR4; NextState <= `GFSM_REQUEST_NEXT_TEXTURE; end //------------------------------------ /* We request 6 textures (ie. six colors from the texture coordinates, it should be actually 4 instead of 6, but the hardwardware works better with numbers that are power of 3. But read 3 at a time, so when TextureCount Reaches 2 then we are done */ `GFSM_REQUEST_NEXT_TEXTURE: begin //$display("***** GFSM_REQUEST_NEXT_TEXTURE: Texture Addr in Reg: %d",oAddressWBM); oNodeAddress <= 0; oRequest_AABBIU <= 0; oRequest_BIU <= 0; oTrigger_TFU <= 0; oTrigger_TNF <= 0; ClearTriangleCount <= 0; IncTriangleCount <= 0; oWBM_Addr_Selector <= `GFSM_SELECT_TFF; oSync <= 0; oDone <= 0; oSetTFUAddressOffset <= 0; oRequest_TCC <= 0; oEnable_WBM <= 1; //* oSetAddressWBM <= 0; IncTextureCount <= 1; //* IncTextureCoordRegrAddr <= 0; oSetIOWriteBackAddr <= 0; //oRAMTextureStoreLocation <= `CREG_TEX_COLOR4; NextState <= `GFSM_WAIT_FOR_NEXT_TEXTURE; end //---------------------------------------- `GFSM_WAIT_FOR_NEXT_TEXTURE: begin oNodeAddress <= 0; oRequest_AABBIU <= 0; oRequest_BIU <= 0; oTrigger_TFU <= 0; oTrigger_TNF <= 0; ClearTriangleCount <= 0; IncTriangleCount <= 0; oWBM_Addr_Selector <= `GFSM_SELECT_TFF; oSync <= 0; oDone <= 0; oSetTFUAddressOffset <= 0; oRequest_TCC <= 0; oEnable_WBM <= 1; oSetAddressWBM <= 0; IncTextureCount <= 0; //* IncTextureCoordRegrAddr <= 0; oSetIOWriteBackAddr <= 0; //oRAMTextureStoreLocation <= `CREG_TEX_COLOR4; if ( iDataAvailable ) NextState <= `GFSM_DONE; else NextState <= `GFSM_WAIT_FOR_NEXT_TEXTURE; end /****************************************/ /* Texture Fetch Logic Ends Here. Geometry Fetch Logic Starts Here (Duh!) */ //------------------------------------ /* Lets request the Root Node read in here. The tree node function will fetch info such as the type of node, the address of the first data block as well as the boundaries of the AABB. */ `GFSM_TRIGGER_ROOT_NODE_FETCH: begin `ifdef DEBUG_GFSM if (iDebug_CoreID == `DEBUG_CORE) $display("CORE %d GFSM_TRIGGER_ROOT_NODE_FETCH",iDebug_CoreID); `endif oNodeAddress <= 0; //Address of root node is always zero oRequest_AABBIU <= 0; oRequest_BIU <= 0; oTrigger_TFU <= 0; oTrigger_TNF <= 1; //* ClearTriangleCount <= 0; IncTriangleCount <= 0; oWBM_Addr_Selector <= `GFSM_SELECT_TNF; oSync <= 0; oDone <= 0; oSetTFUAddressOffset <= 0; oRequest_TCC <= 0; oEnable_WBM <= 0; oSetAddressWBM <= 0; //IncTextureWriteAddress <= 0; IncTextureCount <= 0; IncTextureCoordRegrAddr <= 0; oSetIOWriteBackAddr <= 0; //oRAMTextureStoreLocation <= `DATA_ADDRESS_WIDTH'd0; NextState <= `GFSM_WAIT_FOR_ROOT_NODE_FETCH; end //------------------------------------------ /* OK once we have the data the first ting is to test if the ray hits the AABB. */ `GFSM_WAIT_FOR_ROOT_NODE_FETCH: begin oNodeAddress <= 0; oRequest_AABBIU <= 0; oRequest_BIU <= 0; oTrigger_TFU <= 0; oTrigger_TNF <= 0;//* ClearTriangleCount <= 0; IncTriangleCount <= 0; oWBM_Addr_Selector <= `GFSM_SELECT_TNF; oSync <= 0; oDone <= 0; oSetTFUAddressOffset <= 0; oRequest_TCC <= 0; oEnable_WBM <= 0; oSetAddressWBM <= 0; //IncTextureWriteAddress <= 0; IncTextureCount <= 0; IncTextureCoordRegrAddr <= 0; oSetIOWriteBackAddr <= 0; //oRAMTextureStoreLocation <= `DATA_ADDRESS_WIDTH'd0; if (iNodeReadDone) NextState <= `GFSM_TRIGGER_AABBIU; else NextState <= `GFSM_WAIT_FOR_ROOT_NODE_FETCH; end //------------------------------------------ /* So, while we request AABBIU, we should be requesting the info for the Next triangle as well... */ `GFSM_TRIGGER_AABBIU: begin oNodeAddress <= 0; oRequest_AABBIU <= 1; //* oRequest_BIU <= 0; oTrigger_TFU <= 0; //WIP!!!!!!!! oTrigger_TNF <= 0; ClearTriangleCount <= 0; IncTriangleCount <= 0; oWBM_Addr_Selector <= `GFSM_SELECT_NULL; oSync <= 1; //* oDone <= 0; oSetTFUAddressOffset <= 0; oRequest_TCC <= 0; oEnable_WBM <= 0; oSetAddressWBM <= 0; //IncTextureWriteAddress <= 0; IncTextureCount <= 0; IncTextureCoordRegrAddr <= 0; oSetIOWriteBackAddr <= 0; //oRAMTextureStoreLocation <= `DATA_ADDRESS_WIDTH'd0; NextState <= `GFSM_WAIT_FOR_AABBIU; end //------------------------------------------ `GFSM_WAIT_FOR_AABBIU: begin oNodeAddress <= 0; oRequest_AABBIU <= 1; oRequest_BIU <= 0; oTrigger_TFU <= 0; oTrigger_TNF <= 0; ClearTriangleCount <= 0; IncTriangleCount <= 0; oWBM_Addr_Selector <= `GFSM_SELECT_NULL; oSync <= 0; oDone <= 0; oSetTFUAddressOffset <= 0; oRequest_TCC <= 0; oEnable_WBM <= 0; oSetAddressWBM <= 0; //IncTextureWriteAddress <= 0; IncTextureCount <= 0; IncTextureCoordRegrAddr <= 0; oSetIOWriteBackAddr <= 0; //oRAMTextureStoreLocation <= `DATA_ADDRESS_WIDTH'd0; if ( iUCodeDone ) NextState <= `GFSM_ACK_AABBIU; else NextState <= `GFSM_WAIT_FOR_AABBIU; end //------------------------------------------ `GFSM_ACK_AABBIU: begin oNodeAddress <= 0; oRequest_AABBIU <= 0; //* oRequest_BIU <= 0; oTrigger_TFU <= 0; oTrigger_TNF <= 0; ClearTriangleCount <= 0; IncTriangleCount <= 0; oWBM_Addr_Selector <= `GFSM_SELECT_NULL; oSync <= 0; oDone <= 0; oSetTFUAddressOffset <= 0; oRequest_TCC <= 0; oEnable_WBM <= 0; oSetAddressWBM <= 0; //IncTextureWriteAddress <= 0; IncTextureCount <= 0; IncTextureCoordRegrAddr <= 0; oSetIOWriteBackAddr <= 0; //oRAMTextureStoreLocation <= `DATA_ADDRESS_WIDTH'd0; if ( iAABBIUHit ) NextState <= `GFSM_AABBIU_HIT; else NextState <= `GFSM_AABBIU_NO_HIT; end //------------------------------------------ `GFSM_AABBIU_NO_HIT: begin oNodeAddress <= 0; oRequest_AABBIU <= 0; //* oRequest_BIU <= 0; oTrigger_TFU <= 0; oTrigger_TNF <= 0; ClearTriangleCount <= 0; IncTriangleCount <= 0; oWBM_Addr_Selector <= `GFSM_SELECT_NULL; oSync <= 0; oDone <= 0; oSetTFUAddressOffset <= 0; oRequest_TCC <= 0; oEnable_WBM <= 0; oSetAddressWBM <= 0; //IncTextureWriteAddress <= 0; IncTextureCount <= 0; IncTextureCoordRegrAddr <= 0; oSetIOWriteBackAddr <= 0; //oRAMTextureStoreLocation <= `DATA_ADDRESS_WIDTH'd0; NextState <= `GFSM_DONE; end //------------------------------------------ /* Ok there is a hit, two things can happen: if the Node is not a leaf, then the child nodes need to be tested. Else this node's data linked list needs to be tested for instersections. Since we have a new Node, lets start by reading the first 3 blocks of data. The first block is pointed by 'Node_OffsetData_Address'. */ `GFSM_AABBIU_HIT: begin oNodeAddress <= 0; oRequest_AABBIU <= 0; oRequest_BIU <= 0; oTrigger_TFU <= 0; oTrigger_TNF <= 0; ClearTriangleCount <= 0; IncTriangleCount <= 0; oWBM_Addr_Selector <= `GFSM_SELECT_NULL; oSync <= 0; oDone <= 0; oSetTFUAddressOffset <= 0; oRequest_TCC <= 0; oEnable_WBM <= 0; oSetAddressWBM <= 0; //IncTextureWriteAddress <= 0; IncTextureCount <= 0; IncTextureCoordRegrAddr <= 0; oSetIOWriteBackAddr <= 0; //oRAMTextureStoreLocation <= `DATA_ADDRESS_WIDTH'd0; if ( iNode_IsLeaf ) NextState <= `GFSM_SET_TRIANGLE_LIST_INITIAL_OFFSET; else NextState <= `GFSM_GET_FIRST_CHILD; end //------------------------------------------ `GFSM_SET_TRIANGLE_LIST_INITIAL_OFFSET: begin oNodeAddress <= 0; oRequest_AABBIU <= 0; oRequest_BIU <= 0; oTrigger_TFU <= 0; oTrigger_TNF <= 0; ClearTriangleCount <= 0; IncTriangleCount <= 0; oWBM_Addr_Selector <= `GFSM_SELECT_NULL; oSync <= 0; oDone <= 0; oSetTFUAddressOffset <= 1; //* oRequest_TCC <= 0; oEnable_WBM <= 0; oSetAddressWBM <= 0; //IncTextureWriteAddress <= 0; IncTextureCount <= 0; IncTextureCoordRegrAddr <= 0; oSetIOWriteBackAddr <= 0; //oRAMTextureStoreLocation <= `DATA_ADDRESS_WIDTH'd0; NextState <= `GFSM_TRIGGER_TRIANGLE_FETCH; end //------------------------------------------ /* Since this node is not a leaf, we keep depth first deep traversing the hierchy */ `GFSM_GET_FIRST_CHILD: begin oRequest_AABBIU <= 0; oNodeAddress <= iNode_FirstChild_Address; //* oRequest_BIU <= 0; oTrigger_TFU <= 0; oTrigger_TNF <= 0; oWBM_Addr_Selector <= `GFSM_SELECT_NULL; ClearTriangleCount <= 0; IncTriangleCount <= 0; oSync <= 0; oDone <= 0; oSetTFUAddressOffset <= 0; oRequest_TCC <= 0; oEnable_WBM <= 0; oSetAddressWBM <= 0; //IncTextureWriteAddress <= 0; IncTextureCount <= 0; IncTextureCoordRegrAddr <= 0; oSetIOWriteBackAddr <= 0; //oRAMTextureStoreLocation <= `DATA_ADDRESS_WIDTH'd0; NextState <= `GFSM_TRIGGER_NODE_FETCH; end //------------------------------------------ /* */ `GFSM_CHECK_TRIANGLE_COUNT: begin oNodeAddress <= 0; oRequest_AABBIU <= 0; oRequest_BIU <= 0; oTrigger_TFU <= 0; oTrigger_TNF <= 0; ClearTriangleCount <= 0; IncTriangleCount <= 0; oWBM_Addr_Selector <= `GFSM_SELECT_NULL; oSync <= 0; oDone <= 0; oSetTFUAddressOffset <= 0; oRequest_TCC <= 0; oEnable_WBM <= 0; oSetAddressWBM <= 0; //IncTextureWriteAddress <= 0; IncTextureCount <= 0; IncTextureCoordRegrAddr <= 0; oSetIOWriteBackAddr <= 0; //oRAMTextureStoreLocation <= `DATA_ADDRESS_WIDTH'd0; if ( wTriangleCount == iNode_TriangleCount ) NextState <= `GFSM_CHECK_NEXT_BROTHER; else NextState <= //`GFSM_TRIGGER_TRIANGLE_FETCH; `GFSM_TRIGGER_BIU_REQUSET; //NEW NEW PARALLEL IO end //------------------------------------------ `GFSM_TRIGGER_TRIANGLE_FETCH: begin oNodeAddress <= 0; oRequest_AABBIU <= 0; oRequest_BIU <= 0; oTrigger_TFU <= 1; //* oTrigger_TNF <= 0; ClearTriangleCount <= 0; IncTriangleCount <= 0; oWBM_Addr_Selector <= `GFSM_SELECT_TFU; oSync <= 0; oDone <= 0; oSetTFUAddressOffset <= 0; oRequest_TCC <= 0; oEnable_WBM <= 0; oSetAddressWBM <= 0; //IncTextureWriteAddress <= 0; IncTextureCount <= 0; IncTextureCoordRegrAddr <= 0; oSetIOWriteBackAddr <= 0; //oRAMTextureStoreLocation <= `DATA_ADDRESS_WIDTH'd0; NextState <= `GFSM_WAIT_FOR_TRIANGLE_FETCH; end //------------------------------------------ /* iEnable the data fetch and wait for the operation to complete. */ `GFSM_WAIT_FOR_TRIANGLE_FETCH: begin oNodeAddress <= 0; oRequest_AABBIU <= 0; oRequest_BIU <= 0; oTrigger_TFU <= 0; //* oTrigger_TNF <= 0; ClearTriangleCount <= 0; IncTriangleCount <= 0; oWBM_Addr_Selector <= `GFSM_SELECT_TFU; oSync <= 0; oDone <= 0; oSetTFUAddressOffset <= 0; oRequest_TCC <= 0; oEnable_WBM <= 0; oSetAddressWBM <= 0; //IncTextureWriteAddress <= 0; IncTextureCount <= 0; IncTextureCoordRegrAddr <= 0; oSetIOWriteBackAddr <= 0; //oRAMTextureStoreLocation <= `DATA_ADDRESS_WIDTH'd0; if ( iTriangleReadDone ) NextState <= `GFSM_TRIGGER_BIU_REQUSET; else NextState <= `GFSM_WAIT_FOR_TRIANGLE_FETCH; end //------------------------------------------ /* Now that we got the traingle vertices in RAM, lets iEnable the BIU micro-code sub. */ `GFSM_TRIGGER_BIU_REQUSET: begin oRequest_AABBIU <= 0; oNodeAddress <= 0; oRequest_BIU <= 1; //* oTrigger_TFU <= //0; 1; ///NEW NEW NEW Jan 25 2010, try to put this to 1 oTrigger_TNF <= 0; IncTriangleCount <= 1; //* ClearTriangleCount <= 0; oWBM_Addr_Selector <= //`GFSM_SELECT_NULL; `GFSM_SELECT_TFU; //NEW NEW Paralell IO oSync <= 1;//* oDone <= 0; oSetTFUAddressOffset <= 0; oRequest_TCC <= 0; oEnable_WBM <= 0; oSetAddressWBM <= 0; //IncTextureWriteAddress <= 0; IncTextureCount <= 0; IncTextureCoordRegrAddr <= 0; oSetIOWriteBackAddr <= 0; //oRAMTextureStoreLocation <= `DATA_ADDRESS_WIDTH'd0; NextState <= `GFSM_WAIT_FOR_BIU; end //------------------------------------------ /* Once BIU finishes see have a hit. There are severals paths to go here depnending on wethher there was a Hit or Not, and also depending on whether we the texturing capability enabled. 1) If there was a Hit, but the textures are not enabled, then keep interating the triangle list. 2) If there was a Hit and the texturing is enabled, then go to the state that request the texture coordiantes calculation 3) If there was not a Hit, then keep traversong the triangle list. 4) If there is neither Hit or no-Hit yet, then keep waiting is this state. */ `GFSM_WAIT_FOR_BIU: begin oRequest_AABBIU <= 0; oNodeAddress <= 0; oRequest_BIU <= 1; //* oTrigger_TFU <= 0; oTrigger_TNF <= 0; IncTriangleCount <= 0; //* oWBM_Addr_Selector <= //`GFSM_SELECT_NULL; `GFSM_SELECT_TFU; //NEW NEW Paralell IO ClearTriangleCount <= 0; oSync <= 0; oDone <= 0; oSetTFUAddressOffset <= 0; oRequest_TCC <= 0; oEnable_WBM <= 0; oSetAddressWBM <= 0; //IncTextureWriteAddress <= 0; IncTextureCount <= 0; IncTextureCoordRegrAddr <= 0; oSetIOWriteBackAddr <= 0; //oRAMTextureStoreLocation <= `DATA_ADDRESS_WIDTH'd0; /* if (iUCodeDone & iBIUHit & ~iTriangleReadDone & iTexturingEnable) NextState <= `GFSM_WAIT_FOR_IO_HIT; else if (iUCodeDone & ~iBIUHit & ~iTriangleReadDone & iTexturingEnable) NextState <= `GFSM_WAIT_FOR_IO_NO_HIT; else NextState <= `GFSM_WAIT_FOR_BIU; */ if (iUCodeDone && iBIUHit && !iTexturingEnable && !iIOBusy)//Change IOBusy for TFUDone!!! NextState <= `GFSM_CHECK_TRIANGLE_COUNT; else if (iUCodeDone && iBIUHit && iTexturingEnable && !iIOBusy) NextState <= `GFSM_WAIT_STATE_PRE_TCC; else if (iUCodeDone && iBIUHit && iTexturingEnable && iIOBusy) NextState <= `GFSM_WAIT_FOR_IO_HIT; else if (iUCodeDone && !iBIUHit && !iIOBusy) NextState <= `GFSM_CHECK_TRIANGLE_COUNT; else if (iUCodeDone && !iBIUHit && iIOBusy) NextState <= `GFSM_WAIT_FOR_IO_NO_HIT; else NextState <= `GFSM_WAIT_FOR_BIU; end //------------------------------------------ `GFSM_WAIT_FOR_IO_HIT: begin oRequest_AABBIU <= 0; oNodeAddress <= 0; oRequest_BIU <= 1; //* oTrigger_TFU <= 0; oTrigger_TNF <= 0; IncTriangleCount <= 0; //* oWBM_Addr_Selector <= `GFSM_SELECT_TFU; ClearTriangleCount <= 0; oSync <= 0; oDone <= 0; oSetTFUAddressOffset <= 0; oRequest_TCC <= 0; oEnable_WBM <= 0; oSetAddressWBM <= 0; IncTextureCount <= 0; IncTextureCoordRegrAddr <= 0; oSetIOWriteBackAddr <= 0; if (iTriangleReadDone ) NextState <= `GFSM_WAIT_STATE_PRE_TCC; else NextState <= `GFSM_WAIT_FOR_IO_HIT; end //------------------------------------------ `GFSM_WAIT_FOR_IO_NO_HIT: begin oRequest_AABBIU <= 0; oNodeAddress <= 0; oRequest_BIU <= 1; //* oTrigger_TFU <= 0; oTrigger_TNF <= 0; IncTriangleCount <= 0; //* oWBM_Addr_Selector <= `GFSM_SELECT_TFU; ClearTriangleCount <= 0; oSync <= 0; oDone <= 0; oSetTFUAddressOffset <= 0; oRequest_TCC <= 0; oEnable_WBM <= 0; oSetAddressWBM <= 0; IncTextureCount <= 0; IncTextureCoordRegrAddr <= 0; oSetIOWriteBackAddr <= 0; if (iTriangleReadDone ) NextState <= `GFSM_CHECK_TRIANGLE_COUNT; else NextState <= `GFSM_WAIT_FOR_IO_NO_HIT; end //------------------------------------------ /* Need to wait a extra cycle so that control unit will be able to get into the wait from geo sync state...it sucks I know... */ `GFSM_WAIT_STATE_PRE_TCC: begin oRequest_AABBIU <= 0; oNodeAddress <= 0; oRequest_BIU <= 1; //* oTrigger_TFU <= 0; oTrigger_TNF <= 0; IncTriangleCount <= 0; //* oWBM_Addr_Selector <= `GFSM_SELECT_NULL; ClearTriangleCount <= 0; oSync <= 0; oDone <= 0; oSetTFUAddressOffset <= 0; oRequest_TCC <= 0; oEnable_WBM <= 0; oSetAddressWBM <= 0; //IncTextureWriteAddress <= 0; IncTextureCount <= 0; IncTextureCoordRegrAddr <= 0; oSetIOWriteBackAddr <= 0; //oRAMTextureStoreLocation <= `DATA_ADDRESS_WIDTH'd0; NextState <= `GFSM_REQUEST_TCC; end //------------------------------------------ /* This state request CU to trigger TCC, ie the code that is responsible of generating the 4 memory addresses to get the texture coordinates: ie: OREG_TEX_COORD1 and OREG_TEX_COORD2, this coordinates are stored, and they replace the previous coordinates values only if the current traingle is closer to the camera. */ `GFSM_REQUEST_TCC: begin // $display("%d GFSM_REQUEST_TCC",$time); // $display("GFSM_REQUEST_TCC %d oRequest_TCC = %d",$time,oRequest_TCC); oRequest_AABBIU <= 0; oNodeAddress <= 0; oRequest_BIU <= 0; oTrigger_TFU <= 0; oTrigger_TNF <= 0; IncTriangleCount <= 0; oWBM_Addr_Selector <= `GFSM_SELECT_NULL; ClearTriangleCount <= 0; oSync <= 1; //* oDone <= 0; oSetTFUAddressOffset <= 0; oRequest_TCC <= 1; //* oEnable_WBM <= 0; oSetAddressWBM <= 0; //IncTextureWriteAddress <= 0; IncTextureCount <= 0; IncTextureCoordRegrAddr <= 0; oSetIOWriteBackAddr <= 0; //oRAMTextureStoreLocation <= `DATA_ADDRESS_WIDTH'd0; NextState <= `GFSM_WAIT_FOR_TCC; end //------------------------------------------ /* If the textures coordinates are calculted then move into the next triangle. */ `GFSM_WAIT_FOR_TCC: begin // $display("GFSM_WAIT_FOR_TCC %d oSync = %d",$time,oSync); // $display("GFSM_WAIT_FOR_TCC %d oRequest_TCC = %d",$time,oRequest_TCC); oRequest_AABBIU <= 0; oNodeAddress <= 0; oRequest_BIU <= 0; oTrigger_TFU <= 0; oTrigger_TNF <= 0; IncTriangleCount <= 0; oWBM_Addr_Selector <= `GFSM_SELECT_NULL; ClearTriangleCount <= 0; oSync <= 0; oDone <= 0; oSetTFUAddressOffset <= 0; oRequest_TCC <= 1; oEnable_WBM <= 0; oSetAddressWBM <= 0; //IncTextureWriteAddress <= 0; IncTextureCount <= 0; IncTextureCoordRegrAddr <= 0; oSetIOWriteBackAddr <= 0; //oRAMTextureStoreLocation <= `DATA_ADDRESS_WIDTH'd0; if (iUCodeDone) NextState <= `GFSM_CHECK_TRIANGLE_COUNT; else NextState <= `GFSM_WAIT_FOR_TCC; end //------------------------------------------ /* `GFM_TRIGGER_TEXTURE_FETCH: begin oRequest_AABBIU <= 0; oNodeAddress <= 0; oRequest_BIU <= 0; oTrigger_TFU <= 0; oTrigger_TNF <= 0; IncTriangleCount <= 0; oWBM_Addr_Selector <= 0; ClearTriangleCount <= 0; oSync <= 0; oDone <= 0; oSetTFUAddressOffset <= 0; oTrigger_TFF <= 1; NextState <= `GFSM_WAIT_FOR_TEXTURE_FETCH; end //------------------------------------------ `GFSM_WAIT_FOR_TEXTURE_FETCH: begin oRequest_AABBIU <= 0; oNodeAddress <= 0; oRequest_BIU <= 0; oTrigger_TFU <= 0; oTrigger_TNF <= 0; IncTriangleCount <= 0; oWBM_Addr_Selector <= 0; ClearTriangleCount <= 0; oSync <= 0; oDone <= 0; oSetTFUAddressOffset <= 0; oTrigger_TFF <= 0; if (iTextureReadDone == 1'b1) NextState <= `GFSM_CHECK_TRIANGLE_COUNT; else NextState <= `GFSM_WAIT_FOR_TEXTURE_FETCH; end */ //------------------------------------------ `GFSM_CHECK_NEXT_BROTHER: begin oRequest_AABBIU <= 0; oNodeAddress <= 0; oRequest_BIU <= 0; oTrigger_TFU <= 0; oTrigger_TNF <= 0; IncTriangleCount <= 0; //* oWBM_Addr_Selector <= `GFSM_SELECT_NULL; ClearTriangleCount <= 0; oSync <= 0; oDone <= 0; oSetTFUAddressOffset <= 0; oRequest_TCC <= 0; oEnable_WBM <= 0; oSetAddressWBM <= 0; //IncTextureWriteAddress <= 0; IncTextureCount <= 0; IncTextureCoordRegrAddr <= 0; oSetIOWriteBackAddr <= 0; //oRAMTextureStoreLocation <= `DATA_ADDRESS_WIDTH'd0; if ( iNode_Brother_Address == 0 ) NextState <= `GFSM_CHECK_PARENTS_BROTHER; else NextState <= `GFSM_GET_BROTHER; end //------------------------------------------ `GFSM_GET_BROTHER: begin oRequest_AABBIU <= 0; oNodeAddress <= iNode_Brother_Address; //* oRequest_BIU <= 0; oTrigger_TFU <= 0; oTrigger_TNF <= 0; IncTriangleCount <= 0; //* oWBM_Addr_Selector <= `GFSM_SELECT_NULL; ClearTriangleCount <= 0; oSync <= 0; oDone <= 0; oSetTFUAddressOffset <= 0; oRequest_TCC <= 0; oEnable_WBM <= 0; oSetAddressWBM <= 0; //IncTextureWriteAddress <= 0; IncTextureCount <= 0; IncTextureCoordRegrAddr <= 0; oSetIOWriteBackAddr <= 0; //oRAMTextureStoreLocation <= `DATA_ADDRESS_WIDTH'd0; NextState <= `GFSM_TRIGGER_NODE_FETCH; end //------------------------------------------ `GFSM_CHECK_PARENTS_BROTHER: begin oNodeAddress <= 0; oRequest_AABBIU <= 0; oRequest_BIU <= 0; oTrigger_TFU <= 0; oTrigger_TNF <= 0; IncTriangleCount <= 0; //* oWBM_Addr_Selector <= `GFSM_SELECT_NULL; ClearTriangleCount <= 0; oSync <= 0; oDone <= 0; oSetTFUAddressOffset <= 0; oRequest_TCC <= 0; oEnable_WBM <= 0; oSetAddressWBM <= 0; //IncTextureWriteAddress <= 0; IncTextureCount <= 0; IncTextureCoordRegrAddr <= 0; oSetIOWriteBackAddr <= 0; //oRAMTextureStoreLocation <= `DATA_ADDRESS_WIDTH'd0; if ( iNode_Parents_Brother_Address == 0) NextState <= `GFSM_DONE; else NextState <= `GFSM_GET_PARENTS_BROTHER; end //------------------------------------------ `GFSM_GET_PARENTS_BROTHER: begin oRequest_AABBIU <= 0; oNodeAddress <= iNode_Parents_Brother_Address; //* oRequest_BIU <= 0; oTrigger_TFU <= 0; oTrigger_TNF <= 0; IncTriangleCount <= 0; //* oWBM_Addr_Selector <= `GFSM_SELECT_NULL; ClearTriangleCount <= 0; oSync <= 0; oDone <= 0; oSetTFUAddressOffset <= 0; oRequest_TCC <= 0; oEnable_WBM <= 0; oSetAddressWBM <= 0; //IncTextureWriteAddress <= 0; IncTextureCount <= 0; IncTextureCoordRegrAddr <= 0; oSetIOWriteBackAddr <= 0; //oRAMTextureStoreLocation <= `DATA_ADDRESS_WIDTH'd0; NextState <= `GFSM_TRIGGER_NODE_FETCH; end //------------------------------------------ `GFSM_TRIGGER_NODE_FETCH: begin oRequest_AABBIU <= 0; oNodeAddress <= iNode_Brother_Address; oRequest_BIU <= 0; oTrigger_TFU <= 1; //* oTrigger_TNF <= 0; oWBM_Addr_Selector <= `GFSM_SELECT_NULL; IncTriangleCount <= 0; //* ClearTriangleCount <= 0; oSync <= 0; oDone <= 0; oSetTFUAddressOffset <= 0; oRequest_TCC <= 0; oEnable_WBM <= 0; oSetAddressWBM <= 0; //IncTextureWriteAddress <= 0; IncTextureCount <= 0; IncTextureCoordRegrAddr <= 0; oSetIOWriteBackAddr <= 0; //oRAMTextureStoreLocation <= `DATA_ADDRESS_WIDTH'd0; NextState <= `GFSM_WAIT_FOR_NODE_FETCH; end //------------------------------------------ /* Lets read the new node in our linked list. Once we got it we need to check AABB intersect, fetch traingles, etc, etc. */ `GFSM_WAIT_FOR_NODE_FETCH: begin oRequest_AABBIU <= 0; oNodeAddress <= iNode_Brother_Address; oRequest_BIU <= 0; oTrigger_TFU <= 1; oTrigger_TNF <= 0; oWBM_Addr_Selector <= `GFSM_SELECT_TFU; IncTriangleCount <= 0; //* ClearTriangleCount <= 0; oSync <= 0; oDone <= 0; oSetTFUAddressOffset <= 0; oRequest_TCC <= 0; oEnable_WBM <= 0; oSetAddressWBM <= 0; //IncTextureWriteAddress <= 0; IncTextureCount <= 0; IncTextureCoordRegrAddr <= 0; oSetIOWriteBackAddr <= 0; //oRAMTextureStoreLocation <= `DATA_ADDRESS_WIDTH'd0; if (iNodeReadDone) NextState <= `GFSM_TRIGGER_AABBIU; else NextState <= `GFSM_WAIT_FOR_NODE_FETCH; end //------------------------------------------ `GFSM_DONE: begin `ifdef DEBUG2 $display(" **** GFSM_DONE ***"); `endif oNodeAddress <= 0; oRequest_AABBIU <= 0; oRequest_BIU <= 0; oTrigger_TFU <= 0; oTrigger_TNF <= 0; IncTriangleCount <= 0; //* oWBM_Addr_Selector <= `GFSM_SELECT_NULL; ClearTriangleCount <= 0; oSync <= 1; //* oDone <= 1; //* oSetTFUAddressOffset <= 0; oRequest_TCC <= 0; oEnable_WBM <= 0; oSetAddressWBM <= 0; //IncTextureWriteAddress <= 0; IncTextureCount <= 0; IncTextureCoordRegrAddr <= 0; oSetIOWriteBackAddr <= 0; //oRAMTextureStoreLocation <= `DATA_ADDRESS_WIDTH'd0; if (iEnable == 0 ) NextState <= `GFSM_INITIAL_STATE; else NextState <= `GFSM_DONE; end //------------------------------------------ default: begin oRequest_AABBIU <= 0; oNodeAddress <= 0; oRequest_BIU <= 0; oTrigger_TFU <= 0; oTrigger_TNF <= 0; oWBM_Addr_Selector <= `GFSM_SELECT_NULL; IncTriangleCount <= 0; //* oWBM_Addr_Selector <= 0; ClearTriangleCount <= 0; oSync <= 0; oDone <= 0; oSetTFUAddressOffset <= 0; oRequest_TCC <= 0; oEnable_WBM <= 0; oSetAddressWBM <= 0; //IncTextureWriteAddress <= 0; IncTextureCount <= 0; IncTextureCoordRegrAddr <= 0; oSetIOWriteBackAddr <= 0; //oRAMTextureStoreLocation <= `DATA_ADDRESS_WIDTH'd0; NextState <= `GFSM_AFTER_RESET; end endcase end //------------------------------------------------ endmodule
Go to most recent revision | Compare with Previous | Blame | View Log