// 邻域比较器 - 计算Moore和VN邻域的差异
module neighborhood_compare #(
    parameter WIDTH = 64
)(
    input  wire [WIDTH-1:0] row_above,
    input  wire [WIDTH-1:0] row_curr,
    input  wire [WIDTH-1:0] row_below,
    output wire [3:0] moore_count  [0:WIDTH-1],
    output wire [2:0] vn_count     [0:WIDTH-1],
    output wire [WIDTH-1:0] diff    // Moore≠VN的位置
);
    genvar i;
    generate
        for (i = 0; i < WIDTH; i = i + 1) begin : gen_cmp
            wire left  = (i == 0) ? row_curr[WIDTH-1] : row_curr[i-1];
            wire right = (i == WIDTH-1) ? row_curr[0] : row_curr[i+1];
            // Von Neumann: 上下左右
            assign vn_count[i] = row_above[i] + row_below[i] + left + right;
            // Moore: 加上4个对角
            wire ul = (i > 0) ? row_above[i-1] : row_above[WIDTH-1];
            wire ur = (i < WIDTH-1) ? row_above[i+1] : row_above[0];
            wire ll = (i > 0) ? row_below[i-1] : row_below[WIDTH-1];
            wire lr = (i < WIDTH-1) ? row_below[i+1] : row_below[0];
            assign moore_count[i] = vn_count[i] + ul + ur + ll + lr;
            // 差异检测
            assign diff[i] = (moore_count[i][2:0] != vn_count[i]);
        end
    endgenerate
endmodule