用Verilog設計自适应阈值化产生图像二值化,用modelsim模拟波形结果非正确波形

一、 問題:
使用Verilog语法撰写,并用自适应阈值化(Adaptive Threshold Engine,ATE)产生图像二值化,由于初学1个月左右,有几点问题:
1. 模拟结果64个像素(pixel)在执行完成会合成一个区块(block) ,正常执行须执行完成24行与完成24区块,
2. 使用modelsim模拟的结果不如预期结果,clk与reset触发后,pix_data负缘输入,bin与threshold正缘输出。

(1) 但是pix_data预期要1,2,...,64为block 1 input; 实际错误结果是24,2d236,...未依照结果输出。

(2) bin输出延迟设定为1周期(latency=1),预期要1,2,...,64为block 1 input,实际错误结果未依照结果输出,波形没有从1开始。

(3) threshold跟pix_data、 bin有关,会由前面block 1 input输出为block 1 threshold,实际错误结果:00是block 1 threshold,77是是block 2 threshold,由于pix_data、 bin一开始错误,未依照结果输出。

二、代碼ate.v

module ate(clk,reset,pix_data,bin,threshold);
input clk;
input reset;
input [7:0] pix_data;
output bin;
output [7:0] threshold;
reg [7:0] threshold;
reg bin;

reg [7:0] data [63:0];  
reg [5:0]counter; //reg [6:0] count;
reg [7:0]min0;
reg [7:0]max0; //min, max is 16進位
reg [4:0]block;  //reg [4:0] block_count; block is 24;
integer i;  

    always@(posedge clk or posedge reset)
    begin
        if(reset)
        begin
            block <= 5'd0;  
        end
        else
            begin
                if((counter == 6'd63)&&(block == 5'd5))
                begin
                    block <= 5'd0;
                end
                else if(counter == 6'd63)
                begin
                    block <= block + 5'd1;
                end
            end
    end


    always@(posedge clk or posedge reset)
    begin
        if(reset)
        begin
            counter <= 6'd0;
        end
        else
        begin
            counter <= counter + 6'd1;
        end
    end

    always@(posedge clk or posedge reset)
    begin
        if(reset)
        begin
            for(i = 0; i < 64; i = i + 1)
            begin
                data[i] <= 8'd0;
            end
        end
        else
        begin
            data[counter] <= pix_data;
        end
    end

    always@(posedge clk or posedge reset)
    begin
        if(reset)
        begin
            max0 <= 8'd0;
        end
        else
        begin
           if(counter == 6'd0)
           begin
              max0 <= pix_data;
           end
            else if(max0 < pix_data)
            begin
                max0 <= pix_data;   
            end
        end
    end

    always@(posedge clk or posedge reset)
    begin
        if(reset)
        begin
            min0 <= 8'hff;
        end
        else
        begin
           if(counter == 6'd0)
           begin
              min0 <= pix_data;
           end
            else if(min0 > pix_data) //(min0 > pix_data)
            begin
                min0 <= pix_data;
            end
        end
    end

    //output
    wire dout;
    wire [7:0]avg;
    wire [7:0]thout;
    wire [8:0]sum;

    assign sum = {1'b0, min0} + {1'b0, max0};
    assign avg = (sum[0]) ? (sum + 9'd01) >> 1 : sum >> 1;
    assign dout = (((block == 5'd1)||(block == 5'd0))) ? 1'b0 :
                  ((counter == 6'd0)&&(data[0] >= avg)) ? 1'b1 : 
                  ((counter != 6'd0)&&(data[counter] >= threshold)) ? 1'b1 : 1'b0;


    assign thout = (((block == 5'd1)||(block == 5'd0))) ? 8'd0 : avg;

    always@(posedge clk or posedge reset)
    begin
        if(reset)
        begin
            bin <= 1'b0;
        end
        else
        begin
            bin <= dout;
        end
    end

    always@(posedge clk or posedge reset)
    begin
        if(reset)
        begin
            threshold <= 8'd0;
        end
        else
        begin
            if(counter == 6'd0)
            begin
                threshold <= thout;
            end
        end
    end
endmodule

三、錯報訊息:
有确认过testbench确定无问题,但是在修正程式仍无法改上此情形,因此我想询问有何么方式可以改善此情况,谢谢。

产生结果为下图:
图片说明

四、方法
设计方法:
因设计ATE接受的输入影像大小为48x32(共分为6x4区块),一个区块固定为8x8个点。影像输入顺序是以区为单位依序输入。执行Threshold处理时,是以一个区块作为单位,而最左边及最右边兩行不需处理,一律输出0 (bin及threshold皆是),如: 0,6,12,18区块及5, 11,17,23区块皆不需处理。下图为输入影像区块编号顺序。
图片说明

Adaptive Threshold目的是将一灰阶影像的前景及背景区分出來,对于该影像区块的每一个点,若大于或等于该区块门槛值(threshold)则输出1,反之则输出0。而Adaptive threshold表示此threshold是经由计算所得。 ATE电路的threshold计算方法采用单一8x8区块中之最大數值及最小數值的平均值,即threshold = (Max + Min) / 2,若threshold有小數,则采无条件进位。
对于每一点输出,其计算公式如下:
bin=1 if pix_data >= threshold
bin=0 if pix_data < threshold
设计该区块(8*8)之最大值为192,最小值为48,则threshold=(192+48)/2=120。后续区块内的pix_data >= threshold,bin输出为1;pix_data < threshold,bin输出为0。
图片说明

实际预期波形结果:(输入与输出波形顺序)
图片说明

查看全部
weixin_43830857
weixin_43830857
2019/01/01 19:27
  • 开发语言
  • 点赞
  • 收藏
  • 回答
    私信

0个回复