verilog里做卷积,这样的代码有问题吗?
最后得到的结果conv_res的每一位都是固定的3,而且padding部分也都得到错误的结果。
问题应该是处在always与for的循环里,这种采用<=赋值的方法难道不会在每次for循环迭代时都进行一次运算吗?
integer k,p;
initial begin
for(k=0; k!=DATA_WIDTH ; k=k+1) begin
for(p=0; p!=DATA_WIDTH ; p=p+1)
data_in[k][p] = 1;
end
end
initial begin
for(k=0; k!=KERNEL_WIDTH ; k=k+1) begin
for(p=0; p!=KERNEL_WIDTH ; p=p+1)
kernel[k][p] = 3;
end
end
initial begin
for(k=0; k!=(PADDING_SIZE+DATA_WIDTH) ; k=k+1) begin
for(p=0; p!=(PADDING_SIZE+DATA_WIDTH) ; p=p+1)
conv_res[k][p] = 0;
end
end
initial begin
for(k=0; k!=(PADDING_SIZE+DATA_WIDTH) ; k=k+1) begin
for(p=0; p!=(PADDING_SIZE+DATA_WIDTH) ; p=p+1)
padded_input[k][p] = 0;
end
end
reg init_begin;
//数据padding填充
integer i_1, j_1;
always@(posedge clk) begin
if(init_begin) begin
for (i_1 = 0; i_1 < (PADDING_SIZE + DATA_WIDTH); i_1 = i_1 + 1) begin
for(j_1 = 0; j_1 < (PADDING_SIZE + DATA_WIDTH); j_1 = j_1 + 1) begin
if(((i_1 >= DATA_WIDTH) && (i_1 < (PADDING_SIZE + DATA_WIDTH))) || ((j_1 >= DATA_WIDTH) && (j_1 < (PADDING_SIZE + DATA_WIDTH)))) begin
padded_input[i_1][j_1] <= 32'b0;
end
else begin
padded_input[i_1][j_1] <= data_in[i_1][j_1];
end
end
end
end
end
//卷积运算
always @(posedge clk) begin
for (j = 0; j < DATA_WIDTH; j = j + 1) begin
for(m = 0; m < KERNEL_WIDTH; m = m + 1) begin
for(n = 0; n < KERNEL_WIDTH; n = n + 1) begin
conv_res[i][j] <= conv_res[i][j] + padded_input[i+m][j+n] * kernel[m][n];
end
end
end
end