康威生命游戏-hdlbits

把16*16的格子分成三个区域,4个角,4条边和中间。每个格子有8个邻居,上下左右对角连接闭合。当邻居和是3,这个格子下一状态是1,和是2,下一状态保持,其他为0.

module top_module(
input clk,
input load,
input [255:0] data,
output [255:0] q );
reg [255:0]q_next;
reg [3:0]cnt;
always @(*)
begin
for(int i=0;i<$bits(q);i++)begin
if(i==0)//左上角
cnt=q[255]+q[241]+q[240]+q[31]+q[15]+q[1]+q[16]+q[1];
else if(i==15)//右上角
cnt=q[14]+q[0]+q[30]+q[31]+q[16]+q[254]+q[255]+q[240];
else if(i==240)//左下角
cnt=q[239]+q[224]+q[225]+q[255]+q[241]+q[15]+q[0]+q[1];
else if(i==255)//右下角
cnt=q[238]+q[239]+q[224]+q[254]+q[240]+q[14]+q[15]+q[0];
else if(i>0&&i<15)//上边
cnt=q[i-1]+q[i+i]+q[i-1+16]+q[i+16]+q[i+1+16]+q[i+16*15]+q[i+16*15-1]+q[i+16*15+1];
else if(i>240&&i<255)//下边
cnt=q[i-1]+q[i+1]+q[i-17]+q[i-16]+q[i-15]+q[i-1-16*15]+q[i-16*15]+q[i+1-16*15];
else if(i%16==0)//左边
cnt=q[i-16+15]+q[i-16]+q[i+1-16]+q[i+15]+q[i+1]+q[i+16]+q[i+16+15]+q[i+16+1];
else if(i%16==15)//右边
cnt=q[i-16-1]+q[i-16]+q[i-16-15]+q[i-1]+q[i-15]+q[i+16]+q[i+16-1]+q[i+16-15];
else
cnt=q[i-1]+q[i+1]+q[i-16]+q[i-16-1]+q[i-16+1]+q[i+16]+q[i+16-1]+q[i+16+1];
case(cnt)
4'd2:q_next[i]=q[i];
4'd3:q_next[i]=1'b1;
default:q_next=1'b0;
endcase
end
end

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

posted on 2025-12-10 17:20  yf.x  阅读(1)  评论(0)    收藏  举报

导航