当前位置: 首页 > 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设置里面通过改变延迟时钟周期的个数来改变流水线的级数。

相关文章:

  • i.MX 6ULL 驱动开发 十五:按键中断(input子系统)
  • Django用户认证系统
  • 论坛介绍 | COSCon'22 开源硬件(H)
  • 【Vulnhub靶场】——HARRYPOTTER第三部: FAWKES
  • [附源码]Java计算机毕业设计SSMjava视频点播系统
  • Day768.大佬推荐的经典的Redis学习资料 -Redis 核心技术与实战
  • fastdfs简介及在springboot中使用
  • OpenCASCADE使用(Stp to Gltf)
  • 进程互斥的硬件实现方式【操作系统学习笔记】
  • JavaScript教程-原生的原型,Object.prototype,其他的内建原型,从原型当中借用,原型方法,_proto_
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • 基于微信小程序的数码商城程序设计与实现(后台PHP+Mysql)
  • FA_06.不用刷机情况下升级或者降级系统中的fridaserver
  • 【笔试题】【day3】
  • 微信小程序|基于小程序实现人脸识别对比
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • javascript 总结(常用工具类的封装)
  • JavaScript学习总结——原型
  • node入门
  • PHP的类修饰符与访问修饰符
  • 阿里云Kubernetes容器服务上体验Knative
  • 安卓应用性能调试和优化经验分享
  • 和 || 运算
  • 前端之Sass/Scss实战笔记
  • 前言-如何学习区块链
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 正则表达式小结
  • 自动记录MySQL慢查询快照脚本
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • $forceUpdate()函数
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (二开)Flink 修改源码拓展 SQL 语法
  • (分布式缓存)Redis哨兵
  • (分类)KNN算法- 参数调优
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (译) 函数式 JS #1:简介
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET Core 版本不支持的问题
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .Net各种迷惑命名解释
  • .NET构架之我见
  • .NET开发人员必知的八个网站
  • .NET下的多线程编程—1-线程机制概述
  • .NET中的Exception处理(C#)
  • @Mapper作用
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现
  • [20140403]查询是否产生日志
  • [④ADRV902x]: Digital Filter Configuration(发射端)
  • [BJDCTF2020]The mystery of ip
  • [CLR via C#]11. 事件
  • [C语言]一维数组二维数组的大小