腐蚀-膨
//腐蚀-膨胀算法
module Erosion(
clk ,
rst_n ,
matrixp11 ,
matrixp12 ,
matrixp13 ,
matrixp21 ,
matrixp22 ,
matrixp23 ,
matrixp31 ,
matrixp32 ,
matrixp33 ,
matrix_vs ,
matrix_hs ,
matrix_en ,
Erosion_data ,
post_vs ,
post_hs ,
post_en
);
//************************ input and output *******************//
input clk ;
input rst_n ;
input [7:0] matrixp11 ;
input [7:0] matrixp12 ;
input [7:0] matrixp13 ;
input [7:0] matrixp21 ;
input [7:0] matrixp22 ;
input [7:0] matrixp23 ;
input [7:0] matrixp31 ;
input [7:0] matrixp32 ;
input [7:0] matrixp33 ;
input matrix_vs ;
input matrix_hs ;
input matrix_en ;
output [7:0] Erosion_data ;
output post_vs ;
output post_hs ;
output post_en ;
//************************** main code ***********************//
/* 膨胀算法
关于算法的实现,可以用下式子来表示,即3x3像素的运算:
P = P11 & P12 & P13 & P21 & P22 & P23 & P31 & P32 & P33
在HDL中,为了通过面积去换速度,我们将上式改变如下:
P1 = P11 & P12 & P13
P2 = P21 & P22 & P23
P3 = P31 & P32 & P33
P = P1 & P2 & P3
关于算法的实现,可以用下式子来表示,即3x3像素的运算:
P = P11 | P12 | P13 | P21 | P22 | P23 | P31 | P32 | P33
在HDL中,为了通过面积去换速度,我们将上式改变如下:
P1 = P11 | P12 | P13
P2 = P21 | P22 | P23
P3 = P31 | P32 | P33
P = P1 | P2 | P3
*/
//***********************************************************//
//一个时钟,第一步
reg [7:0] row1_data;
always@(posedge clk or negedge rst_n) begin
if(!rst_n)
row1_data <= 'd0;
else
row1_data <= matrixp11 & matrixp12 & matrixp13;
end
reg [7:0] row2_data;
always@(posedge clk or negedge rst_n) begin
if(!rst_n)
row2_data <= 'd0;
else
row2_data <= matrixp21 & matrixp22 & matrixp23;
end
reg [7:0] row3_data;
always@(posedge clk or negedge rst_n) begin
if(!rst_n)
row3_data <= 'd0;
else
row3_data <= matrixp31 & matrixp32 & matrixp33;
end
//第二步
reg [7:0] Erosion_data_r;
always@(posedge clk or negedge rst_n) begin
if(!rst_n)
Erosion_data_r <= 'd0;
else
Erosion_data_r <= row1_data & row2_data & row3_data;
end
//延迟2个时钟
reg [1:0] post_vs_r ;
reg [1:0] post_hs_r ;
reg [1:0] post_en_r ;
always@(posedge clk or negedge rst_n) begin
if(!rst_n) begin
post_vs_r <= 2'b00;
post_hs_r <= 2'b00;
post_en_r <= 2'b00;
end
else begin
post_vs_r <= {post_vs_r[0],matrix_vs };
post_hs_r <= {post_hs_r[0],matrix_hs };
post_en_r <= {post_en_r[0],matrix_en };
end
end
assign post_vs = post_vs_r[1];
assign post_hs = post_hs_r[1];
assign post_en = post_en_r[1];
assign Erosion_data = post_en ? Erosion_data_r:8'd0;
endmodule
胀-FPGA