0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于FPGA搭建神经网络的步骤解析

FPGA设计论坛 ? 来源:CSDN技术社区 ? 2025-06-03 15:51 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本文的目的是在一个神经网络已经通过python或者MATLAB训练好的神经网络模型,将训练好的模型的权重和偏置文件以TXT文件格式导出,然后通过python程序将txt文件转化为coe文件,(coe文件是为了将其写入rom,网络中的权重和偏置通过读取ROM即可,后续需要修改输入其他特征值,只需要修改input的rom里面的coe文件即可)。

设计思想

其中sigmoid函数是本次实验最大的难点,因为sigmoid函数的值是在0-1之间的小数,其值越大,说明该模型的输出是该结果的几率越大。但是verilog硬件描述语言,其计算结果只有0或1两种情况,所以要想直接通过verilog语言计算出sigmoid函数的值是比较复杂的,本次使用的方法为查找表法,通过外部其他语言计算出sigmoid函数的值,然后将其放入查找表,后续当需要使用sigmoid函数时,直接输出结果。但是这个需要不断地往里面加值,每更新一次输入,那么就往sigmoid模块里面的查找表添加上该输入的sigmoid值。

由于FPGA的计算是基于数字逻辑和二进制运算,小数计算只能通过 固定点数(即带有定点小数位的整数表示)来模拟某些浮点数计算。这需要使用额外的逻辑来实现浮点数的运算、舍入和特殊值处理。

但是本文选择一个简便的方法,选择将输入,权重 分别保留两位小数(可自己选择位数,保留越多精度越高,反之精度越低),然后分别将其乘以100,将数据全都变成带符号整数,然后将其进行乘加运算。将偏置保留4位小数并乘以10000,得到的结果除以10000然后进行sigmoid计算,后续无论添加多少层,都可以以此方法来进行计算。以下为搭建神经网络的步骤:

step1: 处理数据,将保存好的权重文件转化为coe文件,然后添加一个ROM,并将coe文件加载进ROM里面;

module input_rom_ctr(

input sys_clk,//50MHz时钟

input rst_n,//复位,低电平有效

input [5:0] data_deep,

output reg [31:0] rom_data_r, //ROM读出数据

output reg viald,

output reg [6:0] rom_addr_rr //ROM输入地址

);

reg [6:0] rom_addr;

//产生ROM地址读取数据

always @ (posedge sys_clk or negedge rst_n)

begin

if(!rst_n)begin

rom_addr <= 7'd0;

viald <= 1'b1;

end

else if(rom_addr_rr >= (data_deep -1'd1))begin

viald <= 1'b0;

end

else if(rom_addr >= (data_deep - 1'd1))begin

rom_addr <= 7'd0;

end

else begin

rom_addr <= rom_addr+1'b1;

viald <= viald;

end

end

reg [6:0]rom_addr_r;

always @(posedge sys_clk or negedge rst_n) begin

if(!rst_n)begin

rom_addr_r <= 7'd0;

rom_addr_rr <= 7'd0;

end

else begin

rom_addr_r <= rom_addr;

rom_addr_rr <= rom_addr_r;

end

end

wire [31:0] rom_data;

always @(posedge sys_clk or negedge rst_n)begin

if(!rst_n)begin

rom_data_r <= 32'd0;

end

else begin

rom_data_r <= #2 rom_data;

end

end

//实例化ROM

input_rom rom_ip_inst

(

.clka (sys_clk ), //inoput clka

.addra (rom_addr), //input [4:0] addra

.douta (rom_data) //output [7:0] douta

);

endmodule

step2:将ROM里的数据读取出来,如果数据较少就直接使用二维数组保存数据,较多的话可以添加一个RAM,然后通过调用RAM里面的变量搭建第一层神经网络(暂不添加sigmoid)。

input_rom_ctr input_rom( //取输入层的数据存入ram

.sys_clk (clk),//50MHz时钟

.rst_n (rst_n),//复位,低电平有效

.data_deep(5),

.rom_data_r (rom_data1), //ROM读出数据

.viald (en_wr1),

.rom_addr_rr (input_index)

);

always @(posedge clk)begin

if(en_wr1) begin

input_layer[input_index] <= rom_data1; ? //从rom里面读出数据,并将其写入ram/寄存器里面,后面的神经网络直接调用寄存器操作

end

else begin

input_data <= input_layer[input_index];//从ram里面读出来的数据,加载地址就得到相应的数据。

end

end

Step3:通过仿真得到第一层神经网络每个神经元的乘加结果,并加上偏置后,通过外部计算得到sigmoid值后将其添加到sigmoid模块的lut查找模块中,如此反复,最后就可以得到一个神经网络框架。(sigmoid函数的结果也要乘以100,作为下一层的输入),最后得到的输入层的每个神经元的结果就代表其识别结果的概率。

module sigmoid (

input wire signed [31:0] input_value, // 输入32位有符号整数

output reg signed [31:0] sigmoid_output // 输出32位有符号整数

);

always @(*) begin //可以看做是一个查找表,将上一层的输入进入sigmoid函数来进行查找值,然后将得到的值乘以100用于保留两位小数,精度要求高的就多乘一点

case (input_value)

-2673 : sigmoid_output = 43; //上一层输入3490,是原本输入乘以100,保留两位小数乘以权重乘以100,即改结果是原本结果的10000倍,所以进sigmoid函数的应该是0.349

17232 : sigmoid_output = 85; //建议以后有更多值后继续添加,查找表越丰满,后续能使用的输入就越多。

36380 : sigmoid_output = 97;

124358 : sigmoid_output = 100;

-47650 : sigmoid_output = 1;

-5781 : sigmoid_output = 36;

3657 : sigmoid_output = 59;

-23082 : sigmoid_output = 9;

///上面是第一层隐层的结果,下面是输出层的结果。

4816 : sigmoid_output = 62;

-3390 : sigmoid_output = 42;

20652 : sigmoid_output = 89;

-4386 : sigmoid_output = 39;

-2004 : sigmoid_output = 45;

-623 : sigmoid_output = 48;

default: sigmoid_output = 0;

endcase

end

endmodule

仿真结果

3b3124c8-3b88-11f0-b715-92fbcf53809c.png

最后的output_layer就是输出的最后结果。

来源:https://blog.csdn.net/qq_48434158/article/details/132426289

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1646

    文章

    22062

    浏览量

    619349
  • matlab
    +关注

    关注

    189

    文章

    3004

    浏览量

    234369
  • 神经网络
    +关注

    关注

    42

    文章

    4814

    浏览量

    103918
  • 函数
    +关注

    关注

    3

    文章

    4383

    浏览量

    65044
  • python
    +关注

    关注

    56

    文章

    4828

    浏览量

    87102

原文标题:基于FPGA的神经网络的预测过程的实现

文章出处:【微信号:gh_9d70b445f494,微信公众号:FPGA设计论坛】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    遗传算法 神经网络 解析

    关于遗传算法和神经网络
    发表于 05-19 10:22

    脉冲耦合神经网络FPGA上的实现谁会?

    脉冲耦合神经网络(PCNN)在FPGA上的实现,实现数据分类功能,有报酬。QQ470345140.
    发表于 08-25 09:57

    【PYNQ-Z2试用体验】基于PYNQ的神经网络自动驾驶小车 - 项目规划

    神经网络技术的第三次发展浪潮仍在继续,在其背后,高性能CPU、GPU和FPGA、ASIC以强大的算力为技术的应用落地提供了有力的支持。然而目前基于FPGA平台搭建
    发表于 03-02 23:10

    卷积神经网络如何使用

    卷积神经网络(CNN)究竟是什么,鉴于神经网络在工程上经历了曲折的历史,您为什么还会在意它呢? 对于这些非常中肯的问题,我们似乎可以给出相对简明的答案。
    发表于 07-17 07:21

    如何设计BP神经网络图像压缩算法?

    (Digital Signal Processor)相比,现场可编程门阵列(Field Programma-ble Gate Array,FPGA)在神经网络的实现上更具优势。DSP处理器在处理时采用指令顺序执行
    发表于 08-08 06:11

    解析深度学习:卷积神经网络原理与视觉实践

    解析深度学习:卷积神经网络原理与视觉实践
    发表于 06-14 22:21

    如何移植一个CNN神经网络FPGA中?

    训练一个神经网络并移植到Lattice FPGA上,通常需要开发人员既要懂软件又要懂数字电路设计,是个不容易的事。好在FPGA厂商为我们提供了许多工具和IP,我们可以在这些工具和IP的基础上做
    发表于 11-26 07:46

    基于FPGA神经网络的性能评估及局限性

    FPGA实现神经网络关键问题分析基于FPGA的ANN实现方法基于FPGA神经网络的性能评估及局限性
    发表于 04-30 06:58

    如何用ARM和FPGA搭建神经网络处理器通信方案?

    某人工神经网络FPGA处理器能够对数据进行运算处理,为了实现集数据通信、操作控制和数据处理于一体的便携式神经网络处理器,需要设计一种基于嵌入式ARM内核及现场可编程门阵列FPGA的主
    发表于 05-21 06:35

    基于光学芯片的神经网络训练解析,不看肯定后悔

    基于光学芯片的神经网络训练解析,不看肯定后悔
    发表于 06-21 06:33

    如何构建神经网络

    原文链接:http://tecdat.cn/?p=5725 神经网络是一种基于现有数据创建预测的计算系统。如何构建神经网络神经网络包括:输入层:根据现有数据获取输入的层隐藏层:使用反向传播优化输入变量权重的层,以提高模型的预测
    发表于 07-12 08:02

    图像预处理和改进神经网络推理的简要介绍

    为提升识别准确率,采用改进神经网络,通过Mnist数据集进行训练。整体处理过程分为两步:图像预处理和改进神经网络推理。图像预处理主要根据图像的特征,将数据处理成规范的格式,而改进神经网络推理主要用于输出结果。 整个过程分为两个
    发表于 12-23 08:07

    基于FPGA的RBF神经网络硬件实现

    基于FPGA的RBF神经网络硬件实现说明。
    发表于 04-28 11:24 ?27次下载

    基于FPGA神经网络硬件实现方法

    基于FPGA神经网络硬件实现方法说明。
    发表于 06-01 09:35 ?46次下载
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>神经网络</b>硬件实现方法

    卷积神经网络模型搭建

    卷积神经网络模型搭建 卷积神经网络模型是一种深度学习算法。它已经成为了计算机视觉和自然语言处理等各种领域的主流算法,具有很大的应用前景。本篇文章将详细介绍卷积神经网络模型的
    的头像 发表于 08-21 17:11 ?1309次阅读