康威生命游戏:一个二维细胞自动机。
“游戏”是在一个二维细胞网格上进行的,每个细胞要么是1(活的),要么是0(死的)。判断依据和周围8个相邻有关。 使用一个16x16的圆环体,其中的边环绕到网格的另一侧。
//在这里我分情况考虑:
分三种情况,(1)中间部分 ,(2)四个角,(3)边缘行或列
module top_module(
input clk,
input load,
input [255:0] data,
output [255:0] q );
reg [3:0] n;
reg [8:0] i;
always @(posedge clk)
begin
if(load) q<=data;
else
begin
for(i=0;i<=255;i++)
begin
//分三种情况,中间部分,四个角,边缘行或列
//四个角
if(i==0) n=q[1]+q[15]+q[16]+q[17]+q[31]+q[240]+q[255]+q[241];
else if(i==15) n=q[14]+q[0]+q[16]+q[30]+q[31]+q[255]+q[240]+q[254];
else if(i==240) n=q[1]+q[15]+q[0]+q[224]+q[225]+q[239]+q[255]+q[241];
else if(i==255) n=q[14]+q[0]+q[15]+q[239]+q[224]+q[238]+q[240]+q[254];
//第一行
else if(i<15) n=q[i-1]+q[i+1]+q[i+16]+q[i+15]+q[i+17]+q[i+240]+q[i+239]+q[i+241];
//最上面(后)一行
else if(i>240) n=q[i-1]+q[i+1]+q[i-16]+q[i-15]+q[i-17]+q[i-240]+q[i-239]+q[i-241];
//第一列
else if(((i+1)%16)==0) n=q[i-1]+q[i-15]+q[i+16]+q[i+15]+q[i+1]+q[i-16]+q[i-31]+q[i-17];
//最右端一列
else if((i%16)==0) n=q[i+1]+q[i+15]+q[i+16]+q[i+31]+q[i+17]+q[i-16]+q[i-1]+q[i-15];
else n=q[i-1]+q[i+1]+q[i+16]+q[i+15]+q[i+17]+q[i-16]+q[i-15]+q[i-17];
if(n==3) q[i]<=1; else if((n<2)|(n>3)) q[i]<=0;
end
end
end
endmodule
感觉是比较繁杂的写法了。看到别人的做法是把16x16扩展成18x18来做,这样就将neighbour的取法统一了。看上去简单明了多了。