当前位置: 首页 > news >正文

HDLBits中文版,标准参考答案 | 3.2.4 More Circuits | 更多电路

关注 望森FPGA 查看更多FPGA资讯

这是望森的第 15 期分享

作者 | 望森
来源 | 望森FPGA

目录

1 Rule 90 | 规则 90

2 Rule 110 | 规则 110

3 Conway's Game of Life 16x16 | 康威生命游戏 16x16


本文中的代码都能够正常运行,请放心食用😋~

练习的官方网站是:https://hdlbits.01xz.net/

注:作者将每个练习的知识点都放在了题目和答案之后


本节练习元胞自动机(cellular automata,CA) 的电路设计。

元胞自动机(cellular automata,CA) 是一种时间、空间、状态都离散,空间相互作用和时间因果关系为局部的网格动力学模型,具有模拟复杂系统时空演化过程的能力。

1 Rule 90 | 规则 90

题目:

规则 90 是一个具有有趣属性的一维元胞自动机。

规则很简单。有一个一维元胞阵列(开或关)。在每个时间步骤中,每个元胞的下一个状态是该元胞的两个当前邻居的异或。下表是表达此规则的更详细的方式,其中元胞的下一个状态是其自身及其两个邻居的函数:

(名称“Rule 90”来自“Center's next state”列:01011010 是十进制 90。)

在此电路中,创建一个 512 单元系统 (q[511:0]),并在每个时钟周期前进一个时间步长。load 输入表示系统的状态应加载 data[511:0] 。假设边界 (q[-1] 和 q[512]) 均为零(关闭)。

提示:

对于 q[511:0] = 1 的初始状态,前几次迭代是:

答案:

module top_module(input clk,input load,input [511:0] data,output [511:0] q ); always@(posedge clk)beginif (load)q <= data;elseq <= q[511:1] ^ {q[510:0],1'b0};endendmodule

知识点:

根据需求寻找规律。


2 Rule 110 | 规则 110

题目:

规则 110 是一个具有有趣属性(例如图灵完备)的一维元胞自动机。

有一个一维元胞阵列(开或关)。在每个时间步骤中,每个元胞的状态都会发生变化。在规则 110 中,每个元胞的下一个状态仅取决于其自身及其两个邻居,如下表所示:

(“规则 110”的名称来自“Center's next state”列:01101110 是十进制 110。)

在此电路中,创建一个 512 元胞系统 (q[511:0]),并在每个时钟周期前进一个时间步长。load 输入表示系统状态应加载 data[511:0] 。假设边界(q[-1] 和 q[512])均为零(关闭)。

提示:

对于初始状态 q[511:0] = 1,前几次迭代是:

答案:

1.绘制卡诺图

2.卡诺图化简

3.逻辑表达式

Cn+1 = (~C & R) | (~L & C) | (C & ~R);

4.代码

module top_module(input clk,input load,input [511:0] data,output [511:0] q
); wire  [511:0] l,r,c;assign l = {1'b0,q[511:1]};assign r = {q[510:0],1'b0};assign c = q;always@(posedge clk)beginif (load)q <= data;else beginq <= (~c & r) | (~l & c) | (c & ~r);endendendmodule

3 Conway's Game of Life 16x16 | 康威生命游戏 16x16

题目:

康威生命游戏是一个元胞自动机。

“游戏”在二维元胞网格上进行,每个细胞要么是 1(活着),要么是 0(死亡)。在每个时间步骤中,每个细胞都会根据其邻居的数量改变状态:

  • 0-1 个邻居:细胞变为 0。

  • 2 个邻居:细胞状态不变。

  • 3 个邻居:细胞变为 1。

  • 4+ 个邻居:细胞变为 0。

游戏是针对无限网格制定的。在这个电路中,我们将使用 16x16 网格。为了让事情更有趣,我们将使用 16x16 环形,其中的边环绕到网格的另一侧。例如,角细胞 (0,0) 有 8 个邻居:(15,1)、(15,0)、(15,15)、(0,1)、(0,15)、(1,1)、(1,0) 和 (1,15)。 16x16 网格由长度为 256 的向量表示,其中每行 16 个单元格由一个子向量表示:q[15:0] 表示第 0 行,q[31:16] 表示第 1 行,等等。(此工具接受 SystemVerilog,因此您可以根据需要使用 2D 向量。)

  • load:在下一个时钟边缘将 data 加载到 q 中,以加载初始状态。

  • q:游戏的 16x16 当前状态,每个时钟周期更新一次。

游戏状态应在每个时钟周期前进一个时间步。

数学家、生命游戏细胞自动机的创造者约翰·康威于 2020 年 4 月 11 日因 COVID-19 去世。

提示:

一个易于理解并测试一些边界条件的测试案例是 blinker 256'h7。它位于第 0 行第 0-2 列的 3 个单元格中。它在一行 3 个单元格和一列 3 个单元格之间振荡(在第 1 列,第 15、0 和 1 行)。

答案:

module top_module(input clk,input load,input [255:0] data,output [255:0] q ); reg [15:0] q_temp [15:0];reg [255:0] q_trans;integer i,j;integer u,d,l,r;reg [2:0] cnt;//将256个数存为16*16个二维数组always@(*)beginfor(i=0;i<16;i=i+1) beginfor(j=0;j<16;j=j+1) beginq_temp[i][j] = q[16*i+j];endendfor(i=0;i<16;i=i+1) beginfor(j=0;j<16;j=j+1) beginu = (i == 32'd15) ? 32'd0 : i+1;d = (i == 32'd0) ? 32'd15 : i-1;l = (j == 32'd15) ? 32'd0 : j+1;r = (j == 32'd0) ? 32'd15 : j-1;cnt = q_temp[u][l]         + q_temp[u][j]         + q_temp[u][r]+ q_temp[i][l]                                    + q_temp[i][r]+ q_temp[d][l]         + q_temp[d][j]         + q_temp[d][r];case(cnt)3'd02 : q_trans[i*16+j] <= q_temp[i][j];3'd03 : q_trans[i*16+j] <= 1'b1;default q_trans[i*16+j] <= 1'b0;endcaseendendend//输出数据赋值always@(posedge clk)beginif (load)q <= data;else q <= q_trans;endendmodule

- END -

公z号/CSDN搜索【望森FPGA】,查看更多FPGA资讯~

相关推荐文章,点击跳转:

望森FPGA的HDLBits合集


http://www.mrgr.cn/news/45094.html

相关文章:

  • Allegro如何合并同名网络铜皮操作指导
  • BUCK降压电路
  • 2024年十大前沿目标检测模型汇总
  • 用Python实现运筹学——Day 15: 线性规划的项目实战
  • 【动态规划】斐波那契模型 dp
  • 基于Springboot vue的流浪狗领养管理系统设计与实现
  • Spring Boot 进阶-详解Spring Boot整合数据库
  • ASR的King:我又回来了,更小,且更快——openai/whisper-large-v3-turbo
  • 【C++堆(优先队列)】2233. K 次增加后的最大乘积|1685
  • 深度优先搜索与并查集
  • Windows VSCode 配置 Java 环境 (Maven)
  • Steam Deck掌机可装“黑苹果” 开发者成功安装macOS 15 Sequoia
  • 织物布匹疵点检测数据集,布匹缺陷检测数据集 标注工具:LabelImg 数量:已标注1084张(5类);未标注:2000余张
  • Vue 3 中实现懒加载功能
  • 数据结构——优先级队列(堆)
  • python画图|曲线动态输出基础教程
  • 什么是安全运营中心 SOC?
  • 第三课 Vue中的方法的定义及事件绑定指令
  • 线性代数入门指南
  • 『网络游戏』制作提示弹窗UI【03】