// ============================================================================
// pattern_generator.v - CA图案生成器
// 支持多种图案模式、颜色映射和参数化控制
// 输出适合VGA/HDMI显示的像素流
// ============================================================================
module pattern_generator #(
    parameter WIDTH   = 640,
    parameter HEIGHT  = 480,
    parameter MODES   = 8         // 图案模式数
)(
    input  wire              clk,
    input  wire              rst_n,
    input  wire [2:0]        mode,          // 图案模式选择
    input  wire              enable,
    input  wire [7:0]        param1,        // 参数1（规则号/阈值等）
    input  wire [7:0]        param2,        // 参数2
    input  wire [3:0]        color_scheme,  // 颜色方案
    output wire [23:0]       pixel_out,     // 24位RGB输出
    output wire              pixel_valid,
    output wire [9:0]        pixel_x,
    output wire [9:0]        pixel_y
);

    // ---- CA状态缓冲 ----
    reg [WIDTH-1:0] ca_curr;
    reg [WIDTH-1:0] ca_next;
    reg [8:0]       row_cnt;
    reg [31:0]      frame_cnt;

    // ---- 规则应用 ----
    integer x;
    always @(*) begin
        for (x = 0; x < WIDTH; x = x + 1) begin
            reg L, R;
            L = (x == 0) ? ca_curr[WIDTH-1] : ca_curr[x-1];
            R = (x == WIDTH-1) ? ca_curr[0] : ca_curr[x+1];
            case (mode)
                3'd0: ca_next[x] = param1[{L, ca_curr[x], R}];  // 1D Wolfram
                3'd1: ca_next[x] = L ^ ca_curr[x] ^ R;           // 规则150
                3'd2: ca_next[x] = L ^ R;                          // 规则90
                3'd3: ca_next[x] = L ^ (ca_curr[x] | R);          // 规则30
                default: ca_next[x] = param1[{L, ca_curr[x], R}];
            endcase
        end
    end

    // ---- 颜色映射 ----
    reg [7:0] r, g, b;
    always @(*) begin
        case (color_scheme)
            4'd0: begin  // 经典黑白
                r = ca_curr[pixel_x[5:0]] ? 8'hFF : 8'h00;
                g = ca_curr[pixel_x[5:0]] ? 8'hFF : 8'h00;
                b = ca_curr[pixel_x[5:0]] ? 8'hFF : 8'h00;
            end
            4'd1: begin  // 粉红渐变
                r = ca_curr[pixel_x[5:0]] ? 8'hEC : 8'h0D;
                g = ca_curr[pixel_x[5:0]] ? 8'h48 : 8'h11;
                b = ca_curr[pixel_x[5:0]] ? 8'h99 : 8'h17;
            end
            4'd2: begin  // 热力图
                r = ca_curr[pixel_x[5:0]] ? {frame_cnt[7:0]} : 8'h00;
                g = 8'h00;
                b = ca_curr[pixel_x[5:0]] ? 8'h80 : 8'h00;
            end
            default: begin
                r = ca_curr[pixel_x[5:0]] ? 8'hFF : 8'h00;
                g = g; b = b;
            end
        endcase
    end

    assign pixel_out = {r, g, b};

    // ---- 时序控制 ----
    reg [9:0] px, py;
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            px <= 10'd0; py <= 10'd0;
            row_cnt <= 9'd0; frame_cnt <= 32'd0;
        end else if (enable) begin
            if (px == WIDTH - 1) begin
                px <= 10'd0;
                if (py == HEIGHT - 1) begin
                    py <= 10'd0;
                    frame_cnt <= frame_cnt + 32'd1;
                end else begin
                    py <= py + 10'd1;
                end
                // 每行推进CA一步
                ca_curr <= ca_next;
            end else begin
                px <= px + 10'd1;
            end
        end
    end

    assign pixel_x = px;
    assign pixel_y = py;
    assign pixel_valid = enable;

endmodule