//=======================================================================
|
//=======================================================================
|
// Project Monophony
|
// Project Monophony
|
// Wire-Frame 3D Graphics Accelerator IP Core
|
// Wire-Frame 3D Graphics Accelerator IP Core
|
//
|
//
|
// File:
|
// File:
|
// fm_geo.v
|
// fm_geo.v
|
//
|
//
|
// Abstract:
|
// Abstract:
|
// Geometry Engine top module
|
// Geometry Engine top module
|
//
|
//
|
// Author:
|
// Author:
|
// Kenji Ishimaru (info.wf3d@gmail.com)
|
// Kenji Ishimaru (info.info.wf3d@gmail.com)
|
//
|
//
|
//======================================================================
|
//======================================================================
|
//
|
//
|
// Copyright (c) 2015, Kenji Ishimaru
|
// Copyright (c) 2015, Kenji Ishimaru
|
// All rights reserved.
|
// All rights reserved.
|
//
|
//
|
// Redistribution and use in source and binary forms, with or without
|
// Redistribution and use in source and binary forms, with or without
|
// modification, are permitted provided that the following conditions are met:
|
// modification, are permitted provided that the following conditions are met:
|
//
|
//
|
// -Redistributions of source code must retain the above copyright notice,
|
// -Redistributions of source code must retain the above copyright notice,
|
// this list of conditions and the following disclaimer.
|
// this list of conditions and the following disclaimer.
|
// -Redistributions in binary form must reproduce the above copyright notice,
|
// -Redistributions in binary form must reproduce the above copyright notice,
|
// this list of conditions and the following disclaimer in the documentation
|
// this list of conditions and the following disclaimer in the documentation
|
// and/or other materials provided with the distribution.
|
// and/or other materials provided with the distribution.
|
//
|
//
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
//
|
//
|
// Revision History
|
// Revision History
|
|
|
`include "fm_3d_define.v"
|
`include "fm_3d_define.v"
|
module fm_geo (
|
module fm_geo (
|
// system
|
// system
|
input clk_core,
|
input clk_core,
|
input rst_x,
|
input rst_x,
|
output o_debug,
|
output o_debug,
|
// Vertex Fetch Memory I/F (Read Only)
|
// Vertex Fetch Memory I/F (Read Only)
|
(* mark_debug = "true" *) output o_req_m,
|
(* mark_debug = "true" *) output o_req_m,
|
(* mark_debug = "true" *) output [31:0] o_adrs_m,
|
(* mark_debug = "true" *) output [31:0] o_adrs_m,
|
(* mark_debug = "true" *) output [2:0] o_len_m,
|
(* mark_debug = "true" *) output [2:0] o_len_m,
|
(* mark_debug = "true" *) input i_ack_m,
|
(* mark_debug = "true" *) input i_ack_m,
|
(* mark_debug = "true" *) input i_strr_m,
|
(* mark_debug = "true" *) input i_strr_m,
|
(* mark_debug = "true" *) input [31:0] i_dbr_m,
|
(* mark_debug = "true" *) input [31:0] i_dbr_m,
|
// Register Configuration
|
// Register Configuration
|
// vertex fetch
|
// vertex fetch
|
input i_dma_start,
|
input i_dma_start,
|
input [29:0] i_dma_top_address,
|
input [29:0] i_dma_top_address,
|
input [15:0] i_dma_size,
|
input [15:0] i_dma_size,
|
output o_state,
|
output o_state,
|
// matrix elements
|
// matrix elements
|
`ifdef D3D_USE_MATRIX_PALETTE
|
`ifdef D3D_USE_MATRIX_PALETTE
|
input [1:0] i_num_mats,
|
input [1:0] i_num_mats,
|
input [22*`D3D_NUM_OF_MATS-1:0] i_m00,
|
input [22*`D3D_NUM_OF_MATS-1:0] i_m00,
|
input [22*`D3D_NUM_OF_MATS-1:0] i_m01,
|
input [22*`D3D_NUM_OF_MATS-1:0] i_m01,
|
input [22*`D3D_NUM_OF_MATS-1:0] i_m02,
|
input [22*`D3D_NUM_OF_MATS-1:0] i_m02,
|
input [22*`D3D_NUM_OF_MATS-1:0] i_m03,
|
input [22*`D3D_NUM_OF_MATS-1:0] i_m03,
|
input [22*`D3D_NUM_OF_MATS-1:0] i_m10,
|
input [22*`D3D_NUM_OF_MATS-1:0] i_m10,
|
input [22*`D3D_NUM_OF_MATS-1:0] i_m11,
|
input [22*`D3D_NUM_OF_MATS-1:0] i_m11,
|
input [22*`D3D_NUM_OF_MATS-1:0] i_m12,
|
input [22*`D3D_NUM_OF_MATS-1:0] i_m12,
|
input [22*`D3D_NUM_OF_MATS-1:0] i_m13,
|
input [22*`D3D_NUM_OF_MATS-1:0] i_m13,
|
input [22*`D3D_NUM_OF_MATS-1:0] i_m20,
|
input [22*`D3D_NUM_OF_MATS-1:0] i_m20,
|
input [22*`D3D_NUM_OF_MATS-1:0] i_m21,
|
input [22*`D3D_NUM_OF_MATS-1:0] i_m21,
|
input [22*`D3D_NUM_OF_MATS-1:0] i_m22,
|
input [22*`D3D_NUM_OF_MATS-1:0] i_m22,
|
input [22*`D3D_NUM_OF_MATS-1:0] i_m23,
|
input [22*`D3D_NUM_OF_MATS-1:0] i_m23,
|
input [22*`D3D_NUM_OF_MATS-1:0] i_m30,
|
input [22*`D3D_NUM_OF_MATS-1:0] i_m30,
|
input [22*`D3D_NUM_OF_MATS-1:0] i_m31,
|
input [22*`D3D_NUM_OF_MATS-1:0] i_m31,
|
input [22*`D3D_NUM_OF_MATS-1:0] i_m32,
|
input [22*`D3D_NUM_OF_MATS-1:0] i_m32,
|
input [22*`D3D_NUM_OF_MATS-1:0] i_m33,
|
input [22*`D3D_NUM_OF_MATS-1:0] i_m33,
|
`else
|
`else
|
input [21:0] i_m00,
|
input [21:0] i_m00,
|
input [21:0] i_m01,
|
input [21:0] i_m01,
|
input [21:0] i_m02,
|
input [21:0] i_m02,
|
input [21:0] i_m03,
|
input [21:0] i_m03,
|
input [21:0] i_m10,
|
input [21:0] i_m10,
|
input [21:0] i_m11,
|
input [21:0] i_m11,
|
input [21:0] i_m12,
|
input [21:0] i_m12,
|
input [21:0] i_m13,
|
input [21:0] i_m13,
|
input [21:0] i_m20,
|
input [21:0] i_m20,
|
input [21:0] i_m21,
|
input [21:0] i_m21,
|
input [21:0] i_m22,
|
input [21:0] i_m22,
|
input [21:0] i_m23,
|
input [21:0] i_m23,
|
input [21:0] i_m30,
|
input [21:0] i_m30,
|
input [21:0] i_m31,
|
input [21:0] i_m31,
|
input [21:0] i_m32,
|
input [21:0] i_m32,
|
input [21:0] i_m33,
|
input [21:0] i_m33,
|
`endif
|
`endif
|
// viewport mapping
|
// viewport mapping
|
input [21:0] i_vw,
|
input [21:0] i_vw,
|
input [21:0] i_vh,
|
input [21:0] i_vh,
|
// curring
|
// curring
|
input i_en_cull,
|
input i_en_cull,
|
input i_ccw,
|
input i_ccw,
|
// Rasterizer I/F
|
// Rasterizer I/F
|
output o_en,
|
output o_en,
|
input i_ack,
|
input i_ack,
|
output [`D3D_FTOI_WIDTH-1:0] o_v0_x,
|
output [`D3D_FTOI_WIDTH-1:0] o_v0_x,
|
output [`D3D_FTOI_WIDTH-1:0] o_v0_y,
|
output [`D3D_FTOI_WIDTH-1:0] o_v0_y,
|
output [`D3D_FTOI_WIDTH-1:0] o_v1_x,
|
output [`D3D_FTOI_WIDTH-1:0] o_v1_x,
|
output [`D3D_FTOI_WIDTH-1:0] o_v1_y,
|
output [`D3D_FTOI_WIDTH-1:0] o_v1_y,
|
output [`D3D_FTOI_WIDTH-1:0] o_v2_x,
|
output [`D3D_FTOI_WIDTH-1:0] o_v2_x,
|
output [`D3D_FTOI_WIDTH-1:0] o_v2_y
|
output [`D3D_FTOI_WIDTH-1:0] o_v2_y
|
);
|
);
|
|
|
//////////////////////////////////
|
//////////////////////////////////
|
// wire
|
// wire
|
//////////////////////////////////
|
//////////////////////////////////
|
wire w_en_dma;
|
wire w_en_dma;
|
wire w_ack_dma;
|
wire w_ack_dma;
|
wire [21:0] w_vx_dma;
|
wire [21:0] w_vx_dma;
|
wire [21:0] w_vy_dma;
|
wire [21:0] w_vy_dma;
|
wire [21:0] w_vz_dma;
|
wire [21:0] w_vz_dma;
|
wire [21:0] w_vw_dma;
|
wire [21:0] w_vw_dma;
|
|
|
wire w_en_mvp;
|
wire w_en_mvp;
|
wire w_ack_mvp;
|
wire w_ack_mvp;
|
wire [21:0] w_vx_mvp;
|
wire [21:0] w_vx_mvp;
|
wire [21:0] w_vy_mvp;
|
wire [21:0] w_vy_mvp;
|
wire [21:0] w_vz_mvp;
|
wire [21:0] w_vz_mvp;
|
wire [21:0] w_vw_mvp;
|
wire [21:0] w_vw_mvp;
|
|
|
wire w_en_pdiv;
|
wire w_en_pdiv;
|
wire w_ack_pdiv;
|
wire w_ack_pdiv;
|
wire [21:0] w_vx_pdiv;
|
wire [21:0] w_vx_pdiv;
|
wire [21:0] w_vy_pdiv;
|
wire [21:0] w_vy_pdiv;
|
wire [5:0] w_outcode_pdiv;
|
wire [5:0] w_outcode_pdiv;
|
|
|
wire w_en_view;
|
wire w_en_view;
|
wire w_ack_view;
|
wire w_ack_view;
|
wire [21:0] w_vx_view;
|
wire [21:0] w_vx_view;
|
wire [21:0] w_vy_view;
|
wire [21:0] w_vy_view;
|
wire [5:0] w_outcode_view;
|
wire [5:0] w_outcode_view;
|
|
|
`ifdef D3D_USE_CLIP
|
`ifdef D3D_USE_CLIP
|
(* mark_debug = "true" *) wire w_en_clip;
|
(* mark_debug = "true" *) wire w_en_clip;
|
(* mark_debug = "true" *) wire w_ack_clip;
|
(* mark_debug = "true" *) wire w_ack_clip;
|
(* mark_debug = "true" *) wire [21:0] w_vx_clip;
|
(* mark_debug = "true" *) wire [21:0] w_vx_clip;
|
(* mark_debug = "true" *) wire [21:0] w_vy_clip;
|
(* mark_debug = "true" *) wire [21:0] w_vy_clip;
|
(* mark_debug = "true" *) wire [21:0] w_vw_clip;
|
(* mark_debug = "true" *) wire [21:0] w_vw_clip;
|
(* mark_debug = "true" *) wire [5:0] w_outcode_clip;
|
(* mark_debug = "true" *) wire [5:0] w_outcode_clip;
|
(* mark_debug = "true" *) wire w_state_clip;
|
(* mark_debug = "true" *) wire w_state_clip;
|
`endif
|
`endif
|
|
|
`ifdef D3D_USE_CULL
|
`ifdef D3D_USE_CULL
|
wire w_en_tri;
|
wire w_en_tri;
|
wire w_ack_tri;
|
wire w_ack_tri;
|
wire [`D3D_FTOI_WIDTH-1:0] w_v0_x_tri;
|
wire [`D3D_FTOI_WIDTH-1:0] w_v0_x_tri;
|
wire [`D3D_FTOI_WIDTH-1:0] w_v0_y_tri;
|
wire [`D3D_FTOI_WIDTH-1:0] w_v0_y_tri;
|
wire [`D3D_FTOI_WIDTH-1:0] w_v1_x_tri;
|
wire [`D3D_FTOI_WIDTH-1:0] w_v1_x_tri;
|
wire [`D3D_FTOI_WIDTH-1:0] w_v1_y_tri;
|
wire [`D3D_FTOI_WIDTH-1:0] w_v1_y_tri;
|
wire [`D3D_FTOI_WIDTH-1:0] w_v2_x_tri;
|
wire [`D3D_FTOI_WIDTH-1:0] w_v2_x_tri;
|
wire [`D3D_FTOI_WIDTH-1:0] w_v2_y_tri;
|
wire [`D3D_FTOI_WIDTH-1:0] w_v2_y_tri;
|
wire w_state_cull;
|
wire w_state_cull;
|
`endif
|
`endif
|
|
|
wire w_state_mat;
|
wire w_state_mat;
|
wire w_state_pd;
|
wire w_state_pd;
|
wire w_state_view;
|
wire w_state_view;
|
wire w_state_if;
|
wire w_state_if;
|
wire w_dma_end;
|
wire w_dma_end;
|
|
|
reg [7:0] r_cnt;
|
reg [7:0] r_cnt;
|
assign o_debug = (r_cnt == 'd0);
|
assign o_debug = (r_cnt == 'd0);
|
assign o_state = w_state_mat &
|
assign o_state = w_state_mat &
|
w_state_pd &
|
w_state_pd &
|
w_state_view &
|
w_state_view &
|
w_state_if &
|
w_state_if &
|
`ifdef D3D_USE_CLIP
|
`ifdef D3D_USE_CLIP
|
w_state_clip &
|
w_state_clip &
|
`endif
|
`endif
|
`ifdef D3D_USE_CULL
|
`ifdef D3D_USE_CULL
|
w_state_cull &
|
w_state_cull &
|
`endif
|
`endif
|
w_dma_end;
|
w_dma_end;
|
|
|
//////////////////////////////////
|
//////////////////////////////////
|
// module instance
|
// module instance
|
//////////////////////////////////
|
//////////////////////////////////
|
`ifdef D3D_WISHBONE
|
`ifdef D3D_WISHBONE
|
fm_geo_mem #(.P_BURST_MODE(0)) u_geo_mem (
|
fm_geo_mem #(.P_BURST_MODE(0)) u_geo_mem (
|
`else
|
`else
|
fm_geo_mem #(.P_BURST_MODE(1)) u_geo_mem (
|
fm_geo_mem #(.P_BURST_MODE(1)) u_geo_mem (
|
`endif
|
`endif
|
// system
|
// system
|
.clk_core(clk_core),
|
.clk_core(clk_core),
|
.rst_x(rst_x),
|
.rst_x(rst_x),
|
// Vertex Fetch Memory I/F (Read Only)
|
// Vertex Fetch Memory I/F (Read Only)
|
.o_req_m(o_req_m),
|
.o_req_m(o_req_m),
|
.o_adrs_m(o_adrs_m),
|
.o_adrs_m(o_adrs_m),
|
.o_len_m(o_len_m),
|
.o_len_m(o_len_m),
|
.i_ack_m(i_ack_m),
|
.i_ack_m(i_ack_m),
|
.i_strr_m(i_strr_m),
|
.i_strr_m(i_strr_m),
|
.i_dbr_m(i_dbr_m),
|
.i_dbr_m(i_dbr_m),
|
// Register Configuration
|
// Register Configuration
|
// vertex fetch
|
// vertex fetch
|
.i_dma_start(i_dma_start),
|
.i_dma_start(i_dma_start),
|
.i_dma_top_address(i_dma_top_address),
|
.i_dma_top_address(i_dma_top_address),
|
.i_dma_size(i_dma_size),
|
.i_dma_size(i_dma_size),
|
.o_dma_end(w_dma_end),
|
.o_dma_end(w_dma_end),
|
// vertex output
|
// vertex output
|
.o_en(w_en_dma),
|
.o_en(w_en_dma),
|
.i_ack(w_ack_dma),
|
.i_ack(w_ack_dma),
|
.o_vx(w_vx_dma),
|
.o_vx(w_vx_dma),
|
.o_vy(w_vy_dma),
|
.o_vy(w_vy_dma),
|
.o_vz(w_vz_dma),
|
.o_vz(w_vz_dma),
|
.o_vw(w_vw_dma)
|
.o_vw(w_vw_dma)
|
);
|
);
|
|
|
// model-view-projedction matrix
|
// model-view-projedction matrix
|
fm_geo_matrix u_geo_matrix (
|
fm_geo_matrix u_geo_matrix (
|
.clk_core(clk_core),
|
.clk_core(clk_core),
|
.rst_x(rst_x),
|
.rst_x(rst_x),
|
.o_state(w_state_mat),
|
.o_state(w_state_mat),
|
// vertex input
|
// vertex input
|
.i_en(w_en_dma),
|
.i_en(w_en_dma),
|
.o_ack(w_ack_dma),
|
.o_ack(w_ack_dma),
|
.i_vx(w_vx_dma),
|
.i_vx(w_vx_dma),
|
.i_vy(w_vy_dma),
|
.i_vy(w_vy_dma),
|
.i_vz(w_vz_dma),
|
.i_vz(w_vz_dma),
|
.i_vw(w_vw_dma),
|
.i_vw(w_vw_dma),
|
// matrix elements
|
// matrix elements
|
`ifdef D3D_USE_MATRIX_PALETTE
|
`ifdef D3D_USE_MATRIX_PALETTE
|
.i_num_mats(i_num_mats),
|
.i_num_mats(i_num_mats),
|
`endif
|
`endif
|
.i_m00(i_m00),
|
.i_m00(i_m00),
|
.i_m01(i_m01),
|
.i_m01(i_m01),
|
.i_m02(i_m02),
|
.i_m02(i_m02),
|
.i_m03(i_m03),
|
.i_m03(i_m03),
|
.i_m10(i_m10),
|
.i_m10(i_m10),
|
.i_m11(i_m11),
|
.i_m11(i_m11),
|
.i_m12(i_m12),
|
.i_m12(i_m12),
|
.i_m13(i_m13),
|
.i_m13(i_m13),
|
.i_m20(i_m20),
|
.i_m20(i_m20),
|
.i_m21(i_m21),
|
.i_m21(i_m21),
|
.i_m22(i_m22),
|
.i_m22(i_m22),
|
.i_m23(i_m23),
|
.i_m23(i_m23),
|
.i_m30(i_m30),
|
.i_m30(i_m30),
|
.i_m31(i_m31),
|
.i_m31(i_m31),
|
.i_m32(i_m32),
|
.i_m32(i_m32),
|
.i_m33(i_m33),
|
.i_m33(i_m33),
|
// vertex output
|
// vertex output
|
.o_en(w_en_mvp),
|
.o_en(w_en_mvp),
|
.i_ack(w_ack_mvp),
|
.i_ack(w_ack_mvp),
|
.o_vx(w_vx_mvp),
|
.o_vx(w_vx_mvp),
|
.o_vy(w_vy_mvp),
|
.o_vy(w_vy_mvp),
|
.o_vz(w_vz_mvp),
|
.o_vz(w_vz_mvp),
|
.o_vw(w_vw_mvp)
|
.o_vw(w_vw_mvp)
|
);
|
);
|
|
|
`ifdef D3D_USE_CLIP
|
`ifdef D3D_USE_CLIP
|
fm_geo_clip u_geo_clip (
|
fm_geo_clip u_geo_clip (
|
.clk_core(clk_core),
|
.clk_core(clk_core),
|
.rst_x(rst_x),
|
.rst_x(rst_x),
|
.o_state(w_state_clip),
|
.o_state(w_state_clip),
|
// vertex input
|
// vertex input
|
.i_en(w_en_mvp),
|
.i_en(w_en_mvp),
|
.o_ack(w_ack_mvp),
|
.o_ack(w_ack_mvp),
|
.i_vx(w_vx_mvp),
|
.i_vx(w_vx_mvp),
|
.i_vy(w_vy_mvp),
|
.i_vy(w_vy_mvp),
|
.i_vz(w_vz_mvp),
|
.i_vz(w_vz_mvp),
|
.i_vw(w_vw_mvp),
|
.i_vw(w_vw_mvp),
|
// vertex output
|
// vertex output
|
.o_en(w_en_clip),
|
.o_en(w_en_clip),
|
.i_ack(w_ack_clip),
|
.i_ack(w_ack_clip),
|
.o_outcode(w_outcode_clip),
|
.o_outcode(w_outcode_clip),
|
.o_vx(w_vx_clip),
|
.o_vx(w_vx_clip),
|
.o_vy(w_vy_clip),
|
.o_vy(w_vy_clip),
|
.o_vw(w_vw_clip)
|
.o_vw(w_vw_clip)
|
);
|
);
|
`endif
|
`endif
|
|
|
// perspective division
|
// perspective division
|
fm_geo_persdiv u_geo_persdiv (
|
fm_geo_persdiv u_geo_persdiv (
|
.clk_core(clk_core),
|
.clk_core(clk_core),
|
.rst_x(rst_x),
|
.rst_x(rst_x),
|
.o_state(w_state_pd),
|
.o_state(w_state_pd),
|
// vertex input
|
// vertex input
|
`ifdef D3D_USE_CLIP
|
`ifdef D3D_USE_CLIP
|
.i_en(w_en_clip),
|
.i_en(w_en_clip),
|
.o_ack(w_ack_clip),
|
.o_ack(w_ack_clip),
|
.i_outcode(w_outcode_clip),
|
.i_outcode(w_outcode_clip),
|
.i_vx(w_vx_clip),
|
.i_vx(w_vx_clip),
|
.i_vy(w_vy_clip),
|
.i_vy(w_vy_clip),
|
.i_vw(w_vw_clip),
|
.i_vw(w_vw_clip),
|
`else
|
`else
|
.i_en(w_en_mvp),
|
.i_en(w_en_mvp),
|
.o_ack(w_ack_mvp),
|
.o_ack(w_ack_mvp),
|
.i_outcode(1'b0),
|
.i_outcode(1'b0),
|
.i_vx(w_vx_mvp),
|
.i_vx(w_vx_mvp),
|
.i_vy(w_vy_mvp),
|
.i_vy(w_vy_mvp),
|
.i_vw(w_vw_mvp),
|
.i_vw(w_vw_mvp),
|
`endif
|
`endif
|
// vertex output
|
// vertex output
|
.o_en(w_en_pdiv),
|
.o_en(w_en_pdiv),
|
.i_ack(w_ack_pdiv),
|
.i_ack(w_ack_pdiv),
|
.o_outcode(w_outcode_pdiv),
|
.o_outcode(w_outcode_pdiv),
|
.o_vx(w_vx_pdiv),
|
.o_vx(w_vx_pdiv),
|
.o_vy(w_vy_pdiv)
|
.o_vy(w_vy_pdiv)
|
);
|
);
|
|
|
fm_geo_viewport u_geo_viewport (
|
fm_geo_viewport u_geo_viewport (
|
.clk_core(clk_core),
|
.clk_core(clk_core),
|
.rst_x(rst_x),
|
.rst_x(rst_x),
|
.o_state(w_state_view),
|
.o_state(w_state_view),
|
// register configuration
|
// register configuration
|
.i_vw(i_vw),
|
.i_vw(i_vw),
|
.i_vh(i_vh),
|
.i_vh(i_vh),
|
// vertex input
|
// vertex input
|
.i_en(w_en_pdiv),
|
.i_en(w_en_pdiv),
|
.o_ack(w_ack_pdiv),
|
.o_ack(w_ack_pdiv),
|
.i_outcode(w_outcode_pdiv),
|
.i_outcode(w_outcode_pdiv),
|
.i_vx(w_vx_pdiv),
|
.i_vx(w_vx_pdiv),
|
.i_vy(w_vy_pdiv),
|
.i_vy(w_vy_pdiv),
|
// vertex output
|
// vertex output
|
.o_en(w_en_view),
|
.o_en(w_en_view),
|
.i_ack(w_ack_view),
|
.i_ack(w_ack_view),
|
.o_outcode(w_outcode_view),
|
.o_outcode(w_outcode_view),
|
.o_vx(w_vx_view),
|
.o_vx(w_vx_view),
|
.o_vy(w_vy_view)
|
.o_vy(w_vy_view)
|
);
|
);
|
|
|
fm_geo_tri u_geo_tri (
|
fm_geo_tri u_geo_tri (
|
.clk_core(clk_core),
|
.clk_core(clk_core),
|
.rst_x(rst_x),
|
.rst_x(rst_x),
|
.o_state(w_state_if),
|
.o_state(w_state_if),
|
// vertex input
|
// vertex input
|
.i_en(w_en_view),
|
.i_en(w_en_view),
|
.o_ack(w_ack_view),
|
.o_ack(w_ack_view),
|
.i_outcode(w_outcode_view),
|
.i_outcode(w_outcode_view),
|
.i_vx(w_vx_view),
|
.i_vx(w_vx_view),
|
.i_vy(w_vy_view),
|
.i_vy(w_vy_view),
|
`ifdef D3D_USE_CULL
|
`ifdef D3D_USE_CULL
|
// vertex output
|
// vertex output
|
.o_en(w_en_tri),
|
.o_en(w_en_tri),
|
.i_ack(w_ack_tri),
|
.i_ack(w_ack_tri),
|
.o_v0_x(w_v0_x_tri),
|
.o_v0_x(w_v0_x_tri),
|
.o_v0_y(w_v0_y_tri),
|
.o_v0_y(w_v0_y_tri),
|
.o_v1_x(w_v1_x_tri),
|
.o_v1_x(w_v1_x_tri),
|
.o_v1_y(w_v1_y_tri),
|
.o_v1_y(w_v1_y_tri),
|
.o_v2_x(w_v2_x_tri),
|
.o_v2_x(w_v2_x_tri),
|
.o_v2_y(w_v2_y_tri)
|
.o_v2_y(w_v2_y_tri)
|
`else
|
`else
|
// vertex output
|
// vertex output
|
.o_en(o_en),
|
.o_en(o_en),
|
.i_ack(i_ack),
|
.i_ack(i_ack),
|
.o_v0_x(o_v0_x),
|
.o_v0_x(o_v0_x),
|
.o_v0_y(o_v0_y),
|
.o_v0_y(o_v0_y),
|
.o_v1_x(o_v1_x),
|
.o_v1_x(o_v1_x),
|
.o_v1_y(o_v1_y),
|
.o_v1_y(o_v1_y),
|
.o_v2_x(o_v2_x),
|
.o_v2_x(o_v2_x),
|
.o_v2_y(o_v2_y)
|
.o_v2_y(o_v2_y)
|
`endif
|
`endif
|
);
|
);
|
|
|
`ifdef D3D_USE_CULL
|
`ifdef D3D_USE_CULL
|
fm_geo_cull u_geo_cull (
|
fm_geo_cull u_geo_cull (
|
// system
|
// system
|
.clk_core(clk_core),
|
.clk_core(clk_core),
|
.rst_x(rst_x),
|
.rst_x(rst_x),
|
// curring
|
// curring
|
.i_en_cull(i_en_cull),
|
.i_en_cull(i_en_cull),
|
.i_ccw(i_ccw),
|
.i_ccw(i_ccw),
|
.o_state(w_state_cull),
|
.o_state(w_state_cull),
|
// triangle input
|
// triangle input
|
.i_en(w_en_tri),
|
.i_en(w_en_tri),
|
.o_ack(w_ack_tri),
|
.o_ack(w_ack_tri),
|
.i_v0_x(w_v0_x_tri),
|
.i_v0_x(w_v0_x_tri),
|
.i_v0_y(w_v0_y_tri),
|
.i_v0_y(w_v0_y_tri),
|
.i_v1_x(w_v1_x_tri),
|
.i_v1_x(w_v1_x_tri),
|
.i_v1_y(w_v1_y_tri),
|
.i_v1_y(w_v1_y_tri),
|
.i_v2_x(w_v2_x_tri),
|
.i_v2_x(w_v2_x_tri),
|
.i_v2_y(w_v2_y_tri),
|
.i_v2_y(w_v2_y_tri),
|
// triangle output
|
// triangle output
|
.o_en(o_en),
|
.o_en(o_en),
|
.i_ack(i_ack),
|
.i_ack(i_ack),
|
.o_v0_x(o_v0_x),
|
.o_v0_x(o_v0_x),
|
.o_v0_y(o_v0_y),
|
.o_v0_y(o_v0_y),
|
.o_v1_x(o_v1_x),
|
.o_v1_x(o_v1_x),
|
.o_v1_y(o_v1_y),
|
.o_v1_y(o_v1_y),
|
.o_v2_x(o_v2_x),
|
.o_v2_x(o_v2_x),
|
.o_v2_y(o_v2_y)
|
.o_v2_y(o_v2_y)
|
);
|
);
|
`endif
|
`endif
|
|
|
`ifdef D3D_SYNC_RESET
|
`ifdef D3D_SYNC_RESET
|
always @(posedge clk_core) begin
|
always @(posedge clk_core) begin
|
`else
|
`else
|
always @(posedge clk_core or negedge rst_x) begin
|
always @(posedge clk_core or negedge rst_x) begin
|
`endif
|
`endif
|
if (rst_x == `D3D_RESET_POL) begin
|
if (rst_x == `D3D_RESET_POL) begin
|
r_cnt <= 'd0;
|
r_cnt <= 'd0;
|
end else begin
|
end else begin
|
if (w_en_clip & w_ack_clip) begin
|
if (w_en_clip & w_ack_clip) begin
|
if (r_cnt == 'd35) r_cnt <= 'd0;
|
if (r_cnt == 'd35) r_cnt <= 'd0;
|
else r_cnt <= r_cnt + 1'b1;
|
else r_cnt <= r_cnt + 1'b1;
|
end
|
end
|
end
|
end
|
|
|
end
|
end
|
|
|
|
|
endmodule
|
endmodule
|
|
|