HDLbits_Conwaylife
题目介绍
题目链接
简介
题目要求我们实现一个康威生命游戏的电路。
该游戏在一个二维网格空间中进行,在该题目中是 16 * 16 的大小,每一个格子都有两种状态(0 或 1),代表死或活。
规则:
- 在时钟上升沿到来时,网格需要更新。
- 若信号 load 为高电平,则更新为输入数据 data。
- 若不是,则每个网格的状态更新与它周围八个方向的网格状态有关。
- 如果它周围八个方向的网格有 2个为活,则保持状态。
- 如果它周围八方方向的网格有 3个为活,则该网格的状态更新为 1(活)。
- 其他情况下,该网格状态更新为 0(死)。
- 网格是二维的,但是存储网格是一维存储的。q[15 : 0] 是第0行, q[31 : 16] 是 第1行。
- 该二维 16 * 16的网格是无边界的,一边会延申到另一对边。

题目分析
解法1
因为是延申的网络,所以我们可以将该 16 * 16的网络直接延申为 18 * 18 的网络。这样,中心 16 * 16 的网格就是我们要更新的,外面的一圈就是环形的延申出的网络。
然后,就可以直接利用循环,避开越界的情况,直接更新了。
解法2
对于某个格子,暴力枚举出它每个方向的 格子情况,然后计算出它周围的存活格子数,再更新它。循环256次,将所有格子更新便可。
那么现在,定义这 8 个方向,分别为(up, down, left, right, up_left, up_right, down_left, down_right)。
变量简记为:
wire [255:0] q_u;
wire [255:0] q_l;
wire [255:0] q_r;
wire [255:0] q_d;
wire [255:0] q_ul;
wire [255:0] q_ur;
wire [255:0] q_dl;
wire [255:0] q_dr;
首先来看,上下左右这四个方向如何计算。
上下方向
原网格定义为,output [255 : 0] q。那么对于编号为 i 的网格单元。它的上方向的网格编号显然是 i - 16。
但若 i 单元在第 0 行,那么 i - 16 会是一个负数,实际上,应该是在第 15 行。
所以,利用Verilog的向量拼接运算即可。
assign q_u = {q[239:0], q[255:240]};
同理
assign q_d = {q[15:0], q[255:16]};
左右方向
对于网格单元 i ,左面是 i - 1。但当该单元格在第 0列时,它的左面应该是同一行的第 15列。右面同理。
for (i = 0; i < 16; i ++ ) begin: t1
assign q_l[i * 16 + 15 : i * 16] = {q[i * 16 + 15 - 1 : i * 16], q[i * 16 + 15]};
assign q_r[i * 16 + 15 : i * 16] = {q[i * 16], q[i * 16 + 15 : i * 16 + 1]};
end
对角线方向
当处理对角线的情况时候,就不能与上下左右同理了。
你会发现特殊情况(越界)有很多(一行和一列),所以这时候,直接利用之前算出的上下方向,结合左右方向的计算过程,就可以得出 对角线方向了。
网格单元 i 的上面的左面,不就是左上嘛?
代码实现
代码中涉及generate for块。
module top_module(
input clk,
input load,
input [255:0] data,
output [255:0] q );
wire [255:0] q_u;
wire [255:0] q_l;
wire [255:0] q_r;
wire [255:0] q_d;
wire [255:0] q_ul;
wire [255:0] q_ur;
wire [255:0] q_dl;
wire [255:0] q_dr;
integer j;
reg [3:0] cnt;
assign q_u = {q[239:0], q[255:240]};
assign q_d = {q[15:0], q[255:16]};
genvar i;
generate
for (i = 0; i < 16; i ++ ) begin: t1
assign q_l[i * 16 + 15 : i * 16] = {q[i * 16 + 15 - 1 : i * 16], q[i * 16 + 15]};
assign q_r[i * 16 + 15 : i * 16] = {q[i * 16], q[i * 16 + 15 : i * 16 + 1]};
assign q_ul[i * 16 + 15 : i * 16] = {q_u[i * 16 + 15 - 1 : i * 16], q_u[i * 16 + 15]};
assign q_ur[i * 16 + 15 : i * 16] = {q_u[i * 16], q_u[i * 16 + 15 : i * 16 + 1]};
assign q_dl[i * 16 + 15 : i * 16] = {q_d[i * 16 + 15 - 1 : i * 16], q_d[i * 16 + 15]};
assign q_dr[i * 16 + 15 : i * 16] = {q_d[i * 16], q_d[i * 16 + 15 : i * 16 + 1]};
end
endgenerate
always @(posedge clk) begin
if (load) begin
q <= data;
end
else begin
for (j = 0; j < 256; j = j + 1) begin
cnt = q_u[j] + q_d[j] + q_l[j] + q_r[j] + q_ul[j] + q_ur[j] + q_dl[j] + q_dr[j];
case (cnt)
4'd2: q[j] <= q[j];
4'd3: q[j] <= 1;
default: q[j] <= 0;
endcase
end
end
end
endmodule
generate for块
generate for的主要功能就是对模块或组件以及always块、assign语句进行复制。
使用 generate for的时候,必须要注意以下几点要求
- 在使用
generate for的时候必须先声明一个 genvar变量,用作 for的循环变量。genvar是generate语句中的一种变量类型,用于在generate for语句中声明一个正整数的索引变量。 for里面的内嵌语句,必须写在begin-end里- 尽量对
begin-end顺序块进行命名
generate for的语法示例如下:
genvar i;
generate for (i = 0; i < 4; i = i + 1) begin: gen_assign_temp
assign temp[i] = indata[2 * i + 1 : 2 * i];
end
endgenerate
随机推荐
- python 环境下使用PIP 报错的解决方法
最近做一个小程序项目,使用djangorestframework,安装restframework 出现错误,安装环境Python2.7:出现错误如下: "UnicodeEncodeErro ...
- Python Excel 操作 | xlrd+xlwt 模块笔记
Python 的pandas模块使用xlrd作为读取 excel 文件的默认引擎.但是,xlrd在其最新版本(从 2.0.1 版本开始)中删除了对 xls 文件以外的任何文件的支持. xlsx fil ...
- R 包 pathview 代谢通路可视化
pathview R 包是一个集成 pathway 通路数据与可视化的工具集.它用于把用户的数据映射并渲染到相关的 pathway 通路图上,用户只需要提供基因或者化合物数据(gene or comp ...
- PyInstaller 完美打包 Python 脚本,输出结构清晰、便于二次编辑的打包程序
引入问题 如果我要写一个 Python 项目,打包成 exe 运行(方便在没有 Python 的电脑上使用),我需要打包出的根目录结构美观,没有多余的.杂乱的依赖文件在那里碍眼,而且需要在发现 bug ...
- @SuppressWarnings注解的使用
Java编译器在编译代码时,会产生一些安全警告信息.如果被@SuppressWarnings注解标记的元素,就可以告诉编译器抑制指定的警告. 先看看@SuppressWarnings注解在Java S ...
- 行行AI人才直播第3期:浙江大学周鑫博士《空中机器人复杂环境高效自主导航—从单机到集群》
行行AI人才是博客园和顺顺智慧共同运营的AI行业人才全生命周期服务平台. 空中飞行的无人车.无人机集群是科幻电影的常客,也往往是未来科技的一大代表.在电影<星球大战:西斯的复仇>(2005 ...
- 3 分钟为英语学习神器 Anki 部署一个专属同步服务器
原文链接:https://icloudnative.io/posts/anki-sync-server/ Anki 介绍 Anki 是一个辅助记忆软件,其本质是一个卡片排序工具--即依据使用者对卡片上 ...
- 鸿蒙星空的太白星 | WebView给元服务调用JS API指明方向
漆黑深夜夜凉如水,繁星盛开于无垠苍穹.清风徐来,一片薄云,夜空顿然失色,有些阴霾.天空中最亮的星,太白星,在薄云中依然闪耀,如同海上迷雾中的灯塔,为迷失方向的船只指明方向. 元服务是华为提供的一种面 ...
- MiniNK WEB 选拔题 by F12
Start 除了梦想外一无所有的我们,将会和蔑视与困境做最后的斗争,这是最后一舞 N0wayBack 联合战队成立以来一直致力于信息安全技术的研究,作为联合战队活跃在各大 CTF (信息安全竞赛)赛事 ...
- 缕析条分Scroll属性
最近有项目需要使用js原生开发滑动组件,频繁要用到dom元素的各种属性,其中以各种类型的height和top属性居多,名字相近,含义也很容易搞混.因此特地总结归纳了一下常用的知识点,在文末我们来挑战实 ...