📄 rasterizer_11_07_2008_18_46.v.bak
字号:
`define box 5'd9
module Rasterizer(clk, reset, x1, y1, x2, y2, x3, y3, pixelOut, out_pixel_x, out_pixel_y, stall, done);
input clk;
input reset;
input stall;
input wire signed[8:0] x1, x2, x3, y1, y2, y3;
output wire pixelOut;
assign pixelOut = (reset & ~done) | (state == 5'd7 && ((p3[17] == 0 && c3[17] == 1 && p3 > -c3) || (p3[17] == 0 && c3[17] == 0) || (p3[17] == 1 && c3[17] == 0 && c3 > -p3) || (p3[17] != c3[17] && p3 == -c3)));
output [9:0] out_pixel_x;
output [9:0] out_pixel_y;
reg [4:0] state;
output reg done;
reg [17:0] c1, c2, c3;
reg [4:0] i,j;
reg [17:0] p1, p2, p3;
parameter exit = 5'd15;
wire signed[17:0] wire1, wire2, wire3;
wire signed [8:0] in1a, in1b, in2a, in2b;
wire [8:0] xmin, ymin;
assign xmin = (x1 <= x2 & x1 <= x3) ? x1 : (x2 <= x1 & x2 <= x3) ? x2 : x3;
assign ymin = (y1 <= y2 & y1 <= y3) ? y1 : (y2 <= y1 & y2 <= y3) ? y2 : y3;
assign in1a = (state == 5'd1 || state == 5'd4) ? (y1-y2) :
(state == 5'd2 || state == 5'd5) ? (y3-y1) :
(state == 5'd3 || state == 5'd6) ? (y2-y3) : 0;
assign in1b = (state == 5'd1 ) ? x1-xmin :
(state == 5'd2 ) ? x3-xmin :
(state == 5'd3 ) ? x2-xmin :
(state == 5'd4 ) ? i :
(state == 5'd5 ) ? i :
(state == 5'd6 ) ? i : 0;
assign in2a = (state == 5'd1 || state == 5'd4) ? (x1-x2) :
(state == 5'd2 || state == 5'd5) ? (x3-x1) :
(state == 5'd3 || state == 5'd6) ? (x2-x3) : 0;
assign in2b = (state == 5'd1 ) ? y1-ymin :
(state == 5'd2 ) ? y3-ymin :
(state == 5'd3 ) ? y2-ymin :
(state == 5'd4 ) ? j :
(state == 5'd5 ) ? j :
(state == 5'd6 ) ? j : 0;
signed_mult_2 mult2(.a(in1a), .b(in1b), .out(wire1));
signed_mult_2 mult3(.a(in2a), .b(in2b), .out(wire2));
assign wire3 = wire1 - wire2;
assign out_pixel_x = xmin + i;
assign out_pixel_y = 240 - (ymin + j);
/* Note: vertice inputs are normalized to bounding box, where (0,0) is
bottom left corner*/
always@(posedge clk) begin
if (stall)
begin
i <= i;
j <= j;
c1 <= c1;
c2 <= c2;
c3 <= c3;
state <= state;
p1 <= p1;
p2 <= p2;
p3 <= p3;
done <= done;
end
else
begin
if(reset) begin
state <= 5'd0;
i <= 5'd0;
j <= 5'd0;
done <= 1'b0;
end
else begin
/* Go through each pixel and compare to the three equations */
case(state)
0:
begin
i <= 0;
j <= 0;
c1 <= 0;
c2 <= 0;
c3 <= 0;
p1 <= 0;
p2 <= 0;
p3 <= 0;
done <= 1'b0;
state <= 5'd1;
end
1:
begin
c1 <= -wire3; /*(y1-y2)*x1 - (x1-x2)*y1;*/
state <= 5'd2;
end
2:
begin
c2 <= -wire3; //(y3-y1)*x3 - (x3-x1)*y3;
state <= 5'd3;
end
3:
begin
c3 <= -wire3; //(y2-y3)*x2 - (x2-x3)*y2;
state <= 5'd4;
end
4:
begin
p1 <= wire3; //(y1-y2)*i - (x1-x2)*j;
state <= 5'd5;
//pixelOut <= 1'b0;
end
5:
begin
if( (p1[17] == 0 && c1[17] == 1 && p1 > -c1) || (p1[17] == 0 && c1[17] == 0) || (p1[17] == 1 && c1[17] == 0 && c1 > -p1) || (p1[17] != c1[17] && p1 == -c1)) begin
state <= 5'd6;
p2 <= wire3; //(y3-y1)*i - (x3-x1)*j;
end
else begin
//pixelOut <= 1'b0;
if(i == 5'd9 && j == 5'd9)
state <= exit;
else begin
if(i < 5'd9)
i <= i + 5'd1;
else begin
j <= j + 5'd1;
i <= 5'd0;
end
state <= 5'd4;
end
end
end
6:
begin
if( (p2[17] == 0 && c2[17] == 1 && p2 > -c2) || (p2[17] == 0 && c2[17] == 0) || (p2[17] == 1 && c2[17] == 0 && c2 > -p2) || (p2[17] != c2[17] && p2 == -c2))
begin
p3 <= wire3; //(y2-y3)*i - (x2-x3)*j;
state <= 5'd7;
end
else begin
//pixelOut <= 1'b0;
if(i == 5'd9 && j == 5'd9)
state <= exit;
else begin
if(i < 5'd9)
i <= i + 5'd1;
else begin
j <= j + 5'd1;
i <= 5'd0;
end
state <= 5'd4;
end
end
end
7:
begin
// if( p3[16:0] > c3[16:0] )
// pixelOut <= 1'b1;
// else
// pixelOut <= 1'b0;
if(i == 5'd9 && j == 5'd9)
state <= exit;
else begin
if(i < 5'd9)
i <= i + 5'd1;
else begin
j <= j + 5'd1;
i <= 5'd0;
end
state <= 5'd4;
end
end
exit:
begin
done <= 1'b1;
//state <= 5'd0;
//i <= 5'd0;
//j <= 5'd0;
end
endcase
end //else
end //else
end //always
endmodule
////// NEED TO PASS A WRITE ENABLE OUT FOR THE SRAM
//
//
//module Rasterizer (
// clock,
// reset,
//
// vertex1_x,
// vertex1_y,
//
// vertex2_x,
// vertex2_y,
//
// vertex3_x,
// vertex3_y,
//
// out_fragment_x,
// out_fragment_y,
// fragment_c,
//
// stallOUT,
// stallIN,
//
// out
// );
//
//output [26:0] out;
//wire [26:0] out;
//
//assign out = fragment_x;
//
//input clock;
//input reset;
//
//input signed[26:0] vertex1_x;
//input signed[26:0] vertex1_y;
//
//input signed[26:0] vertex2_x;
//input signed[26:0] vertex2_y;
//
//input signed[26:0] vertex3_x;
//input signed[26:0] vertex3_y;
//
//output [9:0] out_fragment_x;
//output [9:0] out_fragment_y;
//output [15:0] fragment_c;
//
//wire [9:0] out_fragment_x;
//wire [9:0] out_fragment_y;
//
//assign out_fragment_x = {2'b00, fragment_x[26:19]};
//assign out_fragment_y = {2'b00, fragment_y[26:19]};
//
//reg signed[26:0] fragment_x;
//reg signed[26:0] fragment_y;
//reg signed[15:0] fragment_c;
//
//input stallIN;
//wire stallIN;
//
//output stallOUT;
//reg stallOUT;
//
//reg [1:0] setup_counter;
//
//reg signed[26:0] xMin, xMax;
//reg signed[26:0] yMin, yMax;
//
//wire signed [26:0] r_minus_r3_x, r_minus_r3_y;
//
//wire signed [26:0] x1_x3, x2_x3, y1_y3, y2_y3;
//
//wire signed [26:0] det1, det2;
//reg signed [26:0] det;
//
//wire signed [26:0] lambda1, lambda2, lambda3;
//
//wire signed [26:0] a,b,d,e;
//reg signed [26:0] c,f;
//
//assign r_minus_r3_x = (fragment_x - vertex3_x) ;
//assign r_minus_r3_y = (fragment_y - vertex3_y) ;
//
//assign x1_x3 = (vertex1_x - vertex3_x) ;
//assign x2_x3 = (vertex2_x - vertex3_x) ;
//
//assign y1_y3 = (vertex1_y - vertex3_y) ;
//assign y2_y3 = (vertex2_y - vertex3_y) ;
//
//signed_mult_8 s1(det1, x1_x3, y2_y3);
//signed_mult_8 s2(det2, x2_x3, y1_y3);
//
//signed_mult_8 s3(a, y2_y3, r_minus_r3_x);
//signed_mult_8 s4(b, x2_x3, r_minus_r3_y);
//
//signed_mult_8 s5(d, y1_y3, r_minus_r3_x);
//signed_mult_8 s6(e, x1_x3, r_minus_r3_y);
//
//signed_mult_8 s7(lambda1, c, 27'b100000000000001100000000000);//27'b000000010000000000000000000 / det);
//signed_mult_8 s8(lambda2, f, 27'b100000000000001100000000000);//27'b000000010000000000000000000 / det);
//
//assign lambda3 = 27'b000000010000000000000000000 - lambda1 - lambda2;
//
//always @(posedge clock)
//begin
// if (reset)
// begin
// stallOUT <= 1'b0;
//
// fragment_x <= 27'd0;
// fragment_y <= 27'd0;
// fragment_c <= 16'b0;
//
// xMin <= 10'b0;
// xMax <= 10'b0;
//
// yMin <= 10'b0;
// yMax <= 10'b0;
//
// setup_counter <= 2'b00;
//
// det <= 0;
// c <= 0;
// f <= 0;
// end
//
// else if (stallOUT & !stallIN)
// begin
// if (setup_counter == 2'b00)
// begin
// det <= det1 - det2;
//
// c <= a - b;
// f <= e - d;
//
// setup_counter <= 2'b01;
// end
//
// else
// begin
// c <= c;
// f <= f;
// det <= det;
//
// setup_counter <= 2'b00;
//
// if (fragment_y <= yMax)
// begin
// if (fragment_x < xMax)
// begin
// fragment_x <= fragment_x + 27'b000000010000000000000000000;
// fragment_y <= fragment_y;
// end
//
// else
// begin
// fragment_y <= fragment_y + 27'b000000010000000000000000000;
// fragment_x <= xMin;
// end
//
// if (lambda1 > 0 & lambda2 > 0 & lambda3 > 0)
// fragment_c <= 16'b0000000000111111;
// else
// //HERE WE NEED TO PASS OUT NOT TO WRITE TO SRAM
// fragment_c <= 16'b0;
//
// stallOUT <= 1'b1;
//
// xMin <= xMin;
// xMax <= xMax;
//
// yMin <= yMin;
// yMax <= yMax;
// end
//
// else
// begin
// //HERE WE NEED TO PASS OUT NOT TO WRITE TO SRAM
// stallOUT <= 1'b0;
//
// fragment_x <= fragment_x;
// fragment_y <= fragment_y;
// fragment_c <= 16'b0;
//
// xMin <= xMin;
// xMax <= xMax;
//
// yMin <= yMin;
// yMax <= yMax;
// end
// end
// end
//
// else if (stallOUT & stallIN)
// begin
// stallOUT <= stallOUT;
// fragment_x <= fragment_x;
// fragment_y <= fragment_y;
// fragment_c <= fragment_c;
//
// xMin <= xMin;
// xMax <= xMax;
//
// yMin <= yMin;
// yMax <= yMax;
//
// setup_counter <= setup_counter;
//
// c <= c;
// f <= f;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -