FPGA万花筒之(十):基于FPGA的卷积神经网络实现之框架

姓名:张俸玺 学号:20012100022 学院:竹园三号书院

转自https://blog.csdn.net/qq_38798425/article/details/106723877

【嵌牛导读】FPGA,可编程门阵列,作为一种较为新型的技术,为大多数人所陌生。如今,用FPGA实现神经网络成为一种热门技术话题。本文对基于FPGA的卷积神经网络实现框架进行了简要叙述。

【嵌牛鼻子】FPGA 卷积神经网络

【嵌牛提问】基于FPGA的卷积神经网络实现的基本框架是什么?

【嵌牛正文】

github

首先设计整体框架,再根据整体结构去设计每一个子模块,通过例化子模块来形成完整的工程程序。也就是基于FPGA卷积神经网络实现里面的top.v文件。

本项目要实现的神经网络结构如下图所示:


对于在FPGA当中实现神经网络而言,每一种功能的层都单独设计一个子模块。而使用这些子模块搭建一个完整的网络框架主要有两种方法:

1.每一层都单独进行例化,占用单独的硬件资源。

2.同样功能的层复用同一部分硬件资源,通过parameter来进行区分

本项目为了初学者放心食用选择比较简单的第一种方式,当然前提是硬件资源足够多的,如果实现一个较大型的网络这样的方式是不可能的,还是需要使用第二种方法,不过偶从入门来说,第一种方法是非常容易理解的。

在最开始先要设置一个时钟模块,调用片上PLL,也就是clocking Wizard IP核。我使用的片上输入时钟为50M,输出时钟设置为两路,一路为原本的50M时钟,用于和系统时钟相关的地方(当然这个不一定会的上),另一路先随意设置为200M,在后面实际使用的时候再进行调整。


设置好后在top文件中进行例化

clock_pll clock_control

  (

    .CLK_IN1 (clk_in) ,

    .CLK_OUT1 (clk_50) ,

    .CLK_OUT2 (clk_200) ,

    .RESET (~rst_n) ,

    .LOCKED ()

);

那么这样一来我们就拥有一个快速的时钟,能够让我们的卷积神经网络飞速运行起来了。

下面我们需要一些子模块了,根据整个网络的结构,我们需要设计输入数据存储层、参数存储层、卷积层、池化层、全连接层,当然,还需要层间的缓存层。对于一个卷积层参数与输入数据需要同时进入,因此可以将参数存储层和层间输入缓存层合并为同一个模块。

以卷积层为例,先写出大概的框架,后面再慢慢填补。

module Layer1_Conv_Top#(

parameter filter_size=5

)

(

input clk_in,

input rst_n,

input data_in,

input weight_in,

output reg data_out

    );

    data_out <= data_in*weight_in;

endmodule

各个子模块创建完毕后,再去top文件里面例化一下并串联在一起,一个完整的框架就搞定了。

pic_in layer0(

.clk_in (clk_200) ,

.rst_n (rst_n) ,

.map (l1d1) ,

.ready (l1r1) ,

.weight (l1w1)

    );

Layer1_Conv_Top layer1_conv(

.clk_in (clk_200) ,

.rst_n (rst_n) ,

.data_in (l1d1) ,

.weights (l1w1) ,

.data_out (l1d2)

    );

Layer1_Pool_Top layer1_pool

(

.clk_in (clk_200) ,

.rst_n (rst_n) ,

.data_in (l1d2) ,

.data_out (l1d3)

    );

pool1_out_buffer layer1_pool_buffer(

.clk_in (clk_200) ,

.rst_n (rst_n) ,

.data_in (l1d3) ,

.data_out (l2d1) ,

.weight (l2w1)

    );

//layer2

Layer2_Conv_Top layer2_conv(

.clk_in (clk_200) ,

.rst_n (rst_n) ,

.data_in (l2d1) ,

.weights (l2w1) ,

.data_out (l2d2)

    );

Layer2_Pool_Top layer2_pool

(

.clk_in (clk_200) ,

.rst_n (rst_n) ,

.data_in (l2d2) ,

.data_out (l2d3)

    );

pool2_out_buffer layer2_pool_buffer(

.clk_in (clk_200) ,

.rst_n (rst_n) ,

.data_in (l2d3) ,

.data_out (l3d1) ,,

.weight (l3w1)

    );

//layer3

Layer3_Conv_Top layer3_conv(

.clk_in (clk_200) ,

.rst_n (rst_n) ,

.data_in (l3d1) ,

.weights (l3w1) ,

.data_out (l3d2)

    );

conv3_out_buffer layer3_conv_buffer

(

.clk_in (clk_200) ,

.rst_n (rst_n) ,

.data_in (l3d2) ,

.data_out (l3d3)

    );

Layer3_Pool_Top layer3_pool

(

.clk_in (clk_200) ,

.rst_n (rst_n) ,

.data_in (l3d3) ,

.data_out (l4d1)

    );

//full_connection

ful_conn  layer4_full_connect(

.clk_in (clk_200),

.rst_n (rst_n),

.data_in (l4d1),

.data_out (Dout)

    );

程序中用来连接各个子模块的wire类型数据的命名规则是

l(layer)+第几层+d(data)+第几个模块

到现在一个整体的网络框架应该是搭建完毕了。这里有个很值得注意的地方在于,为了编写简单,我将同样功能的模块都单独写了子模块,这样对于他们的不同就可以一个一个去处理。但是事实上,他们的整体思路是一样的,只需要改一些参数,也就是说通过设置许多的parameter也可以达到同样的目的。在所有的子模块介绍完后我将针对这一问题单独进行讲解。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354

推荐阅读更多精彩内容