1 //矩阵元素移位赋值
2 always @(posedge clk or negedge rst_n)begin
3 if(rst_n==1'b0)begin
4 {p_11,p_12,p_13} <= {5'b0,5'b0,5'b0} ;
5 {p_21,p_22,p_23} <= {15'b0,15'b0,15'b0};
6 {p_31,p_32,p_33} <= {15'b0,15'b0,15'b0};
7 end
8 else begin
9 if(per_href_ff0==1&&flag_do==1)begin
10 {p_11,p_12,p_13}<={p_12,p_13,row_1};
11 {p_21,p_22,p_23}<={p_22,p_23,row_2};
12 {p_31,p_32,p_33}<={p_32,p_33,row_3};
13 end
14 else begin
15 {p_11,p_12,p_13}<={5'b0,5'b0,5'b0};
16 {p_21,p_22,p_23}<={5'b0,5'b0,5'b0}
17 {p_31,p_32,p_33}<={5'b0,5'b0,5'b0}
18 end
19 end
20 end
21
22
23 always @(posedge clk or negedge rst_n)begin
24 if(rst_n==1'b0)begin
25 mean_value_add1<=0;
26 mean_value_add2<=0;
27 mean_value_add3<=0;
28 end
29 else if(per_href_ff1)begin
30 mean_value_add1<=p_11+p_12+p_13;
31 mean_value_add2<=p_21+ 0 +p_23;
32 mean_value_add3<=p_31+p_32+p_33;
33 end
34 end
35
36 wire [8:0]mean_value;//8位数之和
37 wire [5:0]fin_y_data; //平均数,除以8,相当于左移三位。
38
39 assign mean_value=mean_value_add1+mean_value_add2+mean_value_add3;
40 assign fin_y_data=mean_value[8:3];
View Code
//Gx= | -2 0 +2 |
// | -1 0 +1 |
//
// | -1 -2 -1 |
//Gy= | 0 0 0 |
// | +1 +2 +1 |
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
endalways @(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
endwire [
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)begin
post_y_data_r<=16'h00;
end
else if(squart_out>=threshold)
post_y_data_r<=16'h00 ;
else
post_y_data_r<=16'hffff ;
end