Вы находитесь на странице: 1из 3

module matrix_convolution(in_1,in_2,in_3,out,rst,en,clock,kernel);

//Parameter
parameter input_bit = 216; // 8 bit per elemen x 27 buah elemen
parameter input_row = 3;
parameter input_column = 9;
parameter input_size = 27;
parameter output_bit = 16;
parameter kernel_size = 9;
parameter kernel_bit = 72;
parameter bit_size = 8;
// Port Input
input [input_bit-1:0]in_1;
input [input_bit-1:0]in_2;
input [input_bit-1:0]in_3;
input clock;
input rst;
input en;
// Kernel
input [kernel_bit-1:0]kernel;
reg [bit_size-1:0]mem_kernel[kernel_size-1:0];
// Memory Input
reg [bit_size-1:0]mem_in_1[input_row-1:0][input_column-1:0];
reg [bit_size-1:0]mem_in_2[input_row-1:0][input_column-1:0];
reg [bit_size-1:0]mem_in_3[input_row-1:0][input_column-1:0];
// Port Output
output [output_bit-1:0] out ;
// internal variables
reg [output_bit-1:0] out;
reg [2:0] counter_column ; // Counter
reg [2:0] counter_row ; // Counter
reg [1:0] counter_row_1;
reg [1:0] counter_row_2;
reg [1:0] counter_row_3;
// Assign Input dan Kernel ke memory
always@(in_1 or in_2 or in_3 or kernel)
begin

{mem_kernel[0],mem_kernel[1],mem_kernel[2],mem_kernel[3],mem_kernel[4],mem_kernel[5
],mem_kernel[6],
mem_kernel[7],mem_kernel[8]} = kernel;
{mem_in_1[0][0],mem_in_1[0][1],mem_in_1[0][2],mem_in_1[0][3],mem_in_1[0]
[4],mem_in_1[0][5],mem_in_1[0][6],mem_in_1[0][7],mem_in_1[0][8],
mem_in_1[1][0],mem_in_1[1][1],mem_in_1[1][2],mem_in_1[1][3],mem_in_1[1]
[4],mem_in_1[1][5],mem_in_1[1][6],mem_in_1[1][7],mem_in_1[1][8],
mem_in_1[2][0],mem_in_1[2][1],mem_in_1[2][2],mem_in_1[2][3],mem_in_1[2]
[4],mem_in_1[2][5],mem_in_1[2][6],mem_in_1[2][7],mem_in_1[2][8]} = in_1;

{mem_in_2[0][0],mem_in_2[0][1],mem_in_2[0][2],mem_in_2[0][3],mem_in_2[0]
[4],mem_in_2[0][5],mem_in_2[0][6],mem_in_2[0][7],mem_in_2[0][8],
mem_in_2[1][0],mem_in_2[1][1],mem_in_2[1][2],mem_in_2[1][3],mem_in_2[1]
[4],mem_in_2[1][5],mem_in_2[1][6],mem_in_2[1][7],mem_in_2[1][8],
mem_in_2[2][0],mem_in_2[2][1],mem_in_2[2][2],mem_in_2[2][3],mem_in_2[2]
[4],mem_in_2[2][5],mem_in_2[2][6],mem_in_2[2][7],mem_in_2[2][8]} = in_2;

{mem_in_3[0][0],mem_in_3[0][1],mem_in_3[0][2],mem_in_3[0][3],mem_in_3[0]
[4],mem_in_3[0][5],mem_in_3[0][6],mem_in_3[0][7],mem_in_3[0][8],
mem_in_3[1][0],mem_in_3[1][1],mem_in_3[1][2],mem_in_3[1][3],mem_in_3[1]
[4],mem_in_3[1][5],mem_in_3[1][6],mem_in_3[1][7],mem_in_3[1][8],
mem_in_3[2][0],mem_in_3[2][1],mem_in_3[2][2],mem_in_3[2][3],mem_in_3[2]
[4],mem_in_3[2][5],mem_in_3[2][6],mem_in_3[2][7],mem_in_3[2][8]} = in_3;
end
// Counter
always@(posedge clock)
begin
if(!rst)
begin
counter_column <= -1;
counter_row <= 4'd0;
counter_row_1 = 0;
counter_row_2 = 0;
counter_row_3 = 0;
end
else if(en)
if(counter_column >= 4'd6)
begin
counter_column <= 4'd0;
counter_row <= counter_row + 4'd1;
// Keadaan
if (counter_row == 1)
begin
counter_row_1 = 1;
counter_row_2 = 0;
counter_row_3 = 0;
end
else
if (counter_row == 2)
begin
counter_row_1 = 1;
counter_row_2 = 1;
counter_row_3 = 0;
end
else
if (counter_row == 3)
begin
counter_row_1 = 1;
counter_row_2 = 1;
counter_row_3 = 1;
end
else
if (counter_row == 4)
begin
counter_row_1 = 2;
counter_row_2 = 1;
counter_row_3 = 1;
end
else
if (counter_row == 5)
begin
counter_row_1 = 2;
counter_row_2 = 2;
counter_row_3 = 1;
end
else
if (counter_row == 6)
begin
counter_row_1 = 2;
counter_row_2 = 2;
counter_row_3 = 2;
end
else
if (counter_row >6)
begin
counter_row_1 = 3;
counter_row_2 = 3;
counter_row_3 = 3;
end
end
else
counter_column <= counter_column + 4'd1;
else
counter_column <= counter_column;
end
// Proses Konvolusi Matriks
always@(counter_column or counter_row or counter_row_1 or counter_row_2 or
counter_row_3)
begin
if(!rst)
begin
out <= 0;

end
if(en)
begin
out <= mem_in_1[counter_row_1][counter_column]*mem_kernel[0] +
mem_in_2[counter_row_2][counter_column]*mem_kernel[3] + mem_in_3[counter_row_3]
[counter_column]*mem_kernel[6]
+mem_in_1[counter_row_1][counter_column+1]*mem_kernel[1] +
mem_in_2[counter_row_2][counter_column+1]*mem_kernel[4] + mem_in_3[counter_row_3]
[counter_column+1]*mem_kernel[7]
+mem_in_1[counter_row_1][counter_column+2]*mem_kernel[2] +
mem_in_2[counter_row_2][counter_column+2]*mem_kernel[5] + mem_in_3[counter_row_3]
[counter_column+2]*mem_kernel[8];

end
else
out <= 16'd0;
end
endmodule

Вам также может понравиться