腐蚀-膨胀-FPGA

腐蚀-膨

//腐蚀-膨胀算法
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

posted @ 2020-05-10 18:32  王林文思  阅读(413)  评论(0编辑  收藏  举报