Conway 's game of life 16*16 (HDLBits)

问题

img

img


https://hdlbits.01xz.net/wiki/Conwaylife

我的思路

将所有元素分为3类:角、边和中间部分,其中角上的元素有4个,有上下左右4个边界,剩余的组成了中间部分。

img


其中256个元素分别用坐标(行,列)的形式表示,绿色角标对应该坐标在0-255中的序号。

我的程序

module top_module(
input clk,
input load,
input [255:0] data,
output [255:0] q
);

integer i;
reg [3:0] counter;
reg [497:0] temp;
reg [255:0] q_next;

always@(*)
    for(i=0;i<256;i=i+1)
        begin
            counter = 4'd0;
            temp[255:0] = q;
            if(i==0 | i==15 | i==240 | i==255)  //角
                case(i)
                    8'd000: counter = temp[255]+temp[240]+temp[241]+temp[15]+temp[1]+temp[31]+temp[16]+temp[17];
                    8'd015: counter = temp[254]+temp[255]+temp[240]+temp[14]+temp[0]+temp[30]+temp[31]+temp[16];
                    8'd240: counter = temp[239]+temp[224]+temp[225]+temp[255]+temp[241]+temp[15]+temp[0]+temp[1];
                    8'd255: counter = temp[238]+temp[239]+temp[224]+temp[254]+temp[240]+temp[14]+temp[15]+temp[0];
                endcase
            else if(i%16==0)  //左边界(角除外)
                counter = temp[i-1]+temp[i-16]+temp[i-15]+temp[i+15]+temp[i+1]+temp[i+31]+temp[i+16]+temp[i+17];
            else if(i%16==15)  //右边界(角除外)
                counter = temp[i-17]+temp[i-16]+temp[i-31]+temp[i-1]+temp[i-15]+temp[i+15]+temp[i+16]+temp[i+1];
            else if(0<i<15)  //上边界(角除外)
                counter = temp[i+239]+temp[i+240]+temp[i+241]+temp[i-1]+temp[i+1]+temp[i+15]+temp[i+16]+temp[i+17];
            else if(240<i<255)  //下边界(角除外)
                counter = temp[i-17]+temp[i-16]+temp[i-15]+temp[i-1]+temp[i+1]+temp[i-241]+temp[i-240]+temp[i-239];
            else  //中间部分
                counter = temp[i-17]+temp[i-16]+temp[i-15]+temp[i-1]+temp[i+1]+temp[i+15]+temp[i+16]+temp[i+17];
            case(counter)
                4'd2: q_next[i] = temp[i];
                4'd3: q_next[i] = 1'b1;
                default: q_next[i] = 1'b0;  //0,1,4~8
            endcase
        end

always@(posedge clk)
    if(load)
        q <= data;
    else
        q <= q_next;

endmodule

运行结果及报错内容

img

img