首先,我们通过观察上表可以很容易的发现一个规律,center的下一个状态由center的左邻居和右邻居异或而成。center的下一个状态列:01011010,转换为十进制即为90,所以我们将其命名为rule 90.
知道了下一状态产生的规则后,我们就根据其规则实现下面这个电路:
在这个电路中,我们创造512个细胞系统(q[511:0]),在每个时钟周期前进一个步长。load输入将输出q加载为data[511:0],假设边界q[-1]和q[522]都为0.
我们将每一位用左邻居和右邻居的异或表示出来,发现512位太长无法一一枚举,所以观察规律后直接使用按位异或^。左邻居可以不用在最前面添0,按位异或会默认从最低位对齐,高位多出来的用0补齐然后进行计算。代码如下:
module top_module(
input clk,
input load,
input [511:0] data,
output [511:0] q );
always@(posedge clk)
if (load)
q <= data;
else
//q <= {q[510],q[511]^q[509],q[510]^q[508],……,q[2]^q[0],q[1]}
// left