3.2.4 More Circuits
3.2.4.1 Rule 90
问题陈述:
规则90是一个具有有趣特性的一维元胞自动机。
规则很简单。有一个一维的单元格数组(开或关)。在每个时间步,每个单元的下一个状态是单元的两个当前邻居的
XOR。下表是表达此规则的更详细的方式,其中单元格的下一个状态是其自身及其两个邻居的函数:
(“规则90”这个名字来自于阅读“下一个状态”列:01011010是十进制90。)
在这个电路中,创建一个512单元系统(q[511:0]),每个时钟周期前进一个时间步。加载输入指示系统的状态应该加载data[511:0]。假设边界(q[-1]和q[512])都为零(关闭)。
Verilog代码:
module top_module(
input clk,
input load,
input [511:0] data,
output [511:0] q );
int i;
always @(posedge clk)
begin
if(load) begin
q<=data;
end
else
begin
q[0]<=q[1]^1'b0;
q[511]<=q[510]^1'b0;
for (i=1;i<511;i++)
begin
q[i]<=q[i-1]^q[i+1];
end
end
end
endmodule
3.2.4.2 Rule110
问题陈述:
规则 110是一个具有有趣特性(例如图灵完备)的一维元胞自动机。
有一个一维的单元格数组(开或关)。在每个时间步,每个单元格的状态都会发生变化。在规则 110
中,每个单元格的下一个状态仅取决于它自己和它的两个邻居,如下表所示:
(“规则110”这个名字来自于阅读“下一个状态”列:01101110是十进制110。)
在这个电路中,创建一个512单元系统(q[511: 0]),每个时钟周期前进一个时间步。加载输入指示系统的状态应该加载data[511:0]。假设边界(q[-1]和q[512])都为零(关闭)。
Verilog代码:
module top_module(
input clk,
input load,
input [511:0] data,
output [511:0] q
);
wire [511:0]right;
wire [511:0]left;
assign right={q[510:0],1'b0};
assign left={1'b0,q[511:1]};
always@(posedge clk)
begin
if(load)
begin
q<=data;
end
else begin
q[511:0]<=(q[511:0]^right)|(q[511:0]&(~left));
end
end
endmodule
3.2.4.3 Conway’s Game of Life 16*16
问题陈述:
康 威的生命游戏是一个二维元胞自动机。
“游戏”是在二维空间上进行的,其中每个单元格不是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]为第一行,以此类推(此工具接受SystemVerilog,因此您可以根据需要使用2D向量。)
没敲出来暂时放弃…