0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

454398 来源:AI加速微信公众号 作者:AI加速微信公众号 2020-12-10 16:37 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

引言

直方图统计在图像增强和目标检测领域有重要应用,比如直方图均衡,梯度直方图。直方图的不同种类和统计方法请见之前的文章。本章就是用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数据的求和,那么就需要通过累加器来完成。

o4YBAF9uDqWAayv7AAByjAeQGbU256.png

图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

o4YBAF9uDqeAUrozAAEPRvgT6Rs060.png

图3.1 验证架构图

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

图3.2 modelsim仿真波形和结果

编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1664

    文章

    22571

    浏览量

    640733
  • 直方图
    +关注

    关注

    0

    文章

    21

    浏览量

    8174
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何确保微电网标准化架构设计流程的完整性?

    当前,微电网建设普遍存在设计流程碎片化、环节衔接不畅、标准执行不到位、成果追溯缺失等问题,导致架构设计与实际需求脱节、工程落地困难、运维成本偏高,甚至影响系统长期稳定运行。GB/T
    的头像 发表于 04-24 11:19 179次阅读
    如何确保微电网标准化<b class='flag-5'>架构设</b>计流程的完整性?

    交流微电网架构设计:拓扑结构、核心组件与适配场景

    “双碳”目标实现的重要载体。交流微电网架构设计的核心,是通过合理规划拓扑结构、科学配置核心组件,实现与应用场景的精准适配,最终达成安全稳定、高效经济的运行目标。拓扑结构决定架构的整体布局与运行特性,核心
    的头像 发表于 04-09 16:54 922次阅读
    交流微电网<b class='flag-5'>架构设</b>计:拓扑结构、核心组件与适配场景

    西格电力微电网总体架构设计:分层分布式控制体系构建

    随着分布式新能源规模化渗透、负荷需求多元化升级,微电网作为整合“源、储、荷、网”多单元的新型能源系统,其安全稳定、高效经济运行的核心诉求,对总体架构设计与控制体系提出了更高要求。微电网总体架构是系统
    的头像 发表于 03-31 11:44 613次阅读
    西格电力微电网总体<b class='flag-5'>架构设</b>计:分层分布式控制体系构建

    2022全新版!Java分布式架构设计与开发实战(完结)

    缓解了单点压力,成为Java后端架构设计的必备技能。 分库分表的本质是通过水平拆分或垂直拆分的方式,将原本集中存储的数据分散到多个数据库实例或数据表中。水平拆分按数据行进行划分,所有分片表结构完全一致
    发表于 03-30 15:20

    微电网总体架构设计原则:安全、高效、灵活的三重导向

    的运行稳定性、能源利用效率与场景适配能力。在微电网架构设计中,“安全、高效、灵活”三大导向并非孤立存在,而是相互支撑、协同统一的有机整体——安全是底线,筑牢微电网运行的根基;高效是核心,彰显微电网的能源
    的头像 发表于 03-27 14:12 364次阅读
    微电网总体<b class='flag-5'>架构设</b>计原则:安全、高效、灵活的三重导向

    X (Twitter) 推荐系统架构设计深度解析

    推荐系统到底是如何理解海量用户与内容的?本期文章带你深入 X (前 Twitter) 推荐算法库的底层源码。解构推荐系统关键的“漏斗型”架构——从高效的双塔召回到复杂精妙的 Transformer
    的头像 发表于 02-25 23:56 5283次阅读

    AMD UltraScale架构:高性能FPGA与SoC的技术剖析

    AMD UltraScale架构:高性能FPGA与SoC的技术剖析 在当今的电子设计领域,高性能FPGA和MPSoC/RFSoC的需求日益增长。AMD的UltraScale架构凭借其创
    的头像 发表于 12-15 14:35 847次阅读

    基于DSP与FPGA异构架构的高性能伺服控制系统设计

    DSP+FPGA架构在伺服控制模块中的应用,成功解决了高性能伺服系统对实时性、精度和复杂度的多重需求。通过合理的功能划分,DSP专注于复杂算法和上层控制,FPGA处理高速硬件任务,两者
    的头像 发表于 12-04 15:38 941次阅读
    基于DSP与<b class='flag-5'>FPGA</b>异构<b class='flag-5'>架构</b>的高性能伺服控制系统设计

    FPGA+DSP/ARM架构开发与应用

    自中高端FPGA技术成熟以来,FPGA+DSP/ARM架构的硬件设计在众多工业领域得到广泛应用。例如无线通信、图像处理、工业控制、仪器测量等。
    的头像 发表于 10-15 10:39 4666次阅读
    <b class='flag-5'>FPGA</b>+DSP/ARM<b class='flag-5'>架构</b>开发与应用

    基于FPGA的CLAHE图像增强算法设计

    CLAHE图像增强算法又称为对比度有限的自适应直方图均衡算法,其算法原理是通过有限的调整图像局部对比度来增强有效信号和抑制噪声信号。
    的头像 发表于 10-15 10:14 895次阅读
    基于<b class='flag-5'>FPGA</b>的CLAHE图像增强<b class='flag-5'>算法</b>设计

    25年11月上海FPGA算法实现与应用技术高级研修分享

    。希望有更多的朋友参与其中,一起深入研究和探讨,一起成长。   适合参加的对象:适合于使用FPGA器件进行科研和产品开发的工程技术人员,也适合于相关领域的教师和研究生。参加学习的学员只需要具有
    发表于 10-11 11:55

    TensorRT-LLM的大规模专家并行架构设

    之前文章已介绍引入大规模 EP 的初衷,本篇将继续深入介绍 TensorRT-LLM 的大规模专家并行架构设计与创新实现。
    的头像 发表于 09-23 14:42 1501次阅读
    TensorRT-LLM的大规模专家并行<b class='flag-5'>架构设</b>计

    基于FPGA实现FOC算法之PWM模块设计

    哈喽,大家好,从今天开始正式带领大家从零到一,在FPGA平台上实现FOC算法,整个算法的框架如下图所示,如果大家对算法的原理不是特别清楚的话,可以先去百度上学习一下,本教程着重介绍实现
    的头像 发表于 07-17 15:21 3794次阅读
    基于<b class='flag-5'>FPGA</b>实现FOC<b class='flag-5'>算法</b>之PWM模块设计

    基于FPGA的压缩算法加速实现

    本设计中,计划实现对文件的压缩及解压,同时优化压缩中所涉及的信号处理和计算密集型功能,实现对其的加速处理。本设计的最终目标是证明在充分并行化的硬件体系结构 FPGA 上实现该算法时,可以大大提高该算法
    的头像 发表于 07-10 11:09 2690次阅读
    基于<b class='flag-5'>FPGA</b>的压缩<b class='flag-5'>算法</b>加速实现

    【高云GW5AT-LV60 开发套件试用体验】基于开发板进行深度学习实践,并尽量实现皮肤病理图片的识别

    说了。 首先想先对一张图片进行相关算法的处理,不如比较开源的有对输入的灰度图像执行自适应直方图均衡化 (AHE)。或者 CLAHE(Contrast Limited Adaptive Histogram
    发表于 06-11 22:35