Verilog刷题HDLBits——Conwaylife

news/2024/11/30 9:29:16/

Verilog刷题HDLBits——Conwaylife

  • 题目描述
  • 代码
  • 结果

题目描述

Conway’s Game of Life is a two-dimensional cellular automaton.

The “game” is played on a two-dimensional grid of cells, where each cell is either 1 (alive) or 0 (dead). At each time step, each cell changes state depending on how many neighbours it has:

  • 0-1 neighbour: Cell becomes 0.
  • 2 neighbours: Cell state does not change.
  • 3 neighbours: Cell becomes 1.
  • 4+ neighbours: Cell becomes 0.

The game is formulated for an infinite grid. In this circuit, we will use a 16x16 grid. To make things more interesting, we will use a 16x16 toroid, where the sides wrap around to the other side of the grid. For example, the corner cell (0,0) has 8 neighbours: (15,1), (15,0), (15,15), (0,1), (0,15), (1,1), (1,0), and (1,15). The 16x16 grid is represented by a length 256 vector, where each row of 16 cells is represented by a sub-vector: q[15:0] is row 0, q[31:16] is row 1, etc. (This tool accepts SystemVerilog, so you may use 2D vectors if you wish.)

  • load: Loads data into q at the next clock edge, for loading initial state.
  • q: The 16x16 current state of the game, updated every clock cycle.

The game state should advance by one timestep every clock cycle.

John Conway, mathematician and creator of the Game of Life cellular automaton, passed away from COVID-19 on April 11, 2020.

给出的第一种解法是可以正常运行的,但是我个人认为比较麻烦,我想到的是第二种解法,通过4位二进制数表示行列,15+1时溢出变回0,0-1时通过补码变为15,从而完成在边界地区状态的计算,但是代码未能成功运行,我水平有限没能修改成功,希望有兴趣的兄弟可以看看修改一下,如果运行成功了,希望能在评论区告知我是哪里有问题。

代码

// 能成功运行的解法,也是大多数人的解法
module top_module(input clk,input load,input [255:0] data,output [255:0] q ); reg[3:0] sum;always@(posedge clk)beginif(load)q<=data;elsebeginfor(int i=0;i<=255;i++)beginif(i==0)sum=q[240]+q[241]+q[255]+q[16]+q[17]+q[1]+q[31]+q[15]; else if(i==15)sum=q[30]+q[31]+q[16]+q[14]+q[0]+q[254]+q[255]+q[240];else if(i==240)sum=q[15]+q[0]+q[1]+q[255]+q[241]+q[239]+q[224]+q[225];else if(i==255)sum=q[0]+q[14]+q[15]+q[254]+q[240]+q[239]+q[238]+q[224];else if(i>0&&i<15)sum=q[i+16]+q[i+15]+q[i+17]+q[i-1]+q[i+1]+q[i+240]+q[i+239]+q[i+241];else if(i>240&&i<255)sum=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%16==15)sum=q[i+16]+q[i+15]+q[i-1]+q[i+1]+q[i-15]+q[i-17]+q[i-16]+q[i-31];else if(i%16==0)sum=q[i+31]+q[i+16]+q[i+17]+q[i+15]+q[i+1]+q[i-1]+q[i-16]+q[i-15];elsesum=q[i-1]+q[i+1]+q[i+16]+q[i+15]+q[i+17]+q[i-16]+q[i-15]+q[i-17];case(sum)4'd2:q[i]<=q[i];4'd3:q[i]<=1;default:q[i]<=0;endcaseendendendendmodule// 我的另一种思路,但是代码还存在问题,水平有限还没能解决
// 如果有兄弟改进了我的代码成功运行了,希望能评论告知我是哪里有问题module top_module(input clk,input load,input [255:0] data,output [255:0] q ); reg[3:0] count;reg[3:0] row,column;reg[255:0] ul;// 左上reg[255:0] up;// 正上reg[255:0] ur;// 右上reg[255:0] left;// 正左reg[255:0] right;// 正右reg[255:0] dl;// 左下reg[255:0] down;// 正下reg[255:0] dr;// 右下always@(posedge clk)beginif(load)q<=data;elsebeginfor(int i=0;i<256;i++)// 遍历每一个q[i],算出他所在的行列beginrow<=i/16;column<=i%16;ul<=(row+4'b0001)*16+column+4'b1111;// 通过补码方式算出他周围8个格子对应的iup<=(row+4'b0001)*16+column;		// 15+1第5位溢出直接变回0ur<=(row+4'b0001)*16+column+4'b0001;// 0-1通过补码方式计算得到15left<=(row)*16+column+4'b1111;right<=(row)*16+column+4'b0001;dl<=(row+4'b1111)*16+column+4'b1111;down<=(row+4'b1111)*16+column;dr<=(row+4'b1111)*16+column+4'b0001;count<=q[ul]+q[up]+q[ur]+q[left]+q[right]+q[dl]+q[down]+q[dr];case(count)4'b0010:q[i]<=q[i];4'b0011:q[i]<=1;default:q[i]<=0;endcaseendendendendmodule

结果

在这里插入图片描述


http://www.ppmy.cn/news/3915.html

相关文章

24. 两两交换链表中的节点

文章目录题目描述做题思路代码实现题目链接题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; 输入&#xff1a;head [1,2…

Linux如何查看文件的总大小?

在Linux中&#xff0c;查看文件的总大小的方法分别包括&#xff1a;stat命令、wc命令、du命令、ls命令&#xff0c;接下来通过这篇文章为大家详细的介绍一下。 Linux中内置了多种命令来查看文件大小&#xff0c;具体请看下文&#xff1a; 1、stat命令 stat命令用于显示文件的状…

是否有 API 可供云对接?

涂鸦提供了两种维度供开发者拉取&#xff1a;应用维度、产品维度。 应用维度&#xff1a;设备绑定的用户属于开发者在涂鸦云应用中的用户&#xff0c;开发者间接拥有权限操作属于自己应用用户的设备&#xff1b; 产品维度&#xff1a;设备所属产品属于开发者在涂鸦云产品中的设…

吃透这份 “ 自动化测试 ” 核心技术栈,月薪30K还不是随便叫

为了帮助大家快速回顾学习自动化测试中的知识点&#xff0c;分享一下这些年来&#xff0c;我对于技术一些归纳和总结&#xff0c;和自己对作为一名 高级测试工程师需要掌握那些技能的笔记分享&#xff0c;希望能帮助到有心在技术这条道路上一路走到黑的朋友&#xff01; 一、L…

编译robotics_transformer

编译tensor2robot GitHub - google-research/tensor2robot: Distributed machine learning infrastructure for large-scale robotics research 2.编译proto文件为python文件 robotrobot:~/ref$ mkdir protoc_3.3 robotrobot:~/ref$ cd protoc_3.3/ robotrobot:~/ref/protoc…

Redis持久化没玩明白,你就会把缓存数据丢了

引言 我们都知道Redis是微服务架构中重要的基础数据库中间件&#xff0c;通过Redis可以将数据库中的数据缓存到内存中&#xff0c;当服务端有数据查询请求的时候&#xff0c;可以直接从内存中获取数据。如此&#xff0c;一方面服务端可以获得比较快的数据请求响应&#xff0c;…

【手把手】分布式定时任务调度解析之Elastic-Job

1、这货怎么没怎么听过 经常使用Quartz或者Spring Task的小伙伴们&#xff0c;或多或少都会遇到几个痛点&#xff0c;比如&#xff1a; 1、不敢轻易跟着应用服务多节点部署&#xff0c;可能会重复多次执行而引发系统逻辑的错误&#xff1b; 2、Quartz的集群仅仅只是用来HA&…

Okhttp源码分析实践(一)【HTTP的基础知识】

近期在看okhttp的源码,这块也正好与http知识相关联,那么就索性将这块知识挖到底,学习、回顾、总结一下,所以有了这个系列的文章。本系列文章,我们就几点来进行深入学习总结,基本按照一条线来学习,先学习基础理论知识,然后摸清基本门路之后,我们自己通过实践编码来一一…