3.2.4.1 Rule 90
问题描述
规则90是一个具有有趣特性的一维元胞自动机。
规则很简单。有一个一维的单元格数组(开或关)。在每个时间步,每个单元的下一个状态是单元的两个当前邻居的 XOR。下表是表达此规则的更详细的方式,其中单元格的下一个状态是其自身及其两个邻居的函数:
(“规则 90”的名称来自阅读“下一个状态”列:01011010 是十进制的 90。)
在此电路中,创建一个 512 单元系统 ( q[511:0] ),并在每个时钟周期前进一个时间步长。加载输入指示系统的状态应加载data[511:0]。假设边界(q[-1]和q[512])都为零。
代码:
module top_module(
input clk,
input load,
input [511:0] data,
output [511:0] q );
always @(posedge clk) begin
if(load)
q<=data;
else
q<={1'b0,q[511:1]} ^ {q[510:0],1'b0};
end
endmodule
3.2.4.2 Rule 110
问题描述
Rule 110是一个具有有趣特性(例如图灵完备)的一维元胞自动机。有一个一维的单元格数组(开或关)。在每个时间步,每个单元格的状态都会发生变化。在规则 110 中,每个单元格的下一个状态仅取决于它自己和它的两个邻居。(“规则 110”的名称来自阅读“下一个状态”列:01101110 是十进制的 110。)
在此电路中,创建一个 512 单元系统 ( q[511:0] ),并在每个时钟周期前进一个时间步长。加载输入指示系统的状态应加载data[511:0]。假设边界(q[-1]和q[512])都为零。
分析:
代码:
module top_module(
input clk,
input load,
input [511:0] data,
output [511:0] q
);
wire [511:0] q_left, q_right;
assign q_left = {1'b0,q[511:1]};
assign q_right = {q[510:0],1'b0};
always @(posedge clk) begin
if(load)
q<=data;
else
q<=(q_right&~q)|(~q_right&q)|(q&~q_left);
end
endmodule