1.?Rule90(Rule 90)
方法1:
module top_module (output reg [511:0] q,input clk,input load,input [511:0] data
); integer i;always @(posedge clk) beginif (load == 1'b1) beginq <= data;end else beginfor (i=0; i<$bits(q); i=i+1) beginif (i == 0) beginq[0] <= q[1];end else if (i == 511) beginq[511] <= q[510];end else beginq[i] <= q[i+1]^q[i-1];endendendend
endmodule
方法2:
? ? ? ? 根據首位兩端的部分計算式:
? ? ? ? ? ? ? ? q[0] ???????= q[1]? ? ^? ? 1'b0
? ? ? ? ? ? ? ? q[1]? ? ? ? = q[2]? ? ^? ? q[0]
? ? ? ? ? ? ? ? ? ? ? ? ...
? ? ? ? ? ? ? ? q[510]? ? = q[511]? ? ^? ? q[509]
? ? ? ? ? ? ? ? q[511]? ? =??1'b0? ? ? ^? ? q[510]
可以得出實際用于計算的范圍。對于一個n-bit的值q,其計算范圍如下所示:
????????????????q = { 1'b0, q[n: 1] }? ^? { q[n-1: 0], 1'b0?};
對于本題,其計算范圍則如下所示:
????????????????q = { 1'b0, q[511: 1] }? ^? { q[510: 0], 1'b0?};
module top_module (output reg [511:0] q,input clk,input load,input [511:0] data
); always @(posedge clk) beginif (load == 1'b1) beginq <= data;end else beginq <= {1'b0, q[511:1]} ^ {q[510:0], 1'b0};endend
endmodule
2.?Rule110(Rule 110)
module top_module (output reg [511:0] q,input clk,input load,input [511:0] data
); wire [511:0] q_left, q_right;always @(posedge clk) beginif (load == 1'b1) beginq <= data;end else beginq <= (q_left ^ q_right) | (q_left & q & ~q_right);endendassign q_left = {1'b0, q[511:1]};assign q_right = {q[510:0], 1'b0};
endmodule