一、 問題:
使用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。
实际预期波形结果:(输入与输出波形顺序)