Verilog刷题HDLBits——Conwaylife

news2024/11/26 16:56:50

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)
        begin
            if(load)
                q<=data;
            else
                begin
                    for(int i=0;i<=255;i++)
                        begin
                            if(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];
                            else
                                sum=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;
                            endcase
                        end
                end
        end

endmodule

// 我的另一种思路,但是代码还存在问题,水平有限还没能解决
// 如果有兄弟改进了我的代码成功运行了,希望能评论告知我是哪里有问题

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)
        begin
            if(load)
                q<=data;
            else
                begin
                    for(int i=0;i<256;i++)// 遍历每一个q[i],算出他所在的行列
                        begin
                            row<=i/16;
                            column<=i%16;
                            ul<=(row+4'b0001)*16+column+4'b1111;// 通过补码方式算出他周围8个格子对应的i
                            up<=(row+4'b0001)*16+column;		// 15+1第5位溢出直接变回0
                            ur<=(row+4'b0001)*16+column+4'b0001;// 0-1通过补码方式计算得到15
                            left<=(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;
                            endcase
                        end
                end
        end

endmodule

结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/92442.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【图像融合】小波变换(加权平均法+局域能量+区域方差匹配)图像融合【含Matlab源码 1819期】

⛄一、小波变换彩色图像融合简介 1 前言 图像融合是将不同传感器所获得的多个图像根据某种算法进行融合处理,取长补短,使一幅图像能够更清楚、更准确地反映多幅图像的信息,多聚焦彩色图像融合是图像融合的一个分支。目前在各种图像采集与分析系统中已使用的CCD数码相机,对于聚…

分享7 个VUE项目用得上的JavaScript库

借助开源库加速VUE项目的开发进度是现代前端开发比较常见的方式&#xff0c;平常收集一些JavaScript库介绍&#xff0c;在遇到需要的时候可以信手拈来。 VUE 生态有很多不错的依赖库或者组件&#xff0c;是使用VUE开发前端的原因之一。 1. vueuse 这是 GitHub 上星最多的库之…

【coarse-to-fine:基于频谱和空间损失约束】

UPanGAN: Unsupervised pansharpening based on the spectral and spatial loss constrained Generative Adversarial Network &#xff08;UPanGAN&#xff1a;基于频谱和空间损失约束的生成式对抗网络的无监督全色锐化&#xff09; 研究发现&#xff0c;在大多数基于神经网…

扎根底层核心技术:OPPO发布旗舰蓝牙音频SoC芯片

OPPO自研芯片能力更进一步。 2022年12月14日&#xff0c;OPPO发布自研芯片马里亚纳MariSilicon Y&#xff0c;作为一颗旗舰蓝牙音频SoC&#xff0c;实现了三大核心技术突破&#xff0c;使OPPO具备了计算连接能力的蓝牙SoC平台的设计能力。 这是OPPO发布的第二款自研芯片。去年…

初学者数据分析——Python职位全链路分析

最近在做Python职位分析的项目&#xff0c;做这件事的背景是因为接触Python这么久&#xff0c;还没有对Python职位有一个全貌的了解。所以想通过本次分析了解Python相关的职位有哪些、在不同城市的需求量有何差异、薪资怎么样以及对工作经验有什么要求等等。分析的链路包括&…

用了那么久的Vue,你了解Vue的报错机制吗?

Vue的5种处理Vue异常的方法 相信大家对Vue都不陌生。在使用Vue的时候也会遇到报错&#xff0c;也会使用浏览器的F12 来查看报错信息。但是你知道Vue是如何进行异常抛出的吗&#xff1f;vue 是如何处理异常的呢&#xff1f;接下来和大家介绍介绍&#xff0c;Vue是如何处理这几种…

【数据结构】树以及二叉树的概念

作者&#xff1a;一个喜欢猫咪的的程序员 专栏&#xff1a;《数据结构》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 目录 树的概念&#xff1a; 树的相关概念&#xff1a; 树如何表示&#xff…

Anaconda中Python虚拟环境的创建、使用与删除

本文介绍在Anaconda环境下&#xff0c;创建、使用与删除Python虚拟环境的方法。 在Python的使用过程中&#xff0c;我们常常由于不同Python版本以及不同第三方库版本的支持情况与相互之间的冲突情况&#xff0c;而需要创建不同的Python虚拟环境&#xff1b;在Anaconda的帮助下&…

如何使用Python构建Telegram机器人来生成随机引语

使用Python构建Telegram机器人以生成随机引语 聊天机器人是用于进行在线聊天对话的软件应用程序&#xff0c;通过文本或文本转语音的方式实现客户服务的自动化。[聊天机器人]可以用于提醒、预约等事情&#xff0c;也可以在社交媒体平台上使用。 在本教程中&#xff0c;我们将…

会自动化就能拿20K?不,你这顶多算会点皮毛···

前段时间公司要招2个自动化测试&#xff0c;同事面了几十个候选人&#xff0c;发现了一个很奇怪的现象&#xff0c;面试的时候&#xff0c;如果问的是框架api、脚本编写这些问题&#xff0c;基本上个个都能对答如流&#xff0c;等问到实际项目的时候&#xff0c;类似“怎么从0开…

如何实现一个基于WebRTC的音视频通信系统

文章有点长&#xff0c;推荐先收藏前言 目前市场上音视频技术方案大致分为以下几类&#xff0c;WebRTC因其超低延时、集成音视频采集传输等优点&#xff0c;是在线教育、远程会议等领域首选技术。 前言 目前市场上音视频技术方案大致分为以下几类&#xff0c;WebRTC因其超低延…

10年网安经验分享:一般人别瞎入网络安全行业

小白入门网络安全&#xff0c;如何选择方向&#xff1f; 如果你是一个新手小白&#xff0c;那么在最开始方向选择上面这一步是至关重要的&#xff0c;一旦你选错了那很可能就要和安全“saygoodbye”了。 很多小白刚开始的时候还没开始学会走就想着飞了&#xff0c;计算机功底…

四六级口语|考研复试口语|满满干货

目录 1.Which do you prefer to use, credit cards or cash?/Do you prefer the credit card or cash? 2.When you shop, do you prefer to go by yourself or with someone?

指针进阶(3)--玩转指针

指针进阶 内容不多&#xff0c;但面面俱到&#xff0c;都是精华 1.回调函数&#xff1a; 2.详解qsort函数参数&#xff1a; 回调函数就是&#xff0c;把一个函数的地址&#xff0c;放在函数指针中&#xff0c;然后将该指针作为一个参数&#xff0c;传到 另一个函数中&#x…

04.南瓜树低代码平台平台 分析后的感想

随着企业产品的不断完善&#xff0c;后续将有时间来推进产品转向低代码平台化。 低代码平台不是无代码平台&#xff0c;采用配置的方式完成UI/流程/报表的处理&#xff0c;有业务人员在完成基本的产品框架后&#xff0c;由研发人员完成业务规则代码固化&#xff0c;最终达到产…

MobSDK 封装MobSDK基础包

平台兼容性 Android Android CPU类型 iOS 适用版本区间&#xff1a;4.4 - 12.0 armeabi-v7a&#xff1a;支持&#xff0c;arm64-v8a&#xff1a;支持&#xff0c;x86&#xff1a;支持 原生插件通用使用流程&#xff1a; 购买插件&#xff0c;选择该插件绑定的项目。在HB…

3. 实例化Bean的三种方式

实例化Bean的三种方式 一、构造方法方式 1.1 BookDaoImpl package com.lin.dao.daoimpl;import com.lin.dao.BookDao;public class BookDaoImpl implements BookDao {public BookDaoImpl() {System.out.println("BookDao的无参构造器");}/*** 数据层实现*/public …

了解Linux 操作系统!开篇!!!

【推荐阅读】 Linux内核CPU调度域内容讲解 关于如何快速学好&#xff0c;学懂Linux内核。内含学习路线 一文了解Linux上TCP的几个内核参数调优 Linux 接口 Linux 系统是一种金字塔模型的系统&#xff0c;如下所示 应用程序发起系统调用把参数放在寄存器中(有时候放在栈中)…

Python解题 - CSDN周赛第15期 - 客栈的咖啡

本期遇上官方大放水&#xff0c;四道题里有三道都在每日一练里做过&#xff0c;再加上比赛时间不太友好&#xff0c;参与人数不多&#xff0c;问哥竟然混了个第一名&#xff0c;真是惭愧。。。就当是官方在奖励那些平时多多参加每日一练的童鞋们了。 第一题&#xff1a;求并集 …

Vue3响应式原理设计和实现

Vue3响应式原理设计和实现响应式什么是响应式手动响应式proxy代理对象响应式系统一个属性注册一个副作用函数一个属性注册多个副作用函数多个属性注册不同的副作用函数多个数据不同属性注册不同的副作用函数响应式 什么是响应式 响应式是一个过程&#xff0c;这个过程存在两个…