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

Subversion Repositories rtf68ksys

[/] [rtf68ksys/] [trunk/] [rtl/] [verilog/] [rtfGraphicsAccelerator.v] - Rev 2

Compare with Previous | Blame | View Log

`define NULL		8'd0
`define DRAW_PIXEL	8'd1
`define DRAW_LINE	8'd2
`define LINETO		8'd3
`define RECTANGLE	8'd4
`define RECTANGLE2	8'd5
`define RECTANGLE3	8'd6
`define RECTANGLE4	8'd7
 
module rtfGraphicsAccelerator (
rst_i,
clk_i,
 
s_cyc_i,
s_stb_i,
s_we_i,
s_ack_o,
s_sel_i,
s_adr_i,
s_dat_i,
s_dat_o,
 
m_cyc_o,
m_stb_o,
m_we_o,
m_ack_i,
m_sel_o,
m_adr_o,
m_dat_i,
m_dat_o
);
parameter PPL = 16'd416;		// pixels per line
parameter IDLE = 8'd0;
parameter DRAWPIXEL = 8'd1;
parameter DL_SETPIXEL = 8'd2;
parameter DL_CALCE2 = 8'd3;
parameter DL_TEST = 8'd4;
parameter DL_TEST2 = 8'd5;
 
input rst_i;
input clk_i;
 
input s_cyc_i;
input s_stb_i;
output s_ack_o;
input s_we_i;
input [1:0] s_sel_i;
input [31:0] s_adr_i;
input [15:0] s_dat_i;
output [15:0] s_dat_o;
 
output m_cyc_o;
reg m_cyc_o;
output m_stb_o;
reg m_stb_o;
output m_we_o;
reg m_we_o;
input m_ack_i;
output [1:0] m_sel_o;
reg [1:0] m_sel_o;
output [31:0] m_adr_o;
reg [31:0] m_adr_o;
input [15:0] m_dat_i;
output [15:0] m_dat_o;
reg [15:0] m_dat_o;
 
reg [7:0] cmd;
reg ps;						// pen select
reg [7:0] PenColor8;
reg [7:0] FillColor8;
reg [31:0] PenColor;
reg [31:0] FillColor;
reg [15:0] x0,y0,x1,y1;
reg [15:0] x0a,y0a,x1a,y1a;
 
reg [15:0] cx,cy;			// graphics cursor position
wire [31:0] ma = 32'h020000 + cy * PPL + cx;
reg signed [15:0] dx,dy;
reg signed [15:0] sx,sy;
reg signed [15:0] err;
wire signed [15:0] e2 = err << 1;
reg [7:0] state;
 
wire cs = s_cyc_i && s_stb_i && (s_adr_i[31:8]==24'hFFDA_E0);
assign s_ack_o = cs;
 
always @(posedge clk_i)
if (rst_i) begin
	x0 <= 16'd0;
	y0 <= 16'd0;
	x1 <= 16'd0;
	y1 <= 16'd0;
	cx <= 16'd0;
	cy <= 16'd0;
	state <= IDLE;
end
else begin
	if (cs & s_we_i) begin
		case(s_adr_i[4:1])
		8'd0:	begin PenColor[31:16] <= s_dat_i; PenColor8[7:5] <= s_dat_i[7:5]; end
		8'd1:	begin PenColor[15: 0] <= s_dat_i; PenColor8[4:2] <= s_dat_i[15:13]; PenColor8[1:0] <= s_dat_i[7:6]; end
		8'd2:	begin FillColor[31:16] <= s_dat_i; FillColor8[7:5] <= s_dat_i[7:5]; end
		8'd3:	begin FillColor[15: 0] <= s_dat_i; FillColor8[4:2] <= s_dat_i[15:13]; FillColor8[1:0] <= s_dat_i[7:6]; end
		8'd4:	x0 <= s_dat_i;
		8'd5:	y0 <= s_dat_i;
		8'd6:	x1 <= s_dat_i;
		8'd7:	y1 <= s_dat_i;
		8'd15:	cmd <= s_dat_i;
		endcase
	end
 
case(state)
IDLE:
	begin
		cx <= x0;
		cy <= y0;
		dx <= x1 < x0 ? x0-x1 : x1-x0;
		dy <= y1 < y0 ? y0-y1 : y1-y0;
		sx <= x0 < x1 ? 1 : -1;
		sy <= y0 < y1 ? 1 : -1;
		err <= dx-dy;
		if (cmd==`DRAW_PIXEL) begin
			state <= DRAWPIXEL;
			cmd <= `NULL;
		end
		else if (cmd==`DRAW_LINE) begin
			state <= DL_SETPIXEL;
			cmd <= `NULL;
		end
		else if (cmd==`LINETO) begin
			x1 <= x0;
			y1 <= y0;
			x0 <= cx;
			y0 <= cy;
			cmd <= `DRAW_LINE;
		end
		else if (cmd==`RECTANGLE) begin
			x0a <= x0;
			y0a <= y0;
			x1a <= x1;
			y1a <= y1;
			y1 <= y0;
			cmd <= `RECTANGLE2;
			state <= DL_SETPIXEL;
		end
		else if (cmd==`RECTANGLE2) begin
			x0 <= x1a;
			y0 <= y0a;
			x1 <= x1a;
			y1 <= y1a;
			cmd <= `RECTANGLE3;
			state <= DL_SETPIXEL;
		end
		else if (cmd==`RECTANGLE3) begin
			y0 <= y1a;
			x0 <= x1a;
			x1 <= x0a;
			y1 <= y1a;
			cmd <= `RECTANGLE4;
			state <= DL_SETPIXEL;
		end
		else if (cmd==`RECTANGLE4) begin
			x0 <= x0a;
			y0 <= y1a;
			x1 <= x0a;
			y1 <= y0a;
			cmd <= `NULL;
			state <= DL_SETPIXEL;
		end
	end
 
DRAWPIXEL:
	if (!m_cyc_o) begin
		m_cyc_o <= 1'b1;
		m_stb_o <= 1'b1;
		m_we_o <= 1'b1;
		m_sel_o <= {cx[0],~cx[0]};
		m_adr_o <= ma;
		m_dat_o <= {2{PenColor8}};
	end
	else if (m_ack_i) begin
		m_cyc_o <= 1'b0;
		m_stb_o <= 1'b0;
		m_sel_o <= 2'b00;
		m_we_o <= 1'b0;
		state <= IDLE;
	end
 
DL_SETPIXEL:
	if (!m_cyc_o) begin
		m_cyc_o <= 1'b1;
		m_stb_o <= 1'b1;
		m_we_o <= 1'b1;
		m_sel_o <= {cx[0],~cx[0]};
		m_adr_o <= ma;
		m_dat_o <= {2{PenColor8}};
	end
	else if (m_ack_i) begin
		m_cyc_o <= 1'b0;
		m_stb_o <= 1'b0;
		m_sel_o <= 2'b00;
		m_we_o <= 1'b0;
		if (cx==x1 && cy==y1)
			state <= IDLE;
		else
			state <= DL_TEST;
	end
DL_TEST:
	begin
		err <= err - ((e2 > -dy) ? dy : 16'd0) + ((e2 < dx) ? dx : 16'd0);
		cx <= (e2 > -dy) ? cx + sx : cx;
		cy <= (e2 <  dx) ? cy + sy : cy;
		state <= DL_SETPIXEL;
	end
 
endcase
end
 
endmodule
 
//function line(x0, y0, x1, y1)
//   dx := abs(x1-x0)
//   dy := abs(y1-y0) 
//;   if x0 < x1 then sx := 1 else sx := -1
//;   if y0 < y1 then sy := 1 else sy := -1
//;   err := dx-dy
//; 
//;//   loop
//;     setPixel(x0,y0)
//;     if x0 = x1 and y0 = y1 exit loop
//;     e2 := 2*err
//;     if e2 > -dy then 
//;       err := err - dy
//;       x0 := x0 + sx
//;     end if
//;     if e2 <  dx then 
//;       err := err + dx
//;       y0 := y0 + sy 
//;     end if
//;   end loop
 

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.