【CNN-FPGA开源项目解析】03--单格乘加运算单元PE 单窗口卷积块CU 模块

news2024/11/20 10:38:10

03–单格乘加运算单元PE & 单窗口卷积块CU

文章目录

  • 03--单格乘加运算单元PE & 单窗口卷积块CU
    • 前言
    • 单格乘加运算单元PE
      • 代码
      • 模块结构
      • 时序逻辑分析
      • 对其上层模块CU的要求
    • 单窗口卷积块CU
      • 代码
      • 逻辑分析

前言

​ 第一和第二篇日志已经详细阐述了"半精度浮点数"的加法和乘法模块了。需要注意,他们的输入和输出均是16bit的半精度浮点数。现在我们自下而上,向着更顶层进发,用floatMult16和floatAdd16模块搭建基本的卷积运算模块。

​ 另外,对于卷积神经网络中基本的卷积运算方法、卷积核、卷积层结构和参数等基础知识这里不会赘述,默认读者已经掌握。


单格乘加运算单元PE

​ 在进行Image与filter的完整卷积运算之前,我们需要更小的模块去支持这样的操作。首先最基本的是image的一格与filter的一格进行的乘法运算。在一个卷积窗口内,这样一次又一次的乘法操作结束后需要进行累加,得到最后的卷积结果。

代码

`timescale 100 ns / 10 ps

module processingElement16(clk,reset,floatA,floatB,result);

parameter DATA_WIDTH = 16;

input clk, reset;
input [DATA_WIDTH-1:0] floatA, floatB;
output reg [DATA_WIDTH-1:0] result;

wire [DATA_WIDTH-1:0] multResult;
wire [DATA_WIDTH-1:0] addResult;

floatMult16 FM (floatA,floatB,multResult);
floatAdd16 FADD (multResult,result,addResult);

always @ (posedge clk or posedge reset) begin
	if (reset == 1'b1) begin
		result = 0;
	end else begin
		result = addResult;
	end
end

endmodule

模块结构

  • floatA和floatB分别是image和filter中的一格数据,他们输入到PE里来进行运算。
  • 实例化floatMult16和floatAdd16,依"先乘后累加"的逻辑将他们连接起来。

在这里插入图片描述

​ 值得注意的是,这里用到了latch的结构进行累加,即把输出addResult作为输入再次参与加运算

时序逻辑分析

在这里插入图片描述
① 每个时钟周期上升沿到来时,两个16bit数A和B输入进来。在很短的时间里(一个clk周期内)Mult模块计算出乘积结果AB,并交付于Add模块。

② 上一个时钟周期运算完的累加结果addResult输入到Add模块,在极短的时间内(一个clk周期内)与AB进行加运算,得到本次的累加结果sum+AB,交付给后方寄存器result。

③ 在下个时钟上升沿到来时,result内存储的累加结果更新为本次的运算结果。同时,result也作为本模块的输出。

④ 下一个时钟上升沿到来…

对其上层模块CU的要求

每一个时钟周期都必须输入新的两个数A和B,或者当没有新的卷积任务时将输入口置零。否则将会一直对同一格进行乘加造作,导致重复运算的错误。


单窗口卷积块CU

​ CU是PE的上一层,负责完成一整个窗口卷积结果的输出。换言之,在每一个时钟上升沿到来时,CU需要将一个窗口内n*n个格的数依次输入给PE

​ 本工程中使用的filter大小是5*5单通道的,因此一个窗口的大小也是1*5*5=25格,也就是25*16=400bit。

代码

`timescale 100 ns / 10 ps

module convUnit(clk,reset,image,filter,result);

parameter DATA_WIDTH = 16;
parameter D = 1; //depth of the filter
parameter F = 5; //size of the filter

input clk, reset;
input [0:D*F*F*DATA_WIDTH-1] image, filter;
output [0:DATA_WIDTH-1] result;

reg [DATA_WIDTH-1:0] selectedInput1, selectedInput2;

integer i;


processingElement16 PE
	(
		.clk(clk),
		.reset(reset),
		.floatA(selectedInput1),
		.floatB(selectedInput2),
		.result(result)
	);

// The convolution is calculated in a sequential process to save hardware
// The result of the element wise matrix multiplication is finished after (F*F+2) cycles (2 cycles to reset the processing element and F*F cycles to accumulate the result of the F*F multiplications) 
always @ (posedge clk, posedge reset) begin
	if (reset == 1'b1) begin // reset
		i = 0;
		selectedInput1 = 0;
		selectedInput2 = 0;
	end else if (i > D*F*F-1) begin 
		selectedInput1 = 0;
		selectedInput2 = 0;
	end else begin
		selectedInput1 = image[DATA_WIDTH*i+:DATA_WIDTH];
		selectedInput2 = filter[DATA_WIDTH*i+:DATA_WIDTH];
		i = i + 1;
	end
end

endmodule

重要变量说明:

  • selectedInput1和 selectedInput2:在遍历时,分别存储image和filter的一格,输入到PE。
  • i :索引变量。

逻辑分析

​ 其实逻辑非常清晰易懂:

  • 每个时钟上升沿,选择从DATA_WIDTH*i位置开始,往低位DATA_WIDTH位的数据(即一格16bit数据)。image的一格交给input1,filter的一格交给input2。
  • 当一个窗口全都交付运算(i > D*F*F-1)时,A与B均输入16bit的0,防止重复运算最后一格的数据。
  • 此模块的reset受其上层模块convLayerSingle控制。每完成一个窗口的卷积操作,中顿2个时钟周期,随后进行复位,重新开始新的卷积任务。

(图片和卷积核本是二维数据矩阵,但经过了RFselector后被展平为一维数据,可以通过单变量索引拿取)


开源项目github-URL:CNN-FPGA

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1031834.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity截图生成图片 图片生成器 一键生成图片

使用Unity编辑器扩展技术实现快速截图功能 效果: 里面没有什么太难的技术,直接上源码吧 注意!代码需要放在Editor文件下才能正常运行 using System; using UnityEditor; using UnityEngine;[ExecuteInEditMode] public class Screenshot …

上网行为监管软件(上网行为管理软件通常具有哪些功能)

在我们的日常生活中,互联网已经成为了我们获取信息、交流思想、进行工作和娱乐的重要平台。然而,随着互联网的普及和使用,网络安全问题也日益突出,尤其是个人隐私保护和网络行为的规范。在这个背景下,上网行为审计软件…

将自己的代码发布成可以pip安装的包

要将自己的Python代码打包并通过pip进行安装,可以按照以下步骤进行操作: 创建一个新的文件夹,并将您的Python代码放入其中。确保您的代码结构是标准的Python包结构,即包含__init__.py文件和其他可能的模块文件。 结构示例:your_p…

【LeetCode75】第六十一题 打家劫舍

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 这是力扣里一道关于动态规划的很经典的一道题。 那么首先呢我们扮演一个小偷,有一堆的房屋让我们偷,但是我们不能…

计算机竞赛 深度学习OCR中文识别 - opencv python

文章目录 0 前言1 课题背景2 实现效果3 文本区域检测网络-CTPN4 文本识别网络-CRNN5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习OCR中文识别系统 ** 该项目较为新颖,适合作为竞赛课题方向,…

分享一个清理工具栏和插件的小工具

现在只要是经常用SolidWorks的,肯定是多多少少知道一些插件,有时候安装了很多个插件的时候,工具栏可能会乱串,而且还有可能出现插件删除了,但插件里面还能看到。 这其中的原因很简单,基本上都是反注册或者…

ArryList线程安全问题以及解决方案

arrayList是一个线程不安全的集合,在多线程情况下可能会引起数据不一致、数组越界等问题。下面具体列一下多线程情况下ArrayList会出现什么错误. 1.java.util.ConcurrentModificationException ConcurrentModificationException 中文意思就是并发修改异常,存在于并…

【从入门到起飞】JavaSE—方法引用

🎊专栏【JavaSE】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【The truth that you leave】 🥰欢迎并且感谢大家指出我的问题 文章目录 🍔概述🍔注意🎈如何确定是否是…

电脑msvcr100.dll丢失的解决方法,找不到msvcr100.dll的修复方法分享

msvcr100.dll 丢失是一种常见的软件运行错误,通常会在运行某些程序时出现。这个问题可能是由于多种原因导致的,例如病毒感染、软件损坏、卸载应用程序时误删除文件等。为了解决这个问题,我们需要采取一些措施来恢复 msvcr100.dll 文件。 一、…

heic图片如何转为jpg格式

heic图片如何转为jpg格式?现阶段,在技术水平不断完善的基础上,图片质量越来越好了,且图片数量也越来越多。图片内容不断丰富,导致图片格式愈发多样化。为了能够保证图片的有效应用,我们有的时候需要将图片格…

一台PoE交换机可以为多少个设备提供供电?

如今在安防监控领域,许多网络设备都支持PoE供电。在网络监控工程中,为了节省布线成本并提高便捷性,大多数工程商选择使用PoE供电方案,也就是使用PoE交换机为监控摄像头提供电力。那么,一台功率输出以太网(P…

可以创业,也可以副业的网上长期挣钱的项目

在这个飞速发展的互联网时代,越来越多的人开始尝试在网上创业或者寻找一份可持续的副业来增加收入。不过在网上赚钱的难度是比较大的,不是轻易就能做到的,所以不付出一番努力,没有悟性和执行力,那么是很难做好的&#…

MongoDB【部署 04】Windows系统实现MongoDB多磁盘存储

Windows系统实现多磁盘存储 1.为什么2.多磁盘存储2.1 数据库配置2.2 文件夹磁盘映射2.3 创建新的数据集 3.总结 1.为什么 这里仅针对只有一台Windows系统服务器的情景: 当服务器存储不足时,或者要接入更多的数据,就会挂载新磁盘&#xff0c…

Vim编辑器使用入门

目录 一、Vim 编辑器基础操作 二、Vim 编辑器进阶操作 三、Vim 编辑器高级操作 四、Vim 编辑器文件操作 五、Vim 编辑器文件管理 六、Vim 编辑器进阶技巧 七、Vim 编辑器增强功能 Vim的三种工作模式 一、Vim 编辑器基础操作 1.移动光标 - 光标的移动控制 移动光标有两…

JS手动实现发布者-订阅者模式

发布-订阅模式是一种对象间一对多的依赖关系,当一个对象的状态发送改变时,所有依赖于它的对象都将得到状态改变的通知。具体过程是:订阅者把自己想订阅的事件注册到调度中心,当发布者更新该事件时通知调度中心,由调度中…

python每日一题(模拟用户登录验证)

1、题目 预先设定正确用户名与密码,用来验证用户是否登录成功。 第一次: ① 输入用户名与密码,如果用户名与密码正确,则提示登录成功; ② 如果用户名错误(不管密码是否正确),则需要重…

【NetEQ】读 《白话解读 WebRTC 音频 NetEQ 及优化实践》学习笔记

白话解读 WebRTC 音频 NetEQ 及优化实践webrtc 的重要模块 官方文档 :转载请标明出处:大神翻译 大神地址 : https://blog.csdn.net/lhl_blog/article/details/10993605GIPS NetEQ概述 GIPS NetEQ是一项专为IP电信系统开发的高级语音质量处理技术,其能够在大幅提高语音质量的…

ros 接收相机数据数据并发布

完整这个任务不需要用到python3 效果如下所示 环境 ROS1 python2.7 原始环境 无conda 或者conda deactivate 无conda 状态 pip install rospkg pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python4.2.0.3 代码 放在工程目录中 #!/usr/bin/env …

stm32学习笔记:OLED显示屏

一、OLED简介 OLED:有机发光二极管,供电∶3~5.5V,通信协议︰I2C/SPI,分辨率∶12864 二、常用的调试方式 串口调试∶通过串口通信,将调试信息发送到电脑端,电脑使用串口助手显示调试信息 显示屏调试∶直接将显示屏连接…

龙讯旷腾机器学习力场PWMLFF V0.1.0——优化件lammps接口,提供主动学习方案

PWMLFF(机器学习力场)手册 http://doc.lonxun.com/PWMLFF/ 我们都知道从第一性原理出发的分子动力学(Ab Initio Molecular Dynamics, AIMD)计算非常精确,但需要消耗大量时间和计算资源,能模拟的空间尺度和…