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

Subversion Repositories orsoc_graphics_accelerator

[/] [orsoc_graphics_accelerator/] [tags/] [version1.0/] [rtl/] [verilog/] [gfx/] [gfx_top.v] - Rev 3

Compare with Previous | Blame | View Log

/*
ORSoC GFX accelerator core
Copyright 2012, ORSoC, Per Lenander, Anton Fosselius.
 
TOP MODULE
 
 This file is part of orgfx.
 
 orgfx is free software: you can redistribute it and/or modify
 it under the terms of the GNU Lesser General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version. 
 
 orgfx 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 Lesser General Public License for more details.
 
 You should have received a copy of the GNU Lesser General Public License
 along with orgfx.  If not, see <http://www.gnu.org/licenses/>.
 
*/
 
module gfx_top (wb_clk_i, wb_rst_i, wb_inta_o,
  // Wishbone master signals (interfaces with video memory, write)
  wbm_write_cyc_o, wbm_write_stb_o, wbm_write_cti_o, wbm_write_bte_o, wbm_write_we_o, wbm_write_adr_o, wbm_write_sel_o, wbm_write_ack_i, wbm_write_err_i, wbm_write_dat_o,
  // Wishbone master signals (interfaces with video memory, read)
  wbm_read_cyc_o, wbm_read_stb_o, wbm_read_cti_o, wbm_read_bte_o, wbm_read_we_o, wbm_read_adr_o, wbm_read_sel_o, wbm_read_ack_i, wbm_read_err_i, wbm_read_dat_i,
  // Wishbone slave signals (interfaces with main bus/CPU)
  wbs_cyc_i, wbs_stb_i, wbs_cti_i, wbs_bte_i, wbs_we_i, wbs_adr_i, wbs_sel_i, wbs_ack_o, wbs_err_o, wbs_dat_i, wbs_dat_o
);
 
// Common wishbone signals
input         wb_clk_i;    // master clock input
input         wb_rst_i;    // Asynchronous active high reset
output        wb_inta_o;   // interrupt
 
// Wishbone master signals (write)
output        wbm_write_cyc_o;    // cycle output
output        wbm_write_stb_o;    // strobe output
output [ 2:0] wbm_write_cti_o;    // cycle type id
output [ 1:0] wbm_write_bte_o;    // burst type extension
output        wbm_write_we_o;     // write enable output
output [31:0] wbm_write_adr_o;    // address output
output [ 3:0] wbm_write_sel_o;    // byte select outputs (only 32bits accesses are supported)
input         wbm_write_ack_i;    // wishbone cycle acknowledge
input         wbm_write_err_i;    // wishbone cycle error
output [31:0] wbm_write_dat_o;    // wishbone data out
 
// Wishbone master signals (read)
output        wbm_read_cyc_o;    // cycle output
output        wbm_read_stb_o;    // strobe output
output [ 2:0] wbm_read_cti_o;    // cycle type id
output [ 1:0] wbm_read_bte_o;    // burst type extension
output        wbm_read_we_o;     // write enable output
output [31:0] wbm_read_adr_o;    // address output
output [ 3:0] wbm_read_sel_o;    // byte select outputs (only 32bits accesses are supported)
input         wbm_read_ack_i;    // wishbone cycle acknowledge
input         wbm_read_err_i;    // wishbone cycle error
input [31:0]  wbm_read_dat_i;    // wishbone data in
 
// Wishbone slave signals
input         wbs_cyc_i;    // cycle input
input         wbs_stb_i;    // strobe input
input [ 2:0]  wbs_cti_i;    // cycle type id
input [ 1:0]  wbs_bte_i;    // burst type extension
input         wbs_we_i;     // write enable input
input [31:0]  wbs_adr_i;    // address input
input [ 3:0]  wbs_sel_i;    // byte select input (only 32bits accesses are supported)
output        wbs_ack_o;    // wishbone cycle acknowledge
output        wbs_err_o;    // wishbone cycle error
input  [31:0] wbs_dat_i;    // wishbone data in
output [31:0] wbs_dat_o;    // wishbone data out
 
// Wires and variables
 
wire wbmwriter_sint; // connect to slave interface
wire wbmreader_sint;
 
wire raster_wbs_pipeline_ack;
 
wire [31:2] target_base_reg;
wire [15:0] wbs_raster_target_size_x;
wire [15:0] wbs_raster_target_size_y;
wire [15:0] target_size_x_reg;
wire [15:0] target_size_y_reg;
 
assign target_size_x_reg = wbs_raster_target_size_x;
assign target_size_y_reg = wbs_raster_target_size_y;
 
wire [31:2] wbs_fragment_tex0_base;
wire [15:0] wbs_fragment_tex0_size_x;
wire [15:0] wbs_fragment_tex0_size_y;
 
wire [31:2] render_wbmwriter_addr;
wire [3:0]  render_wbmwriter_sel;
wire [31:0] render_wbmwriter_dat;
 
wire [1:0] color_depth_reg;
 
wire render_wbmwriter_memory_pixel_write;
wire wbs_raster_rect_write;
wire wbs_raster_line_write;
wire wbmwriter_render_ack;
 
// src pixel
wire [15:0] wbs_raster_src_pixel0_x;
wire [15:0] wbs_raster_src_pixel0_y;
wire [15:0] wbs_raster_src_pixel1_x;
wire [15:0] wbs_raster_src_pixel1_y;
 
// dest pixel
wire [15:0] wbs_raster_dest_pixel0_x;
wire [15:0] wbs_raster_dest_pixel0_y;
wire [15:0] wbs_raster_dest_pixel1_x;
wire [15:0] wbs_raster_dest_pixel1_y;
 
// clip pixel
wire [15:0] wbs_raster_clip_pixel0_x;
wire [15:0] wbs_raster_clip_pixel0_y;
wire [15:0] wbs_raster_clip_pixel1_x;
wire [15:0] wbs_raster_clip_pixel1_y;
 
wire [31:0] wbs_fragment_color;
 
wire texture_enable_reg;
 
wire        blending_enable_reg;
wire [7:0]  global_alpha_reg;
wire        colorkey_enable_reg;
wire [31:0] colorkey_reg;
 
// Slave wishbone interface. Reads wishbone bus and fills registers
gfx_wbs wb_databus (
  .clk_i             (wb_clk_i),
  .rst_i             (wb_rst_i),
  .adr_i             (wbs_adr_i[9:0]),
  .dat_i             (wbs_dat_i),
  .dat_o             (wbs_dat_o),
  .sel_i             (wbs_sel_i),
  .we_i              (wbs_we_i),
  .stb_i             (wbs_stb_i),
  .cyc_i             (wbs_cyc_i),
  .ack_o             (wbs_ack_o),
  .rty_o             (),
  .err_o             (wbs_err_o),
  .inta_o            (wb_inta_o),
 
  //source pixel
  .src_pixel0_x_o    (wbs_raster_src_pixel0_x),
  .src_pixel0_y_o    (wbs_raster_src_pixel0_y),
  .src_pixel1_x_o    (wbs_raster_src_pixel1_x),
  .src_pixel1_y_o    (wbs_raster_src_pixel1_y),
  //destination pixel
  .dest_pixel0_x_o   (wbs_raster_dest_pixel0_x),
  .dest_pixel0_y_o   (wbs_raster_dest_pixel0_y),
  .dest_pixel1_x_o   (wbs_raster_dest_pixel1_x),
  .dest_pixel1_y_o   (wbs_raster_dest_pixel1_y),
  //clip pixel
  .clip_pixel0_x_o   (wbs_raster_clip_pixel0_x),
  .clip_pixel0_y_o   (wbs_raster_clip_pixel0_y),
  .clip_pixel1_x_o   (wbs_raster_clip_pixel1_x),
  .clip_pixel1_y_o   (wbs_raster_clip_pixel1_y),
 
  .color_o           (wbs_fragment_color),
 
  .target_base_o     (target_base_reg),
  .target_size_x_o   (wbs_raster_target_size_x),
  .target_size_y_o   (wbs_raster_target_size_y),
  .tex0_base_o       (wbs_fragment_tex0_base),
  .tex0_size_x_o     (wbs_fragment_tex0_size_x),
  .tex0_size_y_o     (wbs_fragment_tex0_size_y),
 
  .color_depth_o     (color_depth_reg),
 
  .rect_write_o      (wbs_raster_rect_write),
  .line_write_o      (wbs_raster_line_write),
 
  .sint_i            (wbmwriter_sint | wbmreader_sint),
 
  .pipeline_ack_i    (raster_wbs_pipeline_ack),
 
  .texture_enable_o  (texture_enable_reg),
  .blending_enable_o (blending_enable_reg),
  .global_alpha_o    (global_alpha_reg),
  .colorkey_enable_o (colorkey_enable_reg),
  .colorkey_o        (colorkey_reg) 
  );
 
/*
// TODO: Remove temp wires
wire vector_in;
wire vector;
 
// Vector processor applies transforms to points
gfx_vector_processor vp0 (
  .clk_i        (wb_clk_i),
  .rst_i        (wb_rst_i),
  .vector_i     (vector_in),
  .vector_o     (vector)
  );
*/
 
wire raster_fragment_write_enable;
wire [15:0] raster_fragment_x_pixel;
wire [15:0] raster_fragment_y_pixel;
wire fragment_raster_ack;
wire [15:0] raster_fragment_u;
wire [15:0] raster_fragment_v;
 
// Rasterizer generates pixels to calculate
gfx_rasterizer rasterizer0 (
  .clk_i            (wb_clk_i),
  .rst_i            (wb_rst_i),
 
  .ack_i            (fragment_raster_ack),
  .ack_o            (raster_wbs_pipeline_ack),
  .rect_write_i	    (wbs_raster_rect_write),
  .line_write_i     (wbs_raster_line_write),
  .texture_enable_i (texture_enable_reg),
  // source pixel coordinates
  .src_pixel0_x_i   (wbs_raster_src_pixel0_x),
  .src_pixel0_y_i   (wbs_raster_src_pixel0_y),
  .src_pixel1_x_i   (wbs_raster_src_pixel1_x),
  .src_pixel1_y_i   (wbs_raster_src_pixel1_y),
 
  // destination pixel coordinates
  .dest_pixel0_x_i  (wbs_raster_dest_pixel0_x),
  .dest_pixel0_y_i  (wbs_raster_dest_pixel0_y),
  .dest_pixel1_x_i  (wbs_raster_dest_pixel1_x),
  .dest_pixel1_y_i  (wbs_raster_dest_pixel1_y),	
 
  // clip pixel coordinates
  .clip_pixel0_x_i  (wbs_raster_clip_pixel0_x),
  .clip_pixel0_y_i  (wbs_raster_clip_pixel0_y),
  .clip_pixel1_x_i  (wbs_raster_clip_pixel1_x),
  .clip_pixel1_y_i  (wbs_raster_clip_pixel1_y),	
 
  // Screen size
  .target_size_x_i  (wbs_raster_target_size_x),
  .target_size_y_i  (wbs_raster_target_size_y),
 
  // Output pixel
  .x_counter_o 	    (raster_fragment_x_pixel),
  .y_counter_o 	    (raster_fragment_y_pixel),
  .u_o              (raster_fragment_u),
  .v_o              (raster_fragment_v),
  .write_o          (raster_fragment_write_enable)
  );
 
wire fragment_blender_write_enable;
wire [15:0] fragment_blender_x_pixel;
wire [15:0] fragment_blender_y_pixel;
wire blender_fragment_ack;
wire [31:0] fragment_blender_color;
wire [7:0] fragment_blender_alpha;
 
wire wbmreader_fragment_texture_ack;
wire [31:0] wbmreader_fragment_texture_data;
wire [31:2] fragment_wbmreader_texture_addr;
wire [3:0] fragment_wbmreader_texture_sel;
wire fragment_wbmreader_texture_request;
 
 
// Fragment processor generates color of pixel (requires RAM read for textures)
gfx_fragment_processor fp0 (
  .clk_i             (wb_clk_i),
  .rst_i             (wb_rst_i),
  .global_alpha_i    (global_alpha_reg),
  .x_counter_i       (raster_fragment_x_pixel),
  .y_counter_i       (raster_fragment_y_pixel),
  .u_i               (raster_fragment_u),
  .v_i               (raster_fragment_v),
  .ack_i             (blender_fragment_ack),
  .write_i           (raster_fragment_write_enable),
  .pixel_x_o         (fragment_blender_x_pixel),
  .pixel_y_o         (fragment_blender_y_pixel),
  .pixel_color_i     (wbs_fragment_color),
  .pixel_color_o     (fragment_blender_color),
  .pixel_alpha_o     (fragment_blender_alpha),
  .write_o           (fragment_blender_write_enable),
  .ack_o             (fragment_raster_ack),
  .texture_ack_i     (wbmreader_fragment_texture_ack), 
  .texture_data_i    (wbmreader_fragment_texture_data), 
  .texture_addr_o    (fragment_wbmreader_texture_addr), 
  .texture_sel_o     (fragment_wbmreader_texture_sel), 
  .texture_request_o (fragment_wbmreader_texture_request),
  .texture_enable_i  (texture_enable_reg),
  .tex0_base_i       (wbs_fragment_tex0_base), 
  .tex0_size_x_i     (wbs_fragment_tex0_size_x), 
  .tex0_size_y_i     (wbs_fragment_tex0_size_y),
  .color_depth_i     (color_depth_reg),
  .colorkey_enable_i (colorkey_enable_reg),
  .colorkey_i        (colorkey_reg)
  );
 
wire blender_render_write_enable;
wire [15:0] blender_render_x_pixel;
wire [15:0] blender_render_y_pixel;
wire render_blender_ack;
wire [31:0] blender_render_color;
 
// Connected through arbiter
wire wbmreader_blender_target_ack;
wire [31:2] blender_wbmreader_target_addr;
wire [31:0] wbmreader_blender_target_data;
wire [3:0] blender_wbmreader_target_sel;
wire blender_wbmreader_target_request;
wire wbmreader_blender_busy;
 
// Applies alpha blending if enabled (requires RAM read to get target pixel color)
// Fragment processor generates color of pixel (requires RAM read for textures)
gfx_blender blender0 (
  .clk_i            (wb_clk_i),
  .rst_i            (wb_rst_i),
  .blending_enable_i (blending_enable_reg),
  // Render target information
  .target_base_i    (target_base_reg),
  .target_size_x_i  (target_size_x_reg),
  .target_size_y_i  (target_size_y_reg),
  .color_depth_i    (color_depth_reg),
  .x_counter_i      (fragment_blender_x_pixel),
  .y_counter_i      (fragment_blender_y_pixel),
  .alpha_i          (fragment_blender_alpha),
  .ack_i            (render_blender_ack),
  .target_ack_i     (wbmreader_blender_target_ack),
  .target_addr_o    (blender_wbmreader_target_addr),
  .target_data_i    (wbmreader_blender_target_data),
  .target_sel_o     (blender_wbmreader_target_sel),
  .target_request_o (blender_wbmreader_target_request),
  .wbm_busy_i       (wbmreader_blender_busy),
  .write_i          (fragment_blender_write_enable),
  .pixel_x_o        (blender_render_x_pixel),
  .pixel_y_o        (blender_render_y_pixel),
  .pixel_color_i    (fragment_blender_color),
  .pixel_color_o    (blender_render_color),
  .write_o          (blender_render_write_enable),
  .ack_o            (blender_fragment_ack)
  );
 
// Write pixel to target (check for out of bounds)
gfx_renderer renderer (
  .clk_i           (wb_clk_i),
  .rst_i           (wb_rst_i),
  // Render target information
  .target_base_i   (target_base_reg),
  .target_size_x_i (target_size_x_reg),
  .target_size_y_i (target_size_y_reg),
  .color_depth_i   (color_depth_reg),
  // Input pixel
  .pixel_x_i       (blender_render_x_pixel),
  .pixel_y_i       (blender_render_y_pixel),
  .color_i         (blender_render_color),
 
  .render_addr_o   (render_wbmwriter_addr),
  .render_sel_o    (render_wbmwriter_sel),
  .render_dat_o    (render_wbmwriter_dat),
  .ack_o           (render_blender_ack),
  .ack_i	   (wbmwriter_render_ack),
  .write_i         (blender_render_write_enable),
  .write_o         (render_wbmwriter_memory_pixel_write)
  );
 
// Instansiate wishbone master interface (write only)
gfx_wbm_write wbm_writer (
  .clk_i           (wb_clk_i),
  .rst_i           (wb_rst_i),
  .cyc_o           (wbm_write_cyc_o),
  .stb_o           (wbm_write_stb_o),
  .cti_o           (wbm_write_cti_o),
  .bte_o           (wbm_write_bte_o),
  .we_o            (wbm_write_we_o),
  .adr_o           (wbm_write_adr_o),
  .sel_o           (wbm_write_sel_o),
  .ack_i           (wbm_write_ack_i),
  .err_i           (wbm_write_err_i),
  .dat_o           (wbm_write_dat_o),
  .sint_o          (wbmwriter_sint),
 
  .write_i         (render_wbmwriter_memory_pixel_write),
  .ack_o           (wbmwriter_render_ack),
 
  // send ack to renderer when done writing to memory.
  .render_addr_i   (render_wbmwriter_addr),
  .render_sel_i    (render_wbmwriter_sel),
  .render_dat_i    (render_wbmwriter_dat)
  );
 
wire wbmreader_arbiter_ack;
wire [31:2] arbiter_wbmreader_addr;
wire [31:0] wbmreader_arbiter_data;
wire [3:0] arbiter_wbmreader_sel;
wire arbiter_wbmreader_request;
 
// Instansiate wbm reader arbiter
gfx_wbm_read_arbiter wbm_arbiter (
  .master_busy_o     (wbmreader_blender_busy),
  // Interface against the wbm read module
  .read_request_o    (arbiter_wbmreader_request),
  .addr_o            (arbiter_wbmreader_addr),
  .sel_o             (arbiter_wbmreader_sel),
  .dat_i             (wbmreader_arbiter_data),
  .ack_i             (wbmreader_arbiter_ack),
  // Interface against masters (fragment processor)
  .m0_read_request_i (fragment_wbmreader_texture_request),
  .m0_addr_i         (fragment_wbmreader_texture_addr),
  .m0_sel_i          (fragment_wbmreader_texture_sel),
  .m0_dat_o          (wbmreader_fragment_texture_data),
  .m0_ack_o          (wbmreader_fragment_texture_ack),
  // Interface against masters (blender)
  .m1_read_request_i (blender_wbmreader_target_request),
  .m1_addr_i         (blender_wbmreader_target_addr),
  .m1_sel_i          (blender_wbmreader_target_sel),
  .m1_dat_o          (wbmreader_blender_target_data),
  .m1_ack_o          (wbmreader_blender_target_ack)
  );
 
// Instansiate wishbone master interface (read only for textures)
gfx_wbm_read wbm_reader (
  .clk_i            (wb_clk_i),
  .rst_i            (wb_rst_i),
  .cyc_o            (wbm_read_cyc_o),
  .stb_o            (wbm_read_stb_o),
  .cti_o            (wbm_read_cti_o),
  .bte_o            (wbm_read_bte_o),
  .we_o             (wbm_read_we_o),
  .adr_o            (wbm_read_adr_o),
  .sel_o            (wbm_read_sel_o),
  .ack_i            (wbm_read_ack_i),
  .err_i            (wbm_read_err_i),
  .dat_i            (wbm_read_dat_i),
  .sint_o           (wbmreader_sint),
 
  // send ack to renderer when done writing to memory.
  .read_request_i   (arbiter_wbmreader_request),
  .texture_addr_i   (arbiter_wbmreader_addr),
  .texture_sel_i    (arbiter_wbmreader_sel),
  .texture_dat_o    (wbmreader_arbiter_data),
  .texture_data_ack (wbmreader_arbiter_ack)
  );
 
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.