惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
SegmentFault 最新的问题
爱范儿
爱范儿
博客园 - Franky
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
WordPress大学
WordPress大学
宝玉的分享
宝玉的分享
雷峰网
雷峰网
酷 壳 – CoolShell
酷 壳 – CoolShell
IT之家
IT之家
有赞技术团队
有赞技术团队
美团技术团队
Last Week in AI
Last Week in AI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
大猫的无限游戏
大猫的无限游戏
The Cloudflare Blog
Jina AI
Jina AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Engineering at Meta
Engineering at Meta
T
Tailwind CSS Blog
J
Java Code Geeks
Martin Fowler
Martin Fowler
I
InfoQ
小众软件
小众软件
MongoDB | Blog
MongoDB | Blog

博客园 - yf.x

超声波测距#倒车雷达#DE10-Lite 按键计数器#DE10-Lite 按键消抖#DE10-Lite 流水呼吸灯v2#DE10-Lite 流水呼吸灯-v1#DE10-Lite 呼吸灯-#DE10-Lite 流水灯#DE10-Lite#Verilog HDLBits_review 2015fsm 补码FSM-HDLbits 串行数据流输出其中的数据位-HDLbits 串行数据接收判断-HDLbits 输出PS2数据流-HDLbits PS2数据流检测状态机-HDLbits 独热码状态机-HDLbits 旅鼠4-HDLbits 旅鼠游戏3-HDLbits 旅鼠游戏2-HDLbits 旅鼠游戏--HDLbits 水库水位控制问题-HDLbits
康威生命游戏-hdlbits
yf.x · 2025-12-10 · via 博客园 - yf.x

把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则顺利通过。