基于FPGA的非线性滤波器(三)

基于FPGA的非线性滤波器(三)

之并行全比较排序模块设计

由于排序运算在图像的行列方向上是同性的,因此,同时考虑首先进行一维图像方向上的排序,再对列方向上的行排序结果进行排序,即可得到一个窗口内的排序结果。

一维方向的排序运算模块,记为sort_1d。同样地,对于最终的二维排序运算模块,记为sort_2d。

1.sort_1d模块设计

计算步骤如下:

(1)首先得到待排序的n个数据:这可以通过将数据流打n-1拍实现。

(2)进行全比较:当前数据与其他所有一次进行比较,并记录比较结果,比较的过程需先考虑输入次序问题。

(3)将(2)中的记录结果进行相加:根据不同的比较宽度,相加工作可以通过多个时钟完成。

(4)查找(3)中相加结果按指定次序输出:如果要实现中值滤波,中间索引号输出,对于其他次序的滤波可以采用其他编号的数据输出。

以1x3的排序单元为例,至少需要6个比较器、3个加法器和6个寄存器,其设计框图如下图所示。

其中OUT_ID为输入信号,进行判决输出。例如对于种植滤波,选择中间结果进行输出。例如,设定我们的处理核为KSZ,则有

OUT_ID = KSZ>>1   中值滤波器
OUT_ID = 0      最大值滤波器
OUT_ID = KSZ-1   最小值滤波器
module sort_1d(
rst_n,
clk,
din,
din_valid,
dout,
dout_valid
 );
parameter DW = 14;
parameter KSZ = 3;
parameter OUT_ID = (KSZ>>1); //中值滤波器
parameter DW_MAX_NUM = 8; //输入数据个数的最大位宽
input rst_n;
input clk;
input [DW-1:0] din;
input din_valid;
output [DW-1:0] dout;
output  dout_valid;
reg [KSZ+3:0] din_valid_r; //输入有效寄存器
reg [DW-1:0] din_r [0:KSZ+2]; //输入数据寄存器
wire cmp_result [0:KSZ-1][0:KSZ-1]; //比较中间结果信号
reg [7:0] cmp_sum[0:KSZ-1]; //三个比较和寄存器
reg [7:0] cmp_sum_r[0:KSZ-1];
reg [7:0] cmp_sum_r2[0:KSZ-1];
reg [DW-1:0] dout_temp; //输出寄存器
//首先缓存输入数据和输入有效数据,同时得到待排序的数据
//缓存输入数据
always @(posedge clk or negedge rst_n)
begin
if(~rst_n)
begin
din_r[0] <= {DW{1'b0}};
end
else
begin
if(din_valid)
din_r[0] <= din;
end
end
generate
begin : xhdl0
genvar i;
for(i=1;i<=KSZ+2;i=i+1)
begin
always @(posedge clk or negedge rst_n)
if(~rst_n)
din_r[i] <= {DW{1'b0}};
else
din_r[i] <= din_r[i-1];
end
end
endgenerate
//缓存输入有效信号
always @(posedge clk or negedge rst_n)
if(~rst_n)
din_valid_r <= {KSZ+4{1'b0}};
else
din_valid_r <= (din_valid_r[KSZ+2:0],din_valid);
//关键比较代码如下
//将第一个数据与其他数据做比较  结果存放在cmp_result[0]中
generate
begin :xhdl1
genvar i;
for(i=1;i<=KSZ-2;i=i+1)
begin : cmp_1st
assign cmp_result[0][i] = (din_r[0] >= din_r[i]) ? 1'b1: 1'b0;
end
end
endgenerate
//与自身的比较结果置0
assign cmp_result[0][0] = 1'b0;
//其他数据比较电路
generate
begin : xhl4
genvar i;
for(i = 2; i <= KSZ; i = i+1)
begin : cmp_others
begin : xhdl2
genvar j;
for(j = 1; j <= i-1; j = j+1)
begin : cmp_previous
assign cmp_result[i-1][j-1] = (din_r[i-1] > din_r[j-1]): 1'b1:1'b0;
end
end
assign cmp_result[i-1][i-1] = 1'b0;
begin : xhdl3
genvar j;
for(j = i+1;j<=KSZ; j = j+1)
begin
assign cmp_result[i-1][j-1] <= (din_r[i-1] >= din_r[j-1]) ?1'b1:1'b0;
end 
end
end
end
end
endgenerate
//将比较结果相加
if(KSZ == 3)
begin : sum_ksz_3
always @(posedge clk or negedge rst_n)
if(~rst_n)
begin
cmp_sum[i] <=8'b0;
cmp_sum_r[i] <= 8'b0;
cmp_sum_r2[i] <= 8'b0;
end
else
begin
if(din_valid_r[KSZ-1])
begin
cmp_sum_r[i] <= (cmp_result[i][0]) + (cmp_result[i][2]);
cmp_sum_r2[i] <= cmp_result[i][1];
end
if(din_valid_r[KSZ])
begin
cmp_sum[i] <= cmp_sum_r[i] + cmp_sum_r2[i];
end
end
end 
//查找目标值
generate
if(KSZ == 3)
begin : dout_ksz_3
always @(posedge clk or negedge rst_n)
if(~rst_n)
dout_temp <= {DW{1'b0}};
else
begin
if(din_valid_r[KSZ+1])
begin
if(cmp_sum[0] == OUT_ID)
dout_temp <= din_r[2];
else if(cmp_sum[1] == OUT_ID)
dout_temp <= din_r[3];
else if(cmp_sum[2] == OUT_ID)
dout_temp <= din_r[4];
end
end
end
endgenerate
//数据有效输出
assign dout_valid = din_valid_r[KSZ+2];
assign dout = dout_temp;
endmodule

原文发布于微信公众号 - 瓜大三哥(xiguazai_tortoise)

原文发表时间:2017-09-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏mathor

matlab—进阶绘图

这里我们要讲的是画一些与对数(log)有关的图像,这里的log,既可以是图像是log,又可以是坐标轴是log,我们接下来用一个例子来说明

1953
来自专栏null的专栏

TensorFlow入门——Softmax Regression

下面的代码是利用TensorFlow实现的Softmax Regression的基本过程: ''' @author:zhaozhiyong @date:2017...

2825
来自专栏人工智能LeadAI

决策树会有哪些特性?

决策树(Decision Tree)是机器学习中最常见的算法, 因为决策树的结果简单,容易理解, 因此应用超级广泛, 但是机器学习的专家们在设计决策树的时候会考...

3697
来自专栏数据科学与人工智能

【算法】利用文档-词项矩阵实现文本数据结构化

“词袋模型”一词源自“Bag of words”,简称 BOW ,是构建文档-词项矩阵的基本思想。对于给定的文本,可以是一个段落,也可以是一个文档,该模型都忽略...

4367
来自专栏小小挖掘机

使用Seq2Seq+attention实现简单的Chatbot

本文代码的github连接:https://github.com/princewen/tensorflow_practice/tree/master/chat_...

3.8K6
来自专栏null的专栏

机器学习算法实现解析——libFM之libFM的训练过程概述

本节主要介绍的是libFM源码分析的第四部分——libFM的训练。 FM模型的训练是FM模型的核心的部分。 4.1、libFM中训练过程的实现 在FM模型的训练...

50511
来自专栏机器学习与自然语言处理

最大子序列和问题之算法优化

算法一:穷举式地尝试所有的可能 int maxSubsequenceSum(const int a[], int n) { int i, j, k; ...

2317
来自专栏ml

数据挖掘之聚类算法K-Means总结

序   由于项目需要,需要对数据进行处理,故而又要滚回来看看paper,做点小功课,这篇文章只是简单的总结一下基础的Kmeans算法思想以及实现; 正文:   ...

3978
来自专栏人工智能

TensorFlow简介

TensorFlow是由Google开发的用于解决复杂数学问题的库。本篇介绍将简述TensorFlow示例,如何定义、使用张量执行数学运算,以及查看其他机器学习...

3.5K13
来自专栏来自地球男人的部落格

Seq2Seq模型

前言: 此文翻译自TensorFlow tutorial: Sequence-to-Sequence Models 本文的尽量在做到意思正确的情况下,做到不...

35310

扫码关注云+社区

领取腾讯云代金券