module top_module(
input clk,
input load,
input [511:0] data,
output [511:0] q );
integer i;
wire [513:0] qq = {1'b0, q, 1'b0};
always @(posedge clk) begin
if (load) q <= data;
else
for (i = 0; i <= 511; i += 1) q[i] <= qq[i]^qq[i+2];
end
endmodule
진리표를 보고 할 수도 있긴 한데 설명 보면 xor이라서 좌우를 xor했다.
양 끝단의 경우 0과 xor해야 하기 때문에 길이 514의 wire를 별도로 선언하여 구현했다.
module top_module(
input clk,
input load,
input [511:0] data,
output [511:0] q
);
wire [511:0] wl = {1'b0, q[511:1]};
wire [511:0] wr = {q[510:0], 1'b0};
always @(posedge clk) begin
if (load) q <= data;
else q <= (~q & wr) | (~wl & q) | (q & ~wr);
end
endmodule
이쪽은 별다른 수가 없어 카르노 맵을 그려 구현했다.
module top_module(
input clk,
input load,
input [255:0] data,
output [255:0] q );
integer i, j, p, pu, pd, pl, pr, c;
always @(posedge clk) begin
if (load) q <= data;
else begin
for (i = 0; i < 16; i += 1) begin
for (j = 0; j < 16; j += 1) begin
c = 0; p = i * 16 + j;
pu = i == 15 ? -240 : 16;
pd = i == 0 ? 240 : -16;
pl = j == 15 ? -15 : 1;
pr = j == 0 ? 15 : -1;
if (q[p + pl]) c += 1;
if (q[p + pr]) c += 1;
if (q[p + pu]) c += 1;
if (q[p + pd]) c += 1;
if (q[p + pl + pu]) c += 1;
if (q[p + pl + pd]) c += 1;
if (q[p + pr + pu]) c += 1;
if (q[p + pr + pd]) c += 1;
if (c == 2) q[p] <= q[p];
else if (c == 3) q[p] <= 1'b1;
else q[p] <= 1'b0;
end
end
end
end
endmodule
이걸 시험에 낼라나??