reg [5:0]p_11,p_12,p_13; // 3 * 3 卷积核中的像素点
reg [5:0]p_21,p_22,p_23;
reg [5:0]p_31,p_32,p_33;
reg [8:0]mean_value_add1,mean_value_add2,mean_value_add3;//每一行之和
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
{p_11,p_12,p_13} <= {5'b0,5'b0,5'b0} ;
{p_21,p_22,p_23} <= {15'b0,15'b0,15'b0};
{p_31,p_32,p_33} <= {15'b0,15'b0,15'b0};
end
else begin
if(per_href_ff0==1&&flag_do==1)begin
{p_11,p_12,p_13}<={p_12,p_13,row_1};
{p_21,p_22,p_23}<={p_22,p_23,row_2};
{p_31,p_32,p_33}<={p_32,p_33,row_3};
end
else begin
{p_11,p_12,p_13}<={5'b0,5'b0,5'b0};
{p_21,p_22,p_23}<={5'b0,5'b0,5'b0}
{p_31,p_32,p_33}<={5'b0,5'b0,5'b0}
end
end
end
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
mean_value_add1<=0;
mean_value_add2<=0;
mean_value_add3<=0;
end
else if(per_href_ff1)begin
mean_value_add1<=p_11+p_12+p_13;
mean_value_add2<=p_21+ 0 +p_23;
mean_value_add3<=p_31+p_32+p_33;
end
end
wire [8:0]mean_value;//8位数之和
wire [5:0]fin_y_data; //平均数,除以8,相当于左移三位。
assign mean_value=mean_value_add1+mean_value_add2+mean_value_add3;
assign fin_y_data=mean_value[8:3];
该算子包含两组 3x3 的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。A代表原始图像的 3*3 像素阵列,Gx及Gy分别代表经横向及纵向边缘检测的图像,其公式如下:
-------------------------------------------------------------------------------------------------------------------
reg [8:0] p_x_data ,p_y_data ; // x 和 y 的正值之和
reg [8:0] n_x_data ,n_y_data ; // x 和 y 的负值之和
reg [8:0] gx_data ,gy_data ; //最终结果
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
p_x_data <=0;
n_x_data <=0;
gx_data <=0;
end
else if(per_href_ff1==1) begin
p_x_data <= p_13 + (p_23<<1) + p_33 ;
n_x_data <= p_11 + (p_12<<1 )+ p_13 ;
gx_data <= (p_x_data >=n_x_data)? p_x_data - n_x_data : n_x_data - p_x_data ;
end
else begin
p_x_data<=0;
n_x_data<=0;
gx_data <=0;
end
end
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
p_y_data <=0;
n_y_data <=0;
gy_data <=0;
end
else if(per_href_ff1==1) begin
p_y_data <= p_11 + (p_12<<1) + p_13 ;
n_y_data <= p_31 + (p_32<<1) + p_33 ;
gy_data <= (p_y_data >=n_y_data)? p_y_data - n_y_data : n_y_data - p_y_data ;
end
else begin
p_y_data <=0;
n_y_data <=0;
gy_data <=0;
end
end
//求平方和,调用ip核开平方
reg [16:0] gxy; // Gx 与 Gy 的平方和
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
gxy<=0;
end
else begin
gxy<= gy_data* gy_data + gx_data* gx_data ;
end
end
wire [8:0] squart_out ;
altsquart u1_altsquart ( //例化开平方的ip核
.radical (gxy),
.q (squart_out), //输出的结果
.remainder()
);
//与阈值进行比较
reg [15:0] post_y_data_r;
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)be