无知的小白@@@ 发表于 2022-1-5 16:44

otsu阈值算法,显示屏输出黑屏

`timescale 1ns/1ps
moduleotsu_yuzhi(
   inputwire       clk,
        inputwire       rst,   
        inputwiredata_in,
        //inputwire       de,
        output reg   threshold,
        output wiredata_out,
        input             hd_hs,
        input             hd_vs,
        input             hd_de,
        outputreg          yuzhi_hs,
        outputreg          yuzhi_vs,
        outputreg          yuzhi_de
);

parameter data_cnt_max= 24'd786432;
parameter time_max= 28'd201326592;

reg          T;
reg         data_cnt;
reg         data0;
reg         data1;
reg         data_01;
reg         data0_cnt;
reg         data1_cnt;
reg         w0;
reg         w1;
reg         u0;
reg         u1;
reg         u;
wire      g;
reg         g2;
reg         max;
reg         time_cnt;



//数据计数
always@(posedge clk or posedge rst)
begin
       if(rst==1'b1)
               data_cnt<=24'd0;
          else if(data_cnt == data_cnt_max-1)
                  data_cnt<=24'd0;
                  else
                  data_cnt<=data_cnt + 24'd1;
end
//总时间计数
always@(posedge clk or posedge rst)
begin
       if(rst==1'b1)
               time_cnt<=28'd0;
          else if(time_cnt == time_max-1)
                  time_cnt<=28'd0;
                  else
                  time_cnt<=time_cnt + 28'd1;
end

//阈值计数
always@(posedge clk or posedge rst)
begin
   if(rst==1'b1)
          T <=8'd0;
                else if(data_cnt <= data_cnt_max - 1)
               T <=T + 8'd1;
                else
               T <= T;
end          

//1/0数据总和
always@(posedge clk or posedge rst)
begin
if(rst==1'b1)
          data1 <=28'd0;
else if(data_in>=T)
   data1 <= data1 + data_in;
        else
        data1 <= data1;
end

always@(posedge clk or posedge rst)
begin
if(rst==1'b1)
          data0 <=28'd0;
    else if(data_in<T)
           data0 <= data0 + data_in;
       else
           data0 <= data0;
end
//0/1计数
always@(posedge clk or posedge rst)
begin
if(rst==1'b1)
          data1_cnt <=24'd0;
else   if(data_in>=T)
   data1_cnt <= data1_cnt + 24'd1;
        else
        data1_cnt <= data1_cnt;
end

always@(posedge clk or posedge rst)
begin
if(rst==1'b1)
          data0_cnt <=24'd0;
elseif(data_in<T)
           data0_cnt <= data0_cnt + 24'd1;
       else
           data0_cnt <= data0_cnt;
end

always@(posedge clk or posedge rst)
begin
if(rst==1'b1)   
begin
    data_01 <= 28'd0;
    u0 <= 28'd0;
    u1 <= 28'd0;
    w0 <= 28'd0;
    w1 <= 28'd0;
    u<= 28'd0;
end
elseif(data_cnt == data_cnt_max -1)
begin
data_01 <= data0 + data1;
u0 <= data0/data_01;
u1 <= data1/data_01;
w0 <= data0_cnt/data_cnt_max;
w1 <= data1_cnt/data_cnt_max;
u<= data_01/data_cnt_max - 1;
end
//else
//begin
//    data_01 <= 28'd0;
//    u0 <= 28'd0;
//    u1 <= 28'd0;
//    w0 <= 28'd0;
//    w1 <= 28'd0;
//    u<= 28'd0;
//end       
end       

assigng =w0*(u0-u)^2 + w1*(u1-u)^2;

always@(posedge clk or posedge rst)
begin
if(rst==1'b1)      
          g2 <=28'd0;
else if (g > g2)
       g2 <= g;
else
      g2 <= g2;
end

always@(posedge clk or posedge rst)
begin
if(rst==1'b1)      
          max <=28'd0;
else if (time_cnt == time_max)
       max <= g2;
else
      max <= max;
end

always@(posedge clk or posedge rst)
begin
if(rst==1'b1)      
          threshold <=28'd0;
else if (g2 == max)
       threshold <= T;
else
      threshold <= threshold;
end

assign data_out = (data_in > threshold) ? 8'h00 : 8'hff;

reg                            i_h_sync_delay_1;
reg                            i_v_sync_delay_1;
reg                            i_data_en_delay_1;
reg                            i_h_sync_delay_2;
reg                            i_v_sync_delay_2;
reg                            i_data_en_delay_2;
reg                            i_h_sync_delay_3;
reg                            i_v_sync_delay_3;
reg                            i_data_en_delay_3;

always@(posedge clk or posedge rst)
begin
        if(rst == 1'b1)
        begin
                i_h_sync_delay_1 <= 1'b0;
                i_v_sync_delay_1 <= 1'b0;
                i_data_en_delay_1 <= 1'b0;
                i_h_sync_delay_2 <= 1'b0;
                i_v_sync_delay_2 <= 1'b0;
                i_data_en_delay_2 <= 1'b0;
                i_h_sync_delay_3 <= 1'b0;
                i_v_sync_delay_3 <= 1'b0;
                i_data_en_delay_3 <= 1'b0;
                yuzhi_hs <= 1'b0;
                yuzhi_vs <= 1'b0;
                yuzhi_de <= 1'b0;
        end
        else
        begin
                i_h_sync_delay_1 <= hd_hs;
                i_v_sync_delay_1 <= hd_vs;
                i_data_en_delay_1 <= hd_de;
                i_h_sync_delay_2 <= i_h_sync_delay_1;
                i_v_sync_delay_2 <= i_v_sync_delay_1;
                i_data_en_delay_2 <= i_data_en_delay_1;
                i_h_sync_delay_3 <= i_h_sync_delay_2;
                i_v_sync_delay_3 <= i_v_sync_delay_2;
                i_data_en_delay_3 <= i_data_en_delay_2;
                yuzhi_hs <= i_h_sync_delay_3;
                yuzhi_vs <= i_v_sync_delay_3;
                yuzhi_de <= i_data_en_delay_3;
        end
       
end


endmodule
搜索
复制
页: [1]
查看完整版本: otsu阈值算法,显示屏输出黑屏