循环卷积和周期卷积的关系_基于单口RAM读写的卷积电路(下)

这是迟到很久的卷积电路verilog设计的下篇。。。你看我还有机会吗。。。

上回我们给出系统的层次结构、卷积计算模块以及用于数据缓存的fifo模块,今天我们首先回顾一下上一次的关键内容。

5358e9812922cd088b6ffd393533ad31.png

系统结构回顾

RTL代码文件可以分为结构如下所示 

~|--top_conv_tb.v|--top_conv.v|   |--sram_input.v|   |--sram_weight.v|   |--sram_output.v    |--conv.v        |--weight_addr_gen.v        |--pixel_addr_gen.v        |--conv_calculation.v        |--conv_fifo.v        |--fifo_wr_control.v

其中top_conv.v为设计的顶层模块,其只有start,reset,clk三个输入端口以及一个输出端口finish,top_conv.v模块负责例化各子模块,完成conv.v, sram_input, sram_onput以及sram_weight之间的连接。 
sram_input, sram_onput以及sram_weight三个子模块用于存储输入和输出,直接例化所给代码。
conv模块是实验中需要主要设计的模块,共包含五个子模块,各个子模块的功能概述如下:

weight_addr_gen模块:用于在每个时钟周期产生当前单元计算卷积所需要的权重在sram中的地址;•pixel_addr_gen模块:用于在每个时钟周期产生当前单元计算卷积所需要的像素值在sram中的地址;•conv_calculation模块:利用得到的像素值和权重完成相乘、累加,并在当前窗口全部像素计算完成后,产生输出请求信号,并输出该窗口的卷积值;•conv_fifo模块:输入数据的sram和计算模块之间的缓冲模块,接受像素数据存储器sram_input和权重数据存储器及sram_weight的输出数据,并向conv_calculation模块输出缓存数据;•fifo_wr_control模块:这一模块较为简单,为一级寄存器,用于调整两个地址产生模块的读请求、读地址信号和写fifo之间的时序。

整合后的系统框图如下所示:

a4a82bab3ed1cd5828c82eabae47c235.png

下面就进入到今天的新内容,我们将介绍系统中最后一个稍微麻烦的地址产生模块以及给出最后的结果展示。

地址产生模块

对于权重的地址产生模块较为简单,只需要依次从0到8进行循环即可:

//generate output weight_addralways @(*) beginif (start) begin    case(weight_cnt)    4'd0:  weight_addr = 0;    4'd1:  weight_addr = 1;    4'd2:  weight_addr = 2;    4'd3:  weight_addr = 3;    4'd4:  weight_addr = 4;    4'd5:  weight_addr = 5;    4'd6:  weight_addr = 6;    4'd7:  weight_addr = 7;    4'd8:  weight_addr = 8;    default:weight_addr = `weight_addr_width'bx;    endcaseendelseweight_addr = 0;end

而对于像素的地址产生模块,要相应的复杂一些,这里分两步进行,首先产生每次计算时像素窗口第一个像素(左上角)的地址first_pixel,然后依次遍历窗口内的各个元素:

//generate the first position(top-left) in the conv windowalways @(posedge clk or negedge reset) beginif (!reset)     first_pixel <= `pixel_addr_width'b0;else if (start&&pixel_cnt==8) begin    case(first_pixel)    29,61,93,125,157,189,221,253,285,317,349,381,413,     445,477,509,541,573,605,637,669,701,733,765,797,    829,861,893,925:     first_pixel <= first_pixel+3;    default:first_pixel <= first_pixel+1;    endcaseendelse     first_pixel <= first_pixel;end//generate output pixel_addralways @(*) beginif (start) begin    case(pixel_cnt)    4'd0:  pixel_addr = first_pixel + 7'd0;    4'd1:  pixel_addr = first_pixel + 7'd1;    4'd2:  pixel_addr = first_pixel + 7'd2;    4'd3:  pixel_addr = first_pixel + 7'd32;    4'd4:  pixel_addr = first_pixel + 7'd33;    4'd5:  pixel_addr = first_pixel + 7'd34;    4'd6:  pixel_addr = first_pixel + 7'd64;    4'd7:  pixel_addr = first_pixel + 7'd65;    4'd8:  pixel_addr = first_pixel + 7'd66;    default:pixel_addr = `pixel_addr_width'bx;    endcaseendelsepixel_addr = 0;end

结果展示

1.波形仿真

我们首先进行波形仿真验证。运行vivado对我们的设计进行仿真验证,波形输出如下图所示:

e108fd683c8e5997cb6e4eb16aeae43d.png

38475c35880618bab340847486ebbec5.png

仿真的关键信号大致可以分为读sram,写fifo,读fifo,卷积计算以及输出这五组,从图中可以看出各个信号的时序满足我们的设计需求,在开始信号start拉高后,conv_calculation模块发出数据请求信号s_read_req,fifo即开始从sram中读取数据。在fifo为非empty的后一个周期,fifo_read信号有效,conv_calculation开始从fifo中读取数据,在开始计算后的第九个周期,计算模块产生当前单元的正确卷积结果并发出完成信号sum_done用于输出请求。
关于计算模块的仿真波形区域放大图,展示如下:

670fcedc3dc825d5bd5bf68d3da8adeb.png

通过sram_output.v中的以下语句,我们将卷积输出结果输出到文本文件"Write_Out_File .txt中。

Write_Out_File =$fopen("Write_Out_File .txt");$fdisplay(Write_Out_File,"%h",s_write_data_b);

Write_Out_File .txt文件共900行,对应于输出图片的900个像素点,安装实验要求,load_txt_to_pic.py将txt中的矩阵结果转化为输出图片并显示。作为参考,我们可以调用python中opencv库中的cv.filter2D函数进行卷积运算,结果如下所示:

a68d8a6f447c0061c3b5aa2eccb03827.png

可以看出经过conv.v卷积边缘提取后的结果仍能大致看出原有图片轮廓,但是与直接运用python中cv.filter2D相比,有些细节仍然有所丢失。这与我们实验中进行数据定点化处理以及cv.filter2D中卷积计算时的优化处理有关。另外,我们可以看出使用cv.filter2D后,图片的大小仍然保持不变,这是由于在cv.filter2D中进行了一定的填充插值处理。

2.计算资源消耗

计算延时:整个计算过程开始于start信号拉高的23ns,结束于finish信号拉高的89935ns,在一个时钟周期为10ns的前提下,完成计算共需要8995个时钟周期。•乘法器资源:实验中一共进行了900次乘法运算,但每9个时钟周期内只单独进行一次乘法运算,所以总共需要一个乘法器。•访存次数:访存需要的次数与参考设计中相同,即每次计算一个3*3卷积窗,从input ram和weight ram取数3*3次,并存output到output ram一次。共访问input ram 30*30*3*3次,访问weight ram 30*30*3*3次,访问output ram 900次。总共访问次数为17100次。

vivado综合后的资源使用情况如下:

cb2f048b64f84fd63047d521160b6177.png

优化方向

在前面的设计中,我们是按照卷积窗口的移动顺序每次从sram中依次取出数据,对于这样方法,计算一个卷积窗口需要9次访存,总共900个窗口需要900*9次访存,然而事实上,窗口中的9个weight的数据在计算始终保持不变,而计算相邻窗口时pixel的部分数据也可以重复利用(数据复用),因此我们可以通过减少访问模块外部的sram的次数来提高系统的运行速度。 
对于weight来说,如果我们将sram中的数据读取后存储在计算模块内的存储器中,事实上总共只需要一次读weight_sram的操作,从而可以大大减少访问weight时的访存次数。对于pixel来说,相邻的窗口的部分数据读到conv模块后可以进行复用,如下图所示,使用数据复用也可以减少pixel时的访存次数。

29da915dd12e6484284e2eb5056ca83e.png

另一种更加普遍的思路是将卷积计算转化为矩阵乘法计算(im2col),对于矩阵乘法运算有大量的优化算法,并可以进一步利用脉动阵列来实现计算的并行以及数据的重用(谷歌TPU的基本架构),或者使用加法器和多个并行乘法器组成的加法树完成计算的并行(寒武纪Diannao的基本架构)。这些优化方法由于时间原因,没有进一步在现有的卷积电路上加以实现,但我们会在后续的推文中给出使用HSL搭建的卷积电路,从中可以明显看出在使用了流水线以及循环展开unroll来获得226倍的加速比。

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

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

相关文章

浅析 PHP 中的 Generator

浅析 PHP 中的 Generator Miss Wang php开发案例 前天 何为 Generator 从 PHP 5.5 开始&#xff0c;PHP 加入了一个新的特性&#xff0c;那就是 Generator&#xff0c;中文译为生成器。生成器可以简单地用来实现对象的迭代&#xff0c;让我们先从官方的一个小例子说起。 xrange…

注意安全!XSS 和 XSRF

[Tips] 本文是从 jianshu 平台重新修改编辑后移植来的&#xff0c;比上一版本做了些修订。 最近在看一些关于网络安全的问题&#xff0c;当然许多是跟前端相关的&#xff0c;包括且不局限于xss和xsrf 了&#xff0c;那么小编就结合最近的学习实践谈一些粗浅的认识。&#xff08…

go分析和kegg分析_干货预警:3分钟搞定GO/KEGG功能富集分析(2)

在 3分钟了解GO/KEGG功能富集分析 一文中给大家讲解了GO和KEGG的基本概念和内涵,并且给大家介绍了DAVID这一神奇网站。今天我们就把GO/KEGG功能富集分析的详细教程按部就班地呈现给大家,有请小猎豹。 多图预警,轻点图片,查看高清大图 1 Step1: 打开DAVID官网:https://dav…

如何在本地开发环境调试微信 JS-SDK

以下篇幅将会描述不同前提下对应的调试策略&#xff0c;当然也有可能不是最优解&#xff0c;望斧正 →_→ 前言 何谓「安全域名限制」&#xff1f; 以微信 JS-SDK 的使用为例&#xff0c;每个公众号被限制最多可设置三个安全域名&#xff0c;且必须能被腾讯服务器所验证&#…

云南省农村信用社计算机岗位待遇如何,云南农村信用社薪资待遇如何?

在云南如果去存钱&#xff0c;相信大多数人都会把自己的小钱钱存在农村信用社而不是XX银行。在这一块风景秀丽&#xff0c;人美山美水美的地方&#xff0c;就金融行业来说云南农村信用社要是说自己差&#xff0c;那基本没有谁敢说自己做的好。所以在云南农信社这家企业里做一名…

小票上为啥指甲能划出印_指甲上出现竖纹,除遗传问题,或是身体在向你拉警报了,别忽视...

生活中常见女生给指甲抹上各种不同的颜色来让它变得美美的&#xff0c;指甲起着修饰人的形象的作用。而指甲的状况也能折射出身体的健康状态如何。每个人的指甲形态不一&#xff0c;有的润滑饱满&#xff0c;光滑平整&#xff0c;有月牙&#xff1b;有的坑坑洼洼&#xff0c;凸…

require.context

带表达式的 require 语句 如果你的 require参数含有表达式(expressions)&#xff0c;会创建一个上下文(context)&#xff0c;因为在编译时(compile time)并不清楚具体是哪一个模块被导入 require("./template/" name ".ejs");webpack 解析 require() 的…

使用JSF 2.2功能来开发可滚动,可延迟加载的Ajax数据表

这次&#xff0c;我想与您分享我最近从JSF 2.2功能中学到的知识。 为此&#xff0c;我决定创建一个简单的ajax&#xff0c;可滚动的延迟加载数据表。 请注意&#xff0c; 绝不这是相当大的库如Primefaces &#xff0c; RichFaces的或ICEFaces的 。 这只是为了告诉您我学到了什…

如何监视ps/查询的性能和使用

可以使用“查询管理”页面监视查询性能和使用情况。您可以获得的一些统计信息包括平均运行时、运行次数和上次运行日期。使用预定义的搜索&#xff0c;还可以选择要检查和报告的查询。查询管理还允许您取消当前在查询管理器和查询查看器中运行的查询&#xff0c;以及启用和禁用…

金融计算机怎么调成链式,FRM金融计算器使用方法

2020FRM考试计算器&#xff1a;想一想FRM一级考试基本上按计算器停不下来&#xff0c;我们就一定要买一个简单易操作的计算器&#xff0c;但是GARP对于FRM考生所使用的计算器是有规定的&#xff1a;所有参加FRM考试的考生必须使用GARP指定的计算器&#xff0c;如果考生在考试期…

参数调优为什么要采样_程序员精进之路:性能调优利器--火焰图

本文主要分享火焰图使用技巧&#xff0c;介绍 systemtap 的原理机制&#xff0c;如何使用火焰图快速定位性能问题原因&#xff0c;同时加深对 systemtap 的理解。让我们回想一下&#xff0c;曾经作为编程新手的我们是如何调优程序的&#xff1f;通常是在没有数据的情况下依靠主…

我是这么理解Vue中的响应式系统的

遇到知识&#xff0c;尤其是复杂的概念&#xff0c;我不能类比的话&#xff0c;我很难接收&#xff08;所以学习很差...&#xff09;。在看了大神染陌同学的Vue源码解析后&#xff0c;我想分享一下我所类比的Vue响应式系统&#xff0c;您得先看他的文章&#xff08;至少看他写的…

图的顺序存储(邻接矩阵存储)【摘录自严长生老师的网站】

图是表达多对多关系的一种数据结构&#xff0c;组成要素为顶点和连接顶点的边。 根据边有无方向可分为有向图和无向图 当边有权重时&#xff0c;升级为有向网和无向网 图在存储时&#xff0c;可采用邻接矩阵&#xff0c;比如下面的无向图&#xff08;A&#xff09;和&#xff0…

Neo4j:使隐式关系成为显式和双向关系

最近&#xff0c;我阅读了Michal Bachman关于 Neo4j中双向关系的文章 &#xff0c;他建议对于某些关系类型&#xff0c;我们对关系的方向不那么感兴趣&#xff0c;因此可以在查询时忽略它。 他使用以下示例显示了Neo Technology和GraphAware之间的合作关系&#xff1a; 两家公…

复旦大学计算机学院博士生王斌,复旦大学计算机科学技术学院博士生刘鹏飞荣获...

计算机科学技术学院发布时间:2017-01-04 小字体 中字体 大字体2016年12月22日,历时七个月选拔的2016年度百度奖学金获奖者揭晓,复旦大学计算机科学技术学院2014级博士生刘鹏飞以其在“自然语言处理与深度学习”上取得的突出成绩,从国内外近百所著名高校数百位竞争者中脱颖而出,…

Deno 兼容浏览器具体指的是什么?

Deno 里面有一句描述&#xff1a;"Aims to be browser compatible"&#xff0c;可以看到 Deno 的目标是兼容浏览器。那么这里的兼容浏览器到底如何是什么意思呢&#xff1f; 我简单谈谈我的理解吧。 首先这里的兼容性肯定不是 Deno 直接在浏览器端运行。因为 Deno …

判断按键值_「正点原子NANO STM32开发板资料连载」第十六章电容触摸按键实验...

1&#xff09;实验平台&#xff1a;ALIENTEK NANO STM32F411 V1开发板2&#xff09;摘自《正点原子STM32F4 开发指南&#xff08;HAL 库版》关注官方微信号公众号&#xff0c;获取更多资料&#xff1a;正点原子第十六章电容触摸按键实验上一章&#xff0c;我们介绍了 STM32F4 的…

将社交登录添加到Spring MVC Web应用程序:注册和登录

本教程的第一部分描述了如何配置Spring Social 1.1.0和Spring Security 3.2.0&#xff0c;但它留下了两个非常重要的问题尚未解答。 这些问题是&#xff1a; 用户如何创建新用户帐户&#xff1f; 用户如何登录&#xff1f; 现在该弄脏我们的手并回答这些问题了。 我们的示例…

实验五 编写、调试具有多个段的程序

&#xff08;1&#xff09;将下面的程序编译、连接&#xff0c;用Debug加载、跟踪&#xff0c;然后回答问题。 ①CPU执行程序&#xff0c;程序返回前&#xff0c;data段的数据为多少&#xff1f; 见下图d 0770:0000 000f结果。 ②CPU执行程序&#xff0c;程序返回前&#xff0c…

手机工商银行怎么转账_工商银行信用卡要哪些申请条件?想成功办理你需要了解这些!...

工商银行信用卡一直是卡友们热议的对象&#xff0c;也有不少卡友问过小白&#xff1a;工商银行信用卡怎么办理&#xff1f;要哪些条件&#xff1f;要等多长时间&#xff1f;那么今天小白就为大家详细的讲解一下工商银行信用卡申请的各种方法和技巧&#xff0c;希望对大家有帮助…