// ============================================================================
// ca_vga_display.v - 一维CA的VGA显示控制器
// 每行=一步CA演化，水平方向=元胞位置
// 支持640x480 @60Hz VGA
// ============================================================================
module ca_vga_display #(
    parameter WIDTH   = 640,        // CA网格宽度=水平像素
    parameter HEIGHT  = 480,        // 显示行数=演化步数
    parameter H_SYNC  = 96,
    parameter H_BP    = 48,
    parameter H_FP    = 16,
    parameter V_SYNC  = 2,
    parameter V_BP    = 33,
    parameter V_FP    = 10
)(
    input  wire             clk,        // 25.175MHz像素时钟
    input  wire             rst_n,
    input  wire [WIDTH-1:0] ca_row,    // 当前CA行数据
    input  wire             ca_valid,   // CA数据有效
    output wire             hsync,
    output wire             vsync,
    output wire             video_en,   // 视频使能
    output wire [2:0]       rgb         // 3位颜色（1R+1G+1B）
);

    // ---- 时序计数器 ----
    reg [9:0] h_cnt;  // 水平计数器
    reg [9:0] v_cnt;  // 垂直计数器

    // 时序参数
    localparam H_TOTAL = 800;  // 640+96+48+16
    localparam V_TOTAL = 525;  // 480+2+33+10

    // ---- 时序生成 ----
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            h_cnt <= 10'd0;
            v_cnt <= 10'd0;
        end else begin
            if (h_cnt == H_TOTAL - 1) begin
                h_cnt <= 10'd0;
                if (v_cnt == V_TOTAL - 1)
                    v_cnt <= 10'd0;
                else
                    v_cnt <= v_cnt + 10'd1;
            end else begin
                h_cnt <= h_cnt + 10'd1;
            end
        end
    end

    // ---- 同步信号 ----
    assign hsync = (h_cnt >= 640+16 && h_cnt < 640+16+96) ? 1'b0 : 1'b1;
    assign vsync = (v_cnt >= 480+10 && v_cnt < 480+10+2)  ? 1'b0 : 1'b1;

    // ---- 显示区域 ----
    wire active = (h_cnt < 640 && v_cnt < 480);

    // ---- CA数据渲染 ----
    // 使用行缓冲存储当前行的CA数据
    reg [WIDTH-1:0] line_buf [0:HEIGHT-1];
    reg [9:0]       write_row;

    always @(posedge clk) begin
        if (ca_valid) begin
            line_buf[write_row] <= ca_row;
            write_row <= (write_row == HEIGHT - 1) ? 10'd0 : write_row + 10'd1;
        end
    end

    // 像素颜色
    wire pixel_on = active && line_buf[v_cnt[8:0]][h_cnt];

    assign video_en = active;
    assign rgb = pixel_on ? 3'b111 : 3'b000;  // 白色=活，黑色=死

endmodule