更多的电路
1 Rule90
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[510]),(q[511:2]^q[509:0]),(1'b0^q[1])};//不用写for循环
end
endmodule
2 Rule110
module top_module(
input clk,
input load,
input [511:0] data,
output [511:0] q
);
always @(posedge clk) begin
if (load)
q<=data;
else begin
q<={(q[510]^q[511])|(q[511]&1'b1),
((q[510:1]^q[509:0])|(q[510:1]&(~q[511:2]))),
(1'b0^q[0])|(q[0]&(~q[1]))};
//q<= ((q[511:0])^({q[510:0],1'b0}))|(~{1'b0,q[511:1]}&(q[511:0]));
end
end
endmodule
3 二维序列生成器
module top_module(
input clk,
input load,
input [255:0] data,
output [255:0] q );
reg [323:0] data_p;//类似于padding的工作,让16*16变成18*18,让最外维的跟边角的连接,
reg [255:0] q_next;
integer i,j,cnt;
always @(*) begin
data_p[17:0]={q[240],q[255:240],q[255]};//类似于padding的工作,让16*16变成18*18,让最外维的跟边角的连接,
data_p[323:306]={q[0],q[15:0],q[15]};
for (int i=1;i<17;i=i+1)
data_p[i*18+:18]={q[(i-1)*16],q[(i-1)*16+:16],q[i*16-1]};//中间的保留,但是扩展的最低位是原来的最高位,扩展的最高位是原来的最低位
end
//对每个位置进行识别判断,判断它前后左右分别是什么
always@(*) begin
for(i=0;i<16;i++) begin
for(j=0;j<16;j++) begin
cnt= data_p[i*18+j+1-1]+data_p[i*18+j+1]+data_p[i*18+j+1+1]
+ data_p[(i+1)*18+j+1-1]+data_p[(i+1)*18+j+1+1]
+ data_p[(i+2)*18+j+1-1]+data_p[(i+2)*18+j+1]+data_p[(i+2)*18+j+1+1];
case(cnt)
0,1:q_next[i*16+j]=0;
2:q_next[i*16+j]=q[i*16+j];
3:q_next[i*16+j]=1;
default: q_next[i*16+j]=0;
endcase
end
end
end
always @(posedge clk) begin
if (load)
q<=data;
else
q<=q_next;
end
endmodule