//====================================================================
// msaa_unit.v - MSAA抗锯齿单元
// 第20课：多样本覆盖测试与解析
//====================================================================
module msaa_unit #(
    parameter COLOR_WIDTH = 24,
    parameter SAMPLE_COUNT = 4,
    parameter COORD_WIDTH = 16
)(
    input  wire                          clk, rst_n,
    input  wire                          pixel_valid,
    input  wire [COORD_WIDTH-1:0]        pixel_x, pixel_y,
    input  wire [SAMPLE_COUNT-1:0]       sample_covered,
    input  wire [COLOR_WIDTH-1:0]        sample_colors [0:SAMPLE_COUNT-1],
    output reg                           pixel_ready,
    output reg  [COLOR_WIDTH-1:0]        resolved_color,
    output reg                           result_valid
);
/* verilator lint_off WIDTHEXPAND */
/* verilator lint_off WIDTHTRUNC */
/* verilator lint_off CASEOVERLAP */
/* verilator lint_off CMPCONST */
/* verilator lint_off UNSIGNED */
/* verilator lint_off WIDTHCONCAT */

    reg [7:0] acc_r, acc_g, acc_b;
    reg [1:0] covered_count;
    localparam S_IDLE=2'd0, S_ACCUM=2'd1, S_RESOLVE=2'd2, S_OUT=2'd3;
    reg [1:0] state;
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin state<=S_IDLE; pixel_ready<=1; result_valid<=0; end
        else begin
            result_valid <= 0;
            case (state)
                S_IDLE: begin
                    pixel_ready <= 1;
                    if (pixel_valid) begin
                        pixel_ready <= 0;
                        acc_r <= 0; acc_g <= 0; acc_b <= 0;
                        covered_count <= 0;
                        state <= S_ACCUM;
                    end
                end
                S_ACCUM: begin
                    // 累加覆盖样本的颜色
                    if (sample_covered[0]) begin acc_r <= acc_r + sample_colors[0][23:16]; acc_g <= acc_g + sample_colors[0][15:8]; acc_b <= acc_b + sample_colors[0][7:0]; covered_count <= covered_count + 1; end
                    if (sample_covered[1]) begin acc_r <= acc_r + sample_colors[1][23:16]; acc_g <= acc_g + sample_colors[1][15:8]; acc_b <= acc_b + sample_colors[1][7:0]; covered_count <= covered_count + 1; end
                    if (sample_covered[2]) begin acc_r <= acc_r + sample_colors[2][23:16]; acc_g <= acc_g + sample_colors[2][15:8]; acc_b <= acc_b + sample_colors[2][7:0]; covered_count <= covered_count + 1; end
                    if (sample_covered[3]) begin acc_r <= acc_r + sample_colors[3][23:16]; acc_g <= acc_g + sample_colors[3][15:8]; acc_b <= acc_b + sample_colors[3][7:0]; covered_count <= covered_count + 1; end
                    state <= S_RESOLVE;
                end
                S_RESOLVE: begin
                    // 解析：求平均
                    case (covered_count)
                        2'd0: resolved_color <= 24'h000000;
                        2'd1: resolved_color <= {acc_r, acc_g, acc_b};
                        2'd2: resolved_color <= {acc_r>>1, acc_g>>1, acc_b>>1};
                        2'd3: resolved_color <= {acc_r/3, acc_g/3, acc_b/3};  // 3 samples
                        2'd3: resolved_color <= {acc_r>>2, acc_g>>2, acc_b>>2};
                    endcase
                    state <= S_OUT;
                end
                S_OUT: begin
                    result_valid <= 1; state <= S_IDLE;
                end
                default: state <= S_IDLE;
            endcase
        end
    end
endmodule