当前位置: 首页 > news >正文

FPGA—从加法运算理解流水线的作用

前言

最近在研究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设置里面通过改变延迟时钟周期的个数来改变流水线的级数。

相关文章:

  • Vue Router与Vite的无缝集成
  • openvoice v2 声音克隆使用案例
  • 芯片安全(security)
  • 内网穿透及公网解析说明
  • Windows安装Elasticsearch 7.9.2
  • 人脸识别开发项目汇总
  • Qt RGB三色灯上位机
  • 可观测性在威胁检测和取证日志分析中的作用
  • React Switch用法及手写Switch实现
  • WebAssembly 是啥东西
  • vue使用gitshot生成gif
  • vue2后台管理系统demo,包含增删查改、模糊搜索、分页
  • C++从入门到精通 C++98.11.14.17
  • 基于单片机的16×16点阵的滚动显示屏设计
  • LeetCode 940. 不同的子序列 II
  • 【VUE基础】webpack
  • 【漏洞复现-discuz-wooyun-命令执行】vulfocus/discuz-wooyun_2010_080723
  • SDWAN和MPLS谁才是最佳选择
  • 记一次失败的使用python selenium刷课学习通脚本(细节满满)+关于使用selenium的疑难杂症解决+json数据请求的疑难杂症+py冷门知识
  • Mybatis架构,SqlSessionFactory源码分析
  • 我终于读懂了设计模式的七大原则。。。
  • stm32f4xx-SPI
  • 高数(下) 第十二章:无穷级数
  • LeetCode·每日一题·940.不同的子序列 || · 动态规划
  • 【云原生】Elasticsearch + kibana on k8s 讲解与实战操作
  • 神经网络过拟合什么意思,神经网络中解决过拟合
  • win11toast:python桌面通知工具
  • 【cloud Alibaba】(四)分布式事务处理——Seata
  • [算法入门笔记] 19. 有序表
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • Java反射小练之手写BeanUtils的copyProperties(Upgrade)
  • 软件测试过程:单元测试,集成测试,系统测试,验收测试,回归测试