康威生命游戏-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(integer i=0;i<$bits(q);i++)begin
if(i==0)//左上角
cnt=q[255]+q[241]+q[240]+q[31]+q[15]+q[17]+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+1]+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];
if(cnt==0||cnt==1||cnt>=4)
q_next[i]=0;
else if(cnt==2)
q_next[i]=q[i];
else
q_next[i]=1;
end
end
always @(posedge clk)
if(load)
q<=data;
else
q<=q_next;
endmodule
tips:上面这种写法,逻辑清晰,比较容易理解,把格子分成3大区域,先统计邻居格子之和,再判断当前格子的下一状态。缺点是,一个格子有8个邻居,统计表达式容易输入出错。另,判断和时,如果用case语句,HDLbits的编译会卡住,用if else则顺利通过。
浙公网安备 33010602011771号