前言
最近在研究FPGA图像处理算法,在学习均值滤波的过程中,需要将8个数相加,但是我看到了两种相加的方法,一种是直接相加,一种是使用PARALLEL_ADD IP核,让我想不通的是这两种方法的区别是什么?什么情况下使用对应的方法呢?
这里首先简单的模拟一下像素值的变化
其中i_a0,i_a1,i_a2,i_a3,i_a4,i_a5,i_a6,i_a7表示8个变化的像素值,clk表示像素时钟
reg [7:0]i_a0;
reg [7:0]i_a1;
reg [7:0]i_a2;
reg [7:0]i_a3;
reg [7:0]i_a4;
reg [7:0]i_a5;
reg [7:0]i_a6;
reg [7:0]i_a7;
always@(posedge clk or negedge rst_n)
if(!rst_n)begin
i_a0 <= 0;
i_a1 <= 0;
i_a2 <= 0;
i_a3 <= 0;
i_a4 <= 0;
i_a5 <= 0;
i_a6 <= 0;
i_a7 <= 0;
end
else if(i_a0>=8'd255)begin
i_a0 <= 0;
i_a1 <= 0;
i_a2 <= 0;
i_a3 <= 0;
i_a4 <= 0;
i_a5 <= 0;
i_a6 <= 0;
i_a7 <= 0;
end
else begin
i_a0 <= i_a0 + 1'b1;
i_a1 <= i_a1 + 1'b1;
i_a2 <= i_a2 + 1'b1;
i_a3 <= i_a3 + 1'b1;
i_a4 <= i_a4 + 1'b1;
i_a5 <= i_a5 + 1'b1;
i_a6 <= i_a6 + 1'b1;
i_a7 <= i_a7 + 1'b1;
end
实验
方法一 :简单粗暴,直接相加
assign sum = i_a0 + i_a1 + i_a2 + i_a3 + i_a4 + i_a5 + i_a6 + i_a7;
综合后的电路是这样的
综合报告
最大频率
方法二 :a.调用PARALLEL_ADD IP(不延迟)
paralleladd paralleladd (
// .clock(clk), // 这里被屏蔽了哦
.data0x(i_a0),
.data1x(i_a1),
.data2x(i_a2),
.data3x(i_a3),
.data4x(i_a4),
.data5x(i_a5),
.data6x(i_a6),
.data7x(i_a7),
.result(sum)
);
IP 设置,== 注意箭头位置 ==
综合报告
最大频率
这里大家看出什么来了?从综合报告来看,调用PARALLEL_ADD(不延迟)IP和直接相加使用的逻辑资源都是相同的,并且最大频率(性能)也相同,所以这两种方法在这里并无区别,那么为什么还要搞个IP呢,这部是多此一举嘛?当然不是,请看后面
方法二 :b.调用PARALLEL_ADD IP(延迟)
paralleladd paralleladd (
.clock(clk),
.data0x(i_a0),
.data1x(i_a1),
.data2x(i_a2),
.data3x(i_a3),
.data4x(i_a4),
.data5x(i_a5),
.data6x(i_a6),
.data7x(i_a7),
.result(sum)
);
IP 设置,注意箭头位置
综合报告
最大频率
这里可以看到,这里带有延迟一个时钟周期的PARALLEL_ADD IP的最大频率变高了,说明性能更高了,但是同时使用的资源也更多(这里多了8个8位寄存器)
总结
可以发现,在不追求性能的条件下,我们可以直接对8个数相加,如果要追求性能,我们可以考虑调用PARALLEL_ADD IP核,该IP核通过流水线的思想,添加寄存器,以面积换速度,提高算法性能。当然我们也可以自己设计流水线,但是调用IP的方法更加方便,在IP设置里面通过改变延迟时钟周期的个数来改变流水线的级数。