在一个二维的棋盘上,每个格子有存活(1)和死亡(0)两种状态。在每个时间周期,每个格子会根据他的8个邻居来决定自己下一个周期的状态:

  • 0-1个邻居:人口稀少,死亡(0);
  • 2个邻居:保持原状态;
  • 3个邻居:繁衍(1);
  • 4+个邻居:人口过多,死亡(0);

这个游戏原来是设计在一个无限的网格里,但是在这个电路中,我们设计为16*16的网格,为了让这次练习更有趣,我们把网格边界拓扑环绕到对立的另一边。举个例子,(0,0)的8个邻居分别是(15,1), (15,0), (15,15), (0,1), (0,15), (1,1), (1,0), 和 (1,15).

我们把16*16的网格设置为一个256位的向量,每一行表示为q[15:0]、q[31:16]等等。

  • load:加载数据到q中作为初始状态。
  • q:16*16网格的当前状态,在每个时钟周期更新。

设计要点:

  1. 需要两个棋盘,一个存储现态,另一存储次态。
  2. 不能立即更新,需要现态中每个格子的8个邻居,不能将次态立即赋值给每个格子的现态。

设计思路:通过for循环语句遍历每一个格子,计算出每个格子的邻居数量,然后得到下一状态q_next。在每个边界应该分情况考虑,四个角和四个边的格子都有特殊的8个邻居。在遍历完256个格子之后将q_next的值赋给q,我们注意到在always过程块中,我们一律使用了阻塞赋值,因为不需要产生触发器,我们要在计算后立即赋值,才能做到没有一个周期的延迟。在Verilog中关系运算符不能这样使用:0<i<15,而应该0<i & i<15.

module top_module(input clk,input load,input [255:0] data,output [255:0] q ); reg [255:0] q_next;reg [3:0]sum;always@(posedge clk)if(load)q <= data;else beginfor(int i = 0;i < 256;i++) begin if(i==0)//左上角sum = q[1]+q[16]+q[17]+q[240]+q[241]+q[15]+q[31]+q[255];else if(i==15)//右上角sum = q[14]+q[16]+q[0]+q[240]+q[254]+q[30]+q[31]+q[255];else if(i==240)//左下角sum = q[0]+q[15]+q[239]+q[241]+q[1]+q[224]+q[225]+q[255];else if(i==255)//右下角sum = q[0]+q[15]+q[14]+q[224]+q[238]+q[240]+q[239]+q[254];else if(0<i & i<15)//上边界sum = q[i-1]+q[i+1]+q[i+15]+q[i+16]+q[i+17]+q[i+239]+q[i+240]+q[i+241];else if(i%16==0)//左边界sum = q[i-1]+q[i+1]+q[i+15]+q[i+16]+q[i+17]+q[i-16]+q[i-15]+q[i+31];else if(i%16==15)//右边界sum = q[i-1]+q[i+1]+q[i+15]+q[i+16]+q[i-17]+q[i-16]+q[i-15]+q[i-31];else if(240<i & i<255)//下边界sum = q[i-1]+q[i+1]+q[i-17]+q[i-16]+q[i-15]+q[i-239]+q[i-240]+q[i-241];else //非边界sum = q[i-1]+q[i+1]+q[i-17]+q[i-16]+q[i-15]+q[i+15]+q[i+16]+q[i+17];case(sum) //根据邻居数量判断次态2:q_next[i]=q[i];3:q_next[i]=1;default:q_next[i]=0;endcaseendq = q_next;endendmodule

上述程序较为繁琐,希望能够找到一个简单的方法,下面是有关的两个网站:

在线模拟康威生命游戏https://bitstorm.org/gameoflife/

https://rosettacode.org/wiki/Conway%27s_Game_of_Life#SystemVerilog

用Verilog实现二维细胞自动机——康威生命游戏(Conway's Game of Life)相关推荐

  1. Python - 康威生命游戏Conway's game of life

    使用python实现康威生命游戏Conway's game of life 参考<python极客项目编程> 游戏规则: 任何四周邻居存活数少于两个的存活网格将死亡,因为人口稀少. 任何四 ...

  2. Go语言模拟康威生命游戏Conway‘s Game of Life

    康威生命游戏是一种很有意思的游戏,显示的是细胞的生死状态取决于周边细胞(相邻8个细胞)的存活状态,是一种模拟生命的演化过程. 反过来看,还可模拟病毒的传染,患者传染给接触者,也可以设定概率,另外是否戴 ...

  3. 使用C++实现简单的二维细胞自动机

    使用C++实现简单的二维细胞自动机 细胞自动机(cellular automata)是为模拟包括自组织结构在内的复杂现象提供的一个强有力的方法,也称为元胞自动机(Cellular Automaton) ...

  4. 康威生命游戏是如何搭建计算机的?

    2020年4月,数学家约翰·康威(John H. Conway)因新冠肺炎去世.大家回顾康威教授平生贡献时,不可避免要提到伟大.深刻的"康威生命游戏"(Conway's Game ...

  5. Conwaylife_HDLbits(康威生命游戏)

    康威生命游戏:一个二维细胞自动机. "游戏"是在一个二维细胞网格上进行的,每个细胞要么是1(活的),要么是0(死的).判断依据和周围8个相邻有关. 使用一个16x16的圆环体,其中 ...

  6. 康威生命游戏简易版python_turtle实现

    以下资料引用至百度百科 ​ 康威生命游戏(Game of Life),剑桥大学约翰·何顿·康威设计的计算机程序. 概述: 生命游戏没有游戏玩家各方之间的竞争,也谈不上输赢,可以把它归类为仿真游戏.事实 ...

  7. Python | 实现简单的康威生命游戏

    康威生命游戏是由英国教授John Horton Conway提出的一种生命仿真游戏.其具体的形式是,所有的细胞生活在一个二维平面上,一个细胞在下一个时刻的生存状态取决于当前时刻周围的各个细胞的生存状态 ...

  8. [Codewar训练]Conway's Game of Life - Unlimited Edition(康威生命游戏)

    问题: 段位:4 说明: 就是经典的康威生命游戏,输入会提供一个二维数组,然后根据提供的generations,计算出多少代的生命样子,并且需要把多余的(就是整行整列为0),外围的空间去掉,只剩下概括 ...

  9. 康威生命游戏java_Java Python 康威生命游戏 - 命令行版

    Java & Python 康威生命游戏 - 命令行版(2020年7月23日) 制作背景 高二的时候看霍金的<大设计>最后几页的时候看到里面提到了康威生命游戏,介绍了它的规则,感觉 ...

最新文章

  1. Arduino 与 MPU6050 姿态解算+ PROCESSING
  2. myeclipse 没有任何问题,可偏偏还报这错。
  3. mxnet基础到提高(13)--Activation激活函数
  4. k8s API编程:kubebuilder实战案例sidecarset
  5. 结合html做界面_Spark UI界面实现原理
  6. 2020年中国.NET开发者大会第二天 WorkShop
  7. AttributeError: module 'pymysql' has no attribute 'escape' 错误的出现以及解决
  8. GitLab CTO:开源是打造优秀软件的核心
  9. Bus Hound使用心得#抓包工具#协议抓取
  10. pdfobject div中预览pdf
  11. FPGA串口波特率计算方法
  12. Win10 系统时间错误
  13. Excel之表格斜线一分为二后输入文字
  14. 解决Cipher Suites导致的“未能创建 SSL/TLS 安全通道”异常问题
  15. 如何将数据设计成报表模板
  16. OC callback
  17. React-2-项目的创建
  18. mysqld_safe 启动数据库报找不到 mysqld 启动文件
  19. 德州扑克游戏算法讲解
  20. 2021年安全员-A证考试总结及安全员-A证试题及解析

热门文章

  1. mysql wm_concat函数_wm_concat函数的排序问题
  2. 【论文解读】V2F-Net: Explicit Decomposition of Occluded Pedestrian Detection(遮挡行人的分解检测)
  3. python开发图片工具_工具|ImagePy:一款基于Python的高扩展性开源图像处理框架
  4. 便利店O2O大跃进 顺丰嘿店未过“烧钱期”
  5. 六大门派身份识别 (20 分)
  6. kt-connect使用-k8s流量代理
  7. MCMC和Gibbs Sampling
  8. 【随笔】2018年10月之家庭篇
  9. linux killall 源代码,Linux基础命令---杀死进程killall
  10. Linux下使用readline库实现2048游戏