// ============================================================================
// 通用一维元胞自动机框架
// ca_core_1d.v - 支持任意Wolfram规则的通用一维CA引擎
// ============================================================================
module ca_core_1d #(
    parameter WIDTH = 64,           // 元胞网格宽度
    parameter RULE  = 30            // Wolfram规则号 (0-255)
)(
    input  wire             clk,    // 时钟
    input  wire             rst_n,  // 异步复位（低有效）
    input  wire             enable, // 使能信号
    input  wire             init,   // 初始化脉冲
    input  wire [WIDTH-1:0] seed,   // 初始种子
    output wire [WIDTH-1:0] state,  // 当前状态输出
    output wire             done    // 完成标志（可选）
);

    // ---- 双缓冲：当前状态与下一状态 ----
    reg [WIDTH-1:0] curr_state;
    reg [WIDTH-1:0] next_state;

    // ---- 规则查找表（组合逻辑实现） ----
    // 8种邻域模式 → 对应输出位
    // 位序: bit7=111, bit6=110, ..., bit0=000
    localparam [7:0] RULE_LUT = RULE[7:0];

    // ---- 邻域提取与规则应用 ----
    // 对每个元胞，提取其3位邻域，查表得到下一状态
    genvar i;
    generate
        for (i = 0; i < WIDTH; i = i + 1) begin : gen_cell
            // 环形边界条件：首尾相连
            wire left  = (i == 0)        ? curr_state[WIDTH-1] : curr_state[i-1];
            wire self  = curr_state[i];
            wire right = (i == WIDTH-1)  ? curr_state[0]       : curr_state[i+1];

            // 3位邻域编码为索引
            wire [2:0] neighborhood = {left, self, right};

            // 查表：从8位规则中选取对应位
            assign next_state[i] = RULE_LUT[neighborhood];
        end
    endgenerate

    // ---- 状态寄存器更新 ----
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            curr_state <= {WIDTH{1'b0}};  // 全部归零
        end else if (init) begin
            curr_state <= seed;           // 加载初始种子
        end else if (enable) begin
            curr_state <= next_state;     // 同步更新
        end
    end

    // ---- 输出 ----
    assign state = curr_state;
    assign done  = 1'b0;  // CA通常持续运行，无"完成"概念

endmodule