无比愚蠢, 但是成功了
module top_module(
input clk,
input load,
input [255:0] data,
output [255:0] q );
reg [255:0] buff;
integer i, x, y, nb;
always @(posedge clk) begin
if(load)
q = data;
else begin
for(i = 0; i<256; i=i+1) begin
nb = 0;
if(i%16 == 0) begin /* at left boarder */
if(i<16) begin /* TL corner */
nb = nb+q[i-1 +16]; // L
nb = nb+q[i+1]; // R
nb = nb+q[i-16 +256]; // T
nb = nb+q[i+16]; // D
nb = nb+q[i-16-1 +16 +256]; // TL
nb = nb+q[i-16+1 +256]; // TR
nb = nb+q[i+16-1 +16]; // DL
nb = nb+q[i+16+1]; // DR
end else if(i >=240) begin /* DL corner */
nb = nb+q[i-1 +16]; // L
nb = nb+q[i+1]; // R
nb = nb+q[i-16]; // T
nb = nb+q[i+16 -256]; // D
nb = nb+q[i-16-1 +16]; // TL
nb = nb+q[i-16+1]; // TR
nb = nb+q[i+16-1 +16 -256]; // DL
nb = nb+q[i+16+1 -256]; // DR
end else begin /* Left side */
nb = nb+q[i-1 +16]; // L
nb = nb+q[i+1]; // R
nb = nb+q[i-16]; // T
nb = nb+q[i+16]; // D
nb = nb+q[i-16-1 +16]; // TL
nb = nb+q[i-16+1]; // TR
nb = nb+q[i+16-1 +16]; // DL
nb = nb+q[i+16+1]; // DR
end
end else if(i%16 == 15) begin /* at right boarder */
if(i<16) begin /* TR corner */
nb = nb+q[i-1]; // L
nb = nb+q[i+1 -16]; // R
nb = nb+q[i-16 +256]; // T
nb = nb+q[i+16]; // D
nb = nb+q[i-16-1 +256]; // TL
nb = nb+q[i-16+1 -16 +256]; // TR
nb = nb+q[i+16-1]; // DL
nb = nb+q[i+16+1 -16]; // DR
end else if(i >=240) begin /* DR corner */
nb = nb+q[i-1]; // L
nb = nb+q[i+1 -16]; // R
nb = nb+q[i-16]; // T
nb = nb+q[i+16 -256]; // D
nb = nb+q[i-16-1]; // TL
nb = nb+q[i-16+1 -16]; // TR
nb = nb+q[i+16-1 -256]; // DL
nb = nb+q[i+16+1 -16 -256]; // DR
end else begin /* Right side */
nb = nb+q[i-1]; // L
nb = nb+q[i+1 -16]; // R
nb = nb+q[i-16]; // T
nb = nb+q[i+16]; // D
nb = nb+q[i-16-1]; // TL
nb = nb+q[i-16+1 -16]; // TR
nb = nb+q[i+16-1]; // DL
nb = nb+q[i+16+1 -16]; // DR
end
end else begin /* not at left right boarder */
if(i<16) begin /* TOP side */
nb = nb+q[i-1]; // L
nb = nb+q[i+1]; // R
nb = nb+q[i-16 +256]; // T
nb = nb+q[i+16]; // D
nb = nb+q[i-16-1 +256]; // TL
nb = nb+q[i-16+1 +256]; // TR
nb = nb+q[i+16-1]; // DL
nb = nb+q[i+16+1]; // DR
end else if(i >=240) begin /* Down side */
nb = nb+q[i-1]; // L
nb = nb+q[i+1]; // R
nb = nb+q[i-16]; // T
nb = nb+q[i+16 -256]; // D
nb = nb+q[i-16-1]; // TL
nb = nb+q[i-16+1]; // TR
nb = nb+q[i+16-1 -256]; // DL
nb = nb+q[i+16+1 -256]; // DR
end else begin /* not at any boarder */
nb = nb+q[i-1]; // L
nb = nb+q[i+1]; // R
nb = nb+q[i-16]; // T
nb = nb+q[i+16]; // D
nb = nb+q[i-16-1]; // TL
nb = nb+q[i-16+1]; // TR
nb = nb+q[i+16-1]; // DL
nb = nb+q[i+16+1]; // DR
end
end
/*now we get neighbor number of one point: nb*/
case (nb)
//0: buff[i] = 0;
//1: buff[i] = 0;
2: buff[i] = q[i];
3: buff[i] = 1;
default: buff[i] = 0;
endcase
end
q = buff;
end
end
endmodule