直方图统计的FPGA实现

直方图统计是图像处理算法中最基本和常见的算法之一,主要原理就是将图像中各个灰度级的像素个数进行计算并统计,这在一些对灰度特性进行统计的算法中比较常见。虽然直方图统计在MATLAB或软件中耗时也很少,但是现在随着FPGA的普及,更加快速的实现一些图像处理算法成为了主流。 
FPGA实现图像处理算法现在有几种主流的方式:1、HDL纯逻辑代码编写;2、基于System generator的模块搭建;3、Xilinx公司vivado套件中的HLS软件进行C/C++代码的转换。 
而本文主要采用第一种方法,即采用Verilog代码形式直接实现直方图统计算法。


  • 方法1:倍频操作
  • 方法2:相邻数据判断

倍频操作

直方图统计给人的第一反应就是按照软件中方法,设置256个寄存器,然后对每个像素大小进行判断后再对对应的寄存器进行+1,而在FPGA中可以充分利用内部RAM的完成这一操作。而在这边我们选用的是伪双端口RAM。 
在伪双端口RAM中,需要主要的是有两个设置选项: 
 
1、Primitives Output Register 
这一设置主要是在RAM的输出端口添加一个寄存器,对输出的数据进行打一拍缓存操作。如果勾选上这个,在高频时钟情况下,可以有效的保证输出信号满足建立和保持时间。而RAM本身默认读出数据延时为一拍,则RAM读出数据的总延时为2个时钟单位。 
2、Operating Mode 
主要包括了No Change , Write First和Read First,顾名思义,主要指的读出数据的先后顺序。在No Change模式下,写操作不改变输出端数据,在Write First模式下,如果对同一地址进行读写,则先写后读,在Read First模式下,如果对同一地址进行读写,则先读后写。

倍频方式的代码如下:(本例程中未勾选Primitives Output Register,且Operating Mode设置为Write First)

module his_count(
input rst_n,
input clk_150M,      //  150M
input LVAL,      //data的伴随使能信号
input [7:0]data  // 输入2K的图像,连续数据流
    );

reg LVAL_temp1,LVAL_temp2;
reg [7:0]data_temp1,data_temp2;

reg [20:0]addra;
reg [7:0]dina;
reg ena,wea;

reg [20:0]addrb;
reg enb;
reg [8:0]count=9‘d0;
wire [7:0]doutb;
wire clk_300M;
clk_wiz_1 clk_pll_inst
(
   // Clock in ports
   .clk_in1(clk_150M),      // 150M
   .clk_out1(clk_300M),     // 300M
   .reset(), // input reset
   .locked());      // output locked

//RAM的读出延时设为1
blk_mem_gen_1 L1 (
  .clka(clk_300M),
  .ena(ena),
  .wea(wea),
  .addra(addra),
  .dina(dina),
  .clkb(clk_300M),
  .rstb(),
  .enb(enb),
  .addrb(addrb),
  .doutb(doutb)
);
 always @(posedge clk_150M or negedge rst_n)
 begin
    if(!rst_n) begin
        {LVAL_temp2,LVAL_temp1}<=2‘d0;
        {data_temp2,data_temp1}<=16‘d0;
    end else begin
        {LVAL_temp2,LVAL_temp1}<={LVAL_temp1,LVAL};
        {data_temp2,data_temp1}<={data_temp1,data};
    end
 end

 // 读模块
 always @(posedge clk_150M or negedge rst_n)
 begin
    if(!rst_n) begin
        enb<=0;
        addrb<=21‘d0;
    end else begin
        enb<=LVAL;
        addrb<={14‘d0,data};
    end
 end

 //写模块
 always @(posedge clk_300M or negedge rst_n)
 begin
    if(!rst_n) begin
        ena<=0;
        wea<=0;
        addra<=21‘d0;
        dina<=8‘d0;
    end else begin
        ena<=LVAL_temp2;
        wea<=LVAL_temp2;
        addra<={14‘d0,data_temp2};
        dina<=doutb+1;
    end
 end

相邻数判断

相邻数判断主要通过判断前一个像素与之是否相同来改变RAM写入的数据。因为RAM的读出至少有一个延时,所以假如相邻的数遇到相同的情况,前一个数写入的数值无法被后一个数所读出,因此会遇到漏计数的情况。如果采用相邻数判断的方式,则可以避免倍频带来的时序问题。 
在本情况下,Operating Mode设置为Write First。且未勾选Primitives Output Register。 
代码如下:

module his_count(
input rst_n,
input clk_150M,      //  150M
input LVAL,      //data的伴随使能信号
input [7:0]data  // 输入2K的图像,连续数据流
    );

reg LVAL_temp2,LVAL_temp1;
reg [7:0]data_temp2,data_temp1;

reg [20:0]addra;
reg [7:0]dina;
reg ena,wea;

reg [20:0]addrb;
reg enb;
wire [7:0]doutb;
//RAM的读出延时设为1
blk_mem_gen_1 L1 (
  .clka(clk_150M),
  .ena(ena),
  .wea(wea),
  .addra(addra),
  .dina(dina),
  .clkb(clk_150M),
  .rstb(),
  .enb(enb),
  .addrb(addrb),
  .doutb(doutb)
);
 always @(posedge clk_150M or negedge rst_n)
 begin
    if(!rst_n) begin
        {LVAL_temp2,LVAL_temp1}<=2‘d0;
        {data_temp2,data_temp1}<=16‘d0;
    end else begin
        {LVAL_temp2,LVAL_temp1}<={LVAL_temp1,LVAL};
        {data_temp2,data_temp1}<={data_temp1,data};
    end
 end

 // 读模块
 always @(posedge clk_150M or negedge rst_n)
 begin
    if(!rst_n) begin
        enb<=0;
        addrb<=21‘d0;
    end else begin
        enb<=LVAL;
        addrb<={14‘d0,data};
    end
 end

 //写模块
 always @(posedge clk_150M or negedge rst_n)
 begin
    if(!rst_n) begin
        ena<=0;
        wea<=0;
        addra<=21‘d0;
        dina<=8‘d0;
    end else if(data_temp2 == data_temp1)begin
        ena<=LVAL_temp2;
        wea<=LVAL_temp2;
        addra<={14‘d0,data_temp2};
        dina<=doutb+2;
    end else begin
        ena<=LVAL_temp2;
        wea<=LVAL_temp2;
        addra<={14‘d0,data_temp2};
        dina<=doutb+1;
    end
 end
时间: 2024-08-06 23:48:15

直方图统计的FPGA实现的相关文章

OpenCV编程-&gt;RGB直方图统计

我们在处理彩色图像时,特别是在做局部图像的阈值分割时,需要一个直观的RGB统计图. 接下来开始实现. 代码: void CalcHistRGB() { IplImage* img_source; if (img_source = cvLoadImage("101.jpg",1)) { IplImage* RedChannel = cvCreateImage( cvGetSize(img_source), 8, 1); IplImage* GreenChannel = cvCreateI

Oracle索引梳理系列(十)- 直方图使用技巧及analyze table操作对直方图统计的影响(谨慎使用)

版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内容用于商业用途,将保留追究其法律责任的权利.如果有问题,请以邮箱方式联系作者([email protected]). 前言 针对索引列,尤其是存在严重数据倾斜的索引列,直方图的统计信息,对于CBO优化器更准确地选择执行计划至关重要. 对于初心者,可以从这篇文章中,了解到直方图对于索引列的价值.作用,

Opencv Cookbook阅读笔记(四):用直方图统计像素

灰度直方图的定义 灰度直方图是灰度级的函数,描述图像中该灰度级的像素个数(或该灰度级像素出现的频率):其横坐标是灰度级,纵坐标表示图像中该灰度级出现的个数(频率). #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream> using namespace c

MySQL 8.0 中统计信息直方图的尝试

直方图是表上某个字段在按照一定百分比和规律采样后的数据分布的一种描述,最重要的作用之一就是根据查询条件,预估符合条件的数据量,为sql执行计划的生成提供重要的依据. 在MySQL 8.0之前的版本中,MySQL仅有一个简单的统计信息却没有直方图,没有直方图的统计信息可以说是没有任何意义的. MySQL 8.0新特性之一就是开始支持统计信息的直方图,这个概念很早就提出来了,抽空具体尝试了一下使用方法. 之前写过MSSQL相关统计信息的一点东西,在原理上都是一致的, 照旧,直接上例子,造数据,创建一

数据库性能优化、统计信息与对象统计信息概述收集、扩展统计信息、dbms_stats.get_prefs

数据库性能优化 相关书籍: 1.基于成本的Oracle优化法则 2.Oracle性能诊断艺术 3.基于Oracle的SQL优化 ----------------------------------------------------------------------------------------- 两种优化器: CBO  cost-base optimizer 基于cost 更大适应性/灵活性/10g开始 RBO  rule-base optimizer 基于规则 制定了15条/10g以

Oracle的直方图

1 直方图的含义 在Oracle数据库中,CBO会默认认为目标列的数据在其最小值LOW_VALUE和最大值HIGH_VALUE之间均匀分布的,并且会按照这个均匀分布原则来计算对目标列施加查询条件后的可选择率以及结果集的Cardinality,进而据此来计算成本值并选择执行计划.但目标列的数据是均匀分布这个原则并不总是正确的,在实际的系统中,我们很容易就能看到一些目标列的数据分布是不均匀的,甚至是极度倾斜.分布极度不均衡的.对这样的列如果还按照均匀分布的原则去计算可选择率与Cardinality,

学习笔记(二)——直方图均衡化和匹配

? 本文为原创作品,转载请注明出处 欢迎关注我的博客:http://blog.csdn.net/hit2015spring 和 http://www.cnblogs.com/xujianqing/ 作者:许剑清???? (叶舞清风) ? ? 本文的学习是基于冈萨雷斯<数字图像处理第二版>这本专著的对应于书中章节3.3 这一篇文章如题,主要是讲直方图均衡化和匹配的一些基本概念.不涉及很多的技术问题专业数学推导,只是为入门图像处理做一个感性的认识,具体应用请朋友们自己发挥创造,欢迎大家一起来交流.

04 系统和对象统计信息

本章提要----------------------------------------------------工具包 dbms_stats系统统计对象统计通用服务----------------------------------------------------实际上, 仅知道要处理的SQL语句和它引用的对象结构, 查询优化器还是无法提供高效的执行计划, 优化器还必须要量化待处理的数据量.4.1 工具包 dbms_stats 简介    过去, 对象统计是通过SQL语句ANALYZE来收集

收集oracle统计信息

优化器统计范围: 表统计: --行数,块数,行平均长度:all_tables:NUM_ROWS,BLOCKS,AVG_ROW_LEN:列统计: --列中唯一值的数量(NDV),NULL值的数量,数据分布:             --DBA_TAB_COLUMNS:NUM_DISTINCT,NUM_NULLS,HISTOGRAM:索引统计:--叶块数量,等级,聚簇因子:             --DBA_INDEXES:LEAF_BLOCKS,CLUSTERING_FACTOR,BLEVEL: