将所有元素分为3类:角、边和中间部分,其中角上的元素有4个,有上下左右4个边界,剩余的组成了中间部分。
module top_module(
input clk,
input load,
input [255:0] data,
output [255:0] q
);
integer i;
reg [3:0] counter;
reg [497:0] temp;
reg [255:0] q_next;
always@(*)
for(i=0;i<256;i=i+1)
begin
counter = 4'd0;
temp[255:0] = q;
if(i==0 | i==15 | i==240 | i==255) //角
case(i)
8'd000: counter = temp[255]+temp[240]+temp[241]+temp[15]+temp[1]+temp[31]+temp[16]+temp[17];
8'd015: counter = temp[254]+temp[255]+temp[240]+temp[14]+temp[0]+temp[30]+temp[31]+temp[16];
8'd240: counter = temp[239]+temp[224]+temp[225]+temp[255]+temp[241]+temp[15]+temp[0]+temp[1];
8'd255: counter = temp[238]+temp[239]+temp[224]+temp[254]+temp[240]+temp[14]+temp[15]+temp[0];
endcase
else if(i%16==0) //左边界(角除外)
counter = temp[i-1]+temp[i-16]+temp[i-15]+temp[i+15]+temp[i+1]+temp[i+31]+temp[i+16]+temp[i+17];
else if(i%16==15) //右边界(角除外)
counter = temp[i-17]+temp[i-16]+temp[i-31]+temp[i-1]+temp[i-15]+temp[i+15]+temp[i+16]+temp[i+1];
else if(0<i<15) //上边界(角除外)
counter = temp[i+239]+temp[i+240]+temp[i+241]+temp[i-1]+temp[i+1]+temp[i+15]+temp[i+16]+temp[i+17];
else if(240<i<255) //下边界(角除外)
counter = temp[i-17]+temp[i-16]+temp[i-15]+temp[i-1]+temp[i+1]+temp[i-241]+temp[i-240]+temp[i-239];
else //中间部分
counter = temp[i-17]+temp[i-16]+temp[i-15]+temp[i-1]+temp[i+1]+temp[i+15]+temp[i+16]+temp[i+17];
case(counter)
4'd2: q_next[i] = temp[i];
4'd3: q_next[i] = 1'b1;
default: q_next[i] = 1'b0; //0,1,4~8
endcase
end
always@(posedge clk)
if(load)
q <= data;
else
q <= q_next;
endmodule