首页 > 技术 > 内容

基于直方图算法的FPGA设计架构

时间:2025-11-29  作者:Diven  阅读:0

引言

直方图统计在图像增强和目标检测领域有重要应用,比如直方图均衡,梯度直方图。直方图的不同种类和统计方法请见之前的文章。本章就是用FPGA来进行直方图的计算,并且利用FPGA的特性对计算过程进行加速。安排如下:

首先基于直方图算法进行FPGA架构设计,这里主要考虑了如何加速以及FPGA资源的利用两个因素;最后基于system Verilog搭建一个验证系统。

FPGA设计架构

不论是图像灰度直方图还是梯度直方图,本质上是对数据的分布进行计数。从FPGA角度来看,只关心以下几点:

1) 根据数据大小确定其分布区间,统计分布在不同区间的数据个数,区间的大小可以调节,比如灰度直方图区间为1,梯度直方图通常大于1;

2) 如何利用FPGA对直方图统计进行加速,以及如何考虑到芯片有限资源;

首先来考虑加速方式,直方图统计过程用伪代码表示为:

For(int i=0;i Index = get_index(data[i]);

Hist[index]++;

}

Get_index函数是为了确定数据属于哪个区间,如果区间大小为1,那么index就是数据自身。如果区间是平均分布,那么就需要进行数据的大小比较。如果区间大小是2的幂次,那么index只需要数据进行移位得到。

FPGA在加速计算中最主要就是利用并行化和流水线,并行化就是将一个任务拆解成多个子任务,多个子任务并行完成。而流水线是在处理一个子任务的时候,下一个来的子任务也可以进行处理,处理模块不会等待。流水线本质上是对子任务也进行“分割”,分割的每一块可以在处理模块中同时进行。

统计N个数据,可以将N分成M份,在FPGA上同时进行M个统计,用伪代码表示为:

For(int k=0;k //并行化

For(int i=0;i Index = get_index(data[k][i]);

Hist[k][index]++;

}

}

如果区间不是2的幂次,就需要比较器,这样并行M次,就需要M个同等比较器,这对资源消耗很大。因此目前设计仅仅支持2的幂次的区间。整个设计架构如图1.2。

图2.1 流水线处理

图2.2 直方图统计架构

主要分为以下几个模块:

1)statis:这个是核心计算模块,统计数据分布。RAM中存放直方图统计数据,地址对应着数据分布区间。这里有一个问题需要考虑,在对RAM中直方图统计数据计数时,需要读出然后计数。如果ram读端口没有寄存器,那么读出来直接加1,再写入。但是这样并不好,因为ram不经过寄存器时序不好。所以增加了一级寄存器,这样就造成了写入的延时,那么有可能下一次数据来临也会读取同样地址的数据,此时读取到的直方图数据就是还没有写入的。为了解决这个问题,判断进入的前后两个数据是否相同,如果相同就不写入而继续计数,如果不同就写入。并行多个statis模块的代码为:

genvar i;

generate

for(i=0;i

statis #(

.PIX_BW(PIX_BW),

.HIST_BW(HIST_BW),

.ADDR_BW(HIST_LEN_BW),

.BIN_W(BIN_W)

)u_statis(

.clk(clk),

.rst(rst),

.clr(clr),

.enable(1‘b1),

.pix_valid(pix_valid),

.pix(img_i[i*PIX_BW +: PIX_BW]),

.hist_rd(branch_hist_rd),

.hist_raddr(branch_hist_raddr),

.hist(branch_hist[i*HIST_BW +: HIST_BW])

);

end

endgenerate

2)serders:这个是并转串。M个statis模块会产生M组hist结果,这些结果还要进行求和,那么就要用到加法树,如果M较大,会造成加法树很大,多以这里加了serders可以调节加法树资源。

3) addTree:加法树。

Module addTree #(

parameter DATA_BW = 32,//bit width of data

parameter TREE_DEPTH = 3,//depth of the add tree

parameter ADD_N = 4//add number

input clk,

input rst,

input [ADD_N*DATA_BW-1:0] adnd_x,

input [ADD_N*DATA_BW-1:0] adnd_y,

input adnd_valid,

output reg[DATA_BW-1:0] finl_sum,

output reg finl_sum_valid

);

reg [TREE_DEPTH-1:0]midl_valid;

genvar dept_i, leaf_i;

generate

for(dept_i=TREE_DEPTH-1;dept_i》=0;dept_i=dept_i-1)begin: ADD_DPET

localparam LEAF_N = 2**dept_i;

wire[DATA_BW-1:0] midl_sum[LEAF_N-1:0];

for(leaf_i=0;leaf_i

reg [DATA_BW-1:0] midl_add_x;

reg [DATA_BW-1:0] midl_add_y;

if(dept_i==TREE_DEPTH-1)begin

always @(posedge clk)begin

midl_add_x midl_add_y end

end

else begin

always @(posedge clk)begin

midl_add_x midl_add_y end

end

adder #(

.DATA_BW(DATA_BW)

u_adder(

.adnd_x(midl_add_x),

.adnd_y(midl_add_y),

.sum(midl_sum[leaf_i])

);

end

if(dept_i==TREE_DEPTH-1)

always @(posedge clk)begin

midl_valid[dept_i] end

else

always @(posedge clk)begin

midl_valid[dept_i] end

end

endgenerate

always @(posedge clk)begin

finl_sum end

always @(posedge clk)begin

if(rst)

finl_sum_valid else

finl_sum_valid end

endModule

4) accum:累加器。如果加法树没有完成M个hist数据的求和,那么就需要通过累加器来完成。

图2.3 对ram的处理

验证结构

1) img_trans:这个是随机化图像数据定义,主要通过SV中constraint来对图像大小做一些约束;

class img_trans;

rand int img_w;

rand int img_h;

rand int img_blank;

rand logIC[`PIX_BW-1:0] img[`MAX_IMG_W*`MAX_IMG_H];

constraint img_cfg_cnst{

img_w img_w 》 0;

img_w % `PARALL == 0;

img_h img_h 》 0;

img_blank img_blank 》= 0;

}

extern function void write(input string f_name);

endclass

2) driver:产生image并且发送给DUT,同时通过mailbox发送给ref_model用于对比;

class img_obj;

logIC [`PIX_BW-1:0] img_que[$];

endclass

class driver;

int img_w;

int img_h;

int img_blank;

logic [`PARALL*`PIX_BW-1:0] img;

logic [`PIX_BW-1:0] img_ele;

img_obj imgObj;

img_trans imgTrans;

extern task drive(mailbox img_mbx, virtual img_inf.test imgInf);

endclass

3) ref_model:自己统计直方图和DUT的结果进行比对;

class ref_modl;

logic [`PIX_BW-1:0] img;

int addr;

img_obj imgObj;

int hist[`HIST_LEN];

extern task calc(input logic clk, mailbox img_mbx);

extern task comp(virtual img_inf.test imgInf);

extern task run(input logic clk, mailbox img_mbx, virtual img_inf.test imgInf);

extern function void clear();

endclass

图3.1 验证架构图

最后添加一下modelsim仿真波形文件和结果,纯粹为了增加篇幅。

图3.2 modelsim仿真波形和结果

猜您喜欢


导轨插座是常见的电气连接设备,应用于工业控制系统中。种类繁多,主要区别体现在结构、功能和适用场景等方面。导轨插座的结构设计各异,有的采用标准化设计,便于快速安装...
2025-04-15 15:22:41
开关二极管是重要的电子元器件,应用于电路中用于控制电流的流动。主要功能是允许电流在一个方向上流动,而在反方向上阻止电流的流动。本文将详细介绍开关二极管的使用方法...
2025-04-09 11:30:36
电子元件中,贴片电阻是常见的被动元件,应用于各种电子电路中。由于其体积小、功耗低、可靠性高,越来越多的电子设计师选择使用贴片电阻。而在实际应用中,贴片电阻的换算...
2025-04-18 15:01:44
能源(Energy Source)亦称能量资源或能源资源,为人类的生产和生活提供各种能力和动力的物质资源,是国民经济的重要物质基础,未来国家命运取决于能源的掌控...
2024-01-12 10:21:00
电子元件中,电容器是重要的组成部分。安规电容和薄膜电容很常见。有不同的特性和用途。本文将探讨这两种电容的不同之处。定义不同安规电容是用于安全的电容。薄膜电容则是...
2025-03-24 15:31:07
粉尘检测仪是现代工业和环境监测中不可少的重要工具,其主要优势体现在以下几个方面。粉尘检测仪能够实时监测空气中粉尘的浓度,确保工作环境的安全性。通过精准的数据采集...
2015-12-22 00:00:00
墙纸作为装饰材料越来越受到人们的青睐。在众多墙纸品牌中,YOUR HOME 靓雅壁纸高品质的产品和独特的设计风格赢得了消费者的喜爱。作为家居安全的重要保障,保险...
2020-10-11 05:25:30
电阻器作为电子元器件中的重要组成部分,其性能和质量直接影响到整个电子设备的稳定性和可靠性。作为国内知名的电子元件制造商,风华高科(FH)凭借其先进的技术和严格的...
2012-06-01 02:33:30
现代电子设备中,连接器的作用不可忽视。不仅负责电力和信号的传输,而且在设备的整体性能和稳定性方面起着关键作用。CONN_25.40X10.12MM_TM是一款受...
2025-04-24 09:00:09
贴片电阻是电子电路中不可或缺的元件,其阻值计算对于电路设计至关重要。为了方便快速计算,我们整理了常用的贴片电阻计算公式表格,即使您不是电子专业人士也能轻松上手。...
2024-11-26 11:29:29