strgba.v 2.43 KB
/**************************************************************************
 *                                                                        *
 *               Copyright (C) 1994, Silicon Graphics, Inc.               *
 *                                                                        *
 *  These coded instructions, statements, and computer programs  contain  *
 *  unpublished  proprietary  information of Silicon Graphics, Inc., and  *
 *  are protected by Federal copyright  law.  They  may not be disclosed  *
 *  to  third  parties  or copied or duplicated in any form, in whole or  *
 *  in part, without the prior written consent of Silicon Graphics, Inc.  *
 *                                                                        *
 *************************************************************************/
// $Id: strgba.v,v 1.2 2002/11/22 00:34:20 rws Exp $
/*      Project Reality
        MDP
        Created by Mike M. Cai  5/23/94
*/

module strgba( att_data_out,
      	       att_data_in, dx, dy, x_offset, y_offset,
	       left_major, load, ncyc, clk, start_gclk);
output [7:0]   att_data_out;  	 // 8.0
input [20:0]   att_data_in;   	 // 10.11
input [21:0]   dx;   	      	 // s10.11
input [12:0]   dy;   	      	 // s10.2
input [1:0]    x_offset, y_offset;  // 0.2
input 	       left_major, load; 
input 	       ncyc; 	      	 // lsb of cycle_type
input  	       clk, start_gclk;

// wire [20:0]    att_cur_m, att_accum, dx_dir;
wire [20:0]    att_accum, dx_dir;
reg [20:0]     att_cur_s;
wire [8:0]     att_offset;
wire [7:0]     att_clamp_value;
wire [7:0]     att_clamped;
reg [7:0]      att_data_out;
reg   	       comp_new;

always @(posedge clk)
   if (start_gclk) begin
      att_cur_s <= load ? att_data_in : att_accum;
      comp_new <= load ? ~ncyc : ( ncyc ? ~comp_new : comp_new);
   end

assign  
   dx_dir = (dx[20:0] ~^ {21{left_major}}) & {21{comp_new}};
adder21b adder ( .sum(att_accum), .a(att_cur_s), .b(dx_dir), 
      	       	  .ci(~left_major & comp_new));

strgbaoffseti dooffset ( .att_data_out(att_offset), .att_data_in(att_cur_s[19:9]),
      	       	     .dx(dx[21:9]), .dy(dy), 
		     .x_offset(x_offset), .y_offset(y_offset));
assign  
//   att_clamp_value = att_offset[7] ? 8'h0 : 8'hff,
   att_clamp_value = {8{~att_offset[7]}},
   att_clamped = att_offset[8] ? att_clamp_value : att_offset[7:0];
   
always @(posedge clk)
  if (start_gclk) begin
      att_data_out <= att_clamped;
  end

endmodule  //  strgba