AI可以不停的输出但是人的精力是有限的人要做的是有条件的限制AI的输出指示AI输出自己想要的内容。本文是多次修改条件AI生成。AI就是一个只管输出不负责的莽撞汉子。最终还是要看人的调教至少现在是这个阶段。我已经完成第一篇正在学习第二篇。前言本教程面向已掌握FPGA基础开发、熟悉AXI总线与DMA架构、希望入门FPGA AI加速的开发者。我们以已跑通的单通道3×3卷积 2×2最大池化工程为起点不追求极致性能优化先建立「CNN算法原理 ↔ PyTorch软件训练 ↔ FPGA硬件实现」的完整架构认知逐步补全CNN标准组件最终打通端到端全链路。教程全程遵循「最小增量迭代」原则每一步只修改少量代码完成后立刻与软件结果对齐验证确保每一步都可复现、可验证避免陷入“一改全错”的调试困境。目录第一篇 基础认知篇先建立CNN完整架构第1章 CNN全景链路与核心概念1.1 特征提取流水线CNN的整体工作逻辑1.2 核心名词速览卷积、权重、偏置、激活、池化、特征图1.3 三者对应关系CNN算法 ↔ PyTorch接口 ↔ FPGA硬件实现第二篇 基础实践篇补齐CNN最核心标准单元第2章 新增ReLU激活层——给网络加入非线性第3章 Padding填充控制特征图尺寸保留边缘信息第4章 Stride步长控制计算密度实现特征降采样第三篇 核心进阶篇从单通道到多通道对应真实CNN结构第5章 扩展多输出通道理解多卷积核与多特征图第6章 池化算子扩展最大池化与平均池化第7章 可配置算子设计通过寄存器切换不同卷积核第四篇 全链路闭环篇从单个算子到完整网络第8章 两级卷积级联体验多层特征提取第9章 端到端全流程PyTorch训练 → 权重导出 → FPGA推理第10章 全流程总结从算法到硬件的完整落地路径第一篇 基础认知篇先建立CNN完整架构第1章 CNN全景链路与核心概念1.1 特征提取流水线CNN的整体工作逻辑卷积神经网络CNN本质是一套分层特征提取流水线输入原始图像经过多层算子堆叠逐步提取从简单到复杂的特征边缘→纹理→形状→物体最终输出分类/检测结果。一条标准CNN的完整数据流向原始输入图像 → 卷积层(Conv) → 批归一化层(BN) → 激活层(ReLU) → 池化层(Pooling) ↓ 重复堆叠N次 ↓ 全连接层(FC) → 最终输出结果我们当前FPGA工程已实现的是这条链路里的最小核心单元单通道卷积 最大池化。所有大型CNN网络本质都是这个单元的多次堆叠 通道数扩展。1.2 核心名词速览名词核心功能关键参数特征图Feature Map每一层的输入/输出数据格式为「通道数C × 高度H × 宽度W」C、H、W卷积核Kernel/Filter也叫权重在特征图上滑动计算提取特定特征核大小如3×3、权重数值偏置Bias每个输出通道对应一个偏移值卷积计算完成后叠加单通道单数值填充Padding特征图边缘补0控制输出尺寸避免边缘信息丢失补0圈数步长Stride卷积核每次滑动的像素数步长越大输出越小滑动步长激活层Activation加入非线性变换让网络可以拟合复杂函数ReLU、Sigmoid等池化层Pooling降采样缩小特征图尺寸减少计算量保留核心特征最大池化、平均池化全连接层FC二维特征展平为一维映射到最终分类结果输入维度、输出类别数1.3 三者对应关系算法↔软件↔硬件核心逻辑PyTorch负责训练出权重参数FPGA负责加载权重、用硬件电路完成推理计算。CNN算法概念PyTorch对应接口FPGA硬件实现滑动卷积计算torch.nn.Conv2d()行缓存 3×3窗口生成 乘加树卷积权重conv.weight权重寄存器组 DSP乘法器卷积偏置conv.bias偏置寄存器 加法器ReLU激活torch.nn.ReLU()单路判断逻辑负数置0正数直通最大池化torch.nn.MaxPool2d()窗口寄存器 数值比较器特征图数据Tensor张量AXI-Stream高速数据流 片内缓存补充说明批归一化BN层在推理阶段一般会提前融合进卷积层的权重和偏置中不需要单独做硬件电路属于部署优化的常规操作。第二篇 基础实践篇补齐CNN最核心标准单元第2章 新增ReLU激活层算法原理ReLURectified Linear Unit是CNN的标配激活函数公式为ymax(0,x) y max(0, x)ymax(0,x)正数原样输出负数直接置0计算成本极低硬件实现开销极小作用给线性的卷积计算加入非线性让多层网络才有意义硬件实现单通道版本增量修改在卷积输出、池化输入之间增加一级ReLU处理逻辑修改量仅几行代码// 卷积计算结果先经过ReLU再进入后续池化 wire signed [15:0] conv_out; reg signed [15:0] relu_out; always (posedge clk or negedge rst_n) begin if(!rst_n) begin relu_out 16d0; end else begin // ReLU核心逻辑小于0则输出0否则直通 relu_out (conv_out $signed(16d0)) ? $signed(16d0) : conv_out; end endPyTorch验证对照importtorchimporttorch.nnasnn# 搭建和硬件完全对应的极简网络modelnn.Sequential(nn.Conv2d(in_channels1,out_channels1,kernel_size3,stride1,padding0),nn.ReLU(),nn.MaxPool2d(kernel_size2,stride2))# 写入和FPGA完全相同的恒等算子权重withtorch.no_grad():model[0].weight.fill_(0)model[0].weight[0,0,1,1]1.0# 中心位置权重为1model[0].bias.fill_(0)# 输入测试数据得到软件基准结果input_imgtorch.zeros(1,1,128,128)# 全零输入output_pytorchmodel(input_img)实践步骤在现有卷积模块中增加ReLU逻辑输出接入池化模块重新打包IP、升级实例、清空综合缓存、生成比特流运行测试程序对比FPGA输出与PyTorch输出验收标准全零输入下输出全为0随机输入下逐像素与PyTorch结果完全一致连续多帧传输无超时、无错位第3章 Padding填充控制特征图尺寸算法原理问题3×3卷积在特征图边缘滑动时边缘像素计算次数少输出尺寸会缩小128×128输入→126×126输出解决在特征图四周补0Padding让边缘像素也能参与完整计算控制输出尺寸常用padding1搭配3×3卷积可实现输出尺寸与输入完全一致输出尺寸计算公式输出尺寸输入尺寸−核大小2×PaddingStride1 输出尺寸 \frac{输入尺寸 - 核大小 2×Padding}{Stride} 1输出尺寸Stride输入尺寸−核大小2×Padding1硬件实现要点输入数据有效时判断像素坐标边缘位置补0行缓存读写逻辑配合调整确保窗口生成正确验收标准128×128输入 padding1 3×3卷积输出尺寸为128×128结果与PyTorchpadding1配置完全对齐第4章 Stride步长控制计算密度算法原理步长Stride卷积核每次滑动的像素数stride1逐像素滑动计算最密集输出尺寸变化小stride2隔一个像素计算一次输出尺寸减半计算量减为1/4作用降采样减少后续计算量扩大感受野硬件实现要点输出有效信号间隔输出每stride个输入周期产生一个有效输出行列计数器配合步长做跳变验收标准stride2时输出尺寸为输入的一半结果与PyTorchstride2配置完全对齐第三篇 核心进阶篇从单通道到多通道第5章 扩展多输出通道算法原理输出通道Output Channel一个卷积层包含多个卷积核每个卷积核提取一种特征输出一张特征图比如输出通道2就是同时用2个不同的卷积核计算输出2张特征图这是真实CNN网络的基础结构通道数逐层增加尺寸逐层减小硬件实现要点复制一套乘加计算单元共用同一套行缓存和窗口生成逻辑两套计算单元分别加载不同的权重和偏置输出按通道顺序拼接通过AXI-Stream串行输出调整TLAST计数适配总数据长度单帧字节数 × 通道数验收标准输出数据按通道0、通道1顺序排列两个通道的结果分别与PyTorch对应通道结果完全一致帧长度正确DMA接收无溢出、无超时第6章 池化算子扩展最大池化与平均池化算法原理最大池化取窗口内最大值保留最显著的特征最常用平均池化取窗口内平均值特征更平滑两种池化硬件实现逻辑不同对应不同的算法场景硬件实现要点增加1位控制寄存器通过软件配置选择池化模式平均池化需要增加加法器和移位器除以4等价于右移2位验收标准两种模式下结果分别与PyTorch的MaxPool2d、AvgPool2d对齐第7章 可配置算子设计算法原理卷积的功能完全由权重决定权重不同提取的特征就不同常见3×3算子恒等、Sobel边缘检测、高斯模糊、浮雕、锐化可配置设计权重通过寄存器写入不需要修改硬件代码实践内容依次配置不同的卷积核权重输入测试图像观察输出效果与OpenCV/PyTorch对应算子的结果做对比验收标准切换不同权重后输出效果符合算子预期数值结果与软件计算一致第四篇 全链路闭环篇从单个算子到完整网络第8章 两级卷积级联体验多层特征提取算法原理CNN的核心思想就是多层堆叠浅层提取低级特征边缘深层提取高级特征形状、物体两级卷积激活池化级联就是一个最简的浅层CNN网络硬件实现要点两套「卷积ReLU池化」IP通过AXI-Stream无缝级联前一级的m_axis输出直接连接后一级的s_axis输入两级分别配置各自的权重和偏置流控反压正常后一级暂停时前一级自动暂停数据不丢失验收标准端到端输出与PyTorch两层网络结果完全一致连续传输无丢数、无错位第9章 端到端全流程PyTorch训练 → 权重导出 → FPGA推理全流程步骤训练阶段用PyTorch搭建一个小型CNN网络比如2层卷积2层池化在MNIST数据集上训练手写数字分类参数导出训练完成后导出每一层的权重、偏置参数做定点量化8bit参数部署把量化后的权重、偏置通过AXI-Lite依次写入FPGA对应层的寄存器硬件推理输入手写数字图片FPGA完成端到端计算输出分类结果结果校验对比FPGA推理结果与PyTorch推理结果的准确率差异验收标准完整走通「训练→导出→部署→推理」全流程同一输入图片FPGA推理结果与PyTorch推理结果类别一致理解定点量化对精度的影响第10章 全流程总结完成以上所有章节后你将掌握完整的FPGA AI加速知识架构算法层理解CNN各核心算子的作用、参数、相互关系软件层掌握PyTorch搭建网络、训练、导出参数的基本流程硬件层掌握各算子的RTL实现、接口设计、模块级联方法系统层打通「参数配置→DMA数据搬运→硬件计算→结果回传」的软硬件协同全链路后续可以根据需求再深入性能优化更高并行度、脉动阵列、量化优化、带宽优化此时已有完整架构认知优化方向会非常清晰。后记本教程遵循「先建立整体框架再逐步填充细节」的学习思路避免一开始就陷入底层优化的细节中。每一章都有明确的算法原理、硬件修改、验证方法和验收标准可独立完成也可按顺序逐步推进。建议每完成一章都做一次记录和总结梳理清楚「这一步解决了什么问题、对应CNN里的什么概念、软硬件是怎么对应的」逐步构建起完整的知识体系。
从FPGA到AI:单通道卷积起步,打通CNN算法→PyTorch训练→硬件推理全链路教程
发布时间:2026/7/2 21:45:10
AI可以不停的输出但是人的精力是有限的人要做的是有条件的限制AI的输出指示AI输出自己想要的内容。本文是多次修改条件AI生成。AI就是一个只管输出不负责的莽撞汉子。最终还是要看人的调教至少现在是这个阶段。我已经完成第一篇正在学习第二篇。前言本教程面向已掌握FPGA基础开发、熟悉AXI总线与DMA架构、希望入门FPGA AI加速的开发者。我们以已跑通的单通道3×3卷积 2×2最大池化工程为起点不追求极致性能优化先建立「CNN算法原理 ↔ PyTorch软件训练 ↔ FPGA硬件实现」的完整架构认知逐步补全CNN标准组件最终打通端到端全链路。教程全程遵循「最小增量迭代」原则每一步只修改少量代码完成后立刻与软件结果对齐验证确保每一步都可复现、可验证避免陷入“一改全错”的调试困境。目录第一篇 基础认知篇先建立CNN完整架构第1章 CNN全景链路与核心概念1.1 特征提取流水线CNN的整体工作逻辑1.2 核心名词速览卷积、权重、偏置、激活、池化、特征图1.3 三者对应关系CNN算法 ↔ PyTorch接口 ↔ FPGA硬件实现第二篇 基础实践篇补齐CNN最核心标准单元第2章 新增ReLU激活层——给网络加入非线性第3章 Padding填充控制特征图尺寸保留边缘信息第4章 Stride步长控制计算密度实现特征降采样第三篇 核心进阶篇从单通道到多通道对应真实CNN结构第5章 扩展多输出通道理解多卷积核与多特征图第6章 池化算子扩展最大池化与平均池化第7章 可配置算子设计通过寄存器切换不同卷积核第四篇 全链路闭环篇从单个算子到完整网络第8章 两级卷积级联体验多层特征提取第9章 端到端全流程PyTorch训练 → 权重导出 → FPGA推理第10章 全流程总结从算法到硬件的完整落地路径第一篇 基础认知篇先建立CNN完整架构第1章 CNN全景链路与核心概念1.1 特征提取流水线CNN的整体工作逻辑卷积神经网络CNN本质是一套分层特征提取流水线输入原始图像经过多层算子堆叠逐步提取从简单到复杂的特征边缘→纹理→形状→物体最终输出分类/检测结果。一条标准CNN的完整数据流向原始输入图像 → 卷积层(Conv) → 批归一化层(BN) → 激活层(ReLU) → 池化层(Pooling) ↓ 重复堆叠N次 ↓ 全连接层(FC) → 最终输出结果我们当前FPGA工程已实现的是这条链路里的最小核心单元单通道卷积 最大池化。所有大型CNN网络本质都是这个单元的多次堆叠 通道数扩展。1.2 核心名词速览名词核心功能关键参数特征图Feature Map每一层的输入/输出数据格式为「通道数C × 高度H × 宽度W」C、H、W卷积核Kernel/Filter也叫权重在特征图上滑动计算提取特定特征核大小如3×3、权重数值偏置Bias每个输出通道对应一个偏移值卷积计算完成后叠加单通道单数值填充Padding特征图边缘补0控制输出尺寸避免边缘信息丢失补0圈数步长Stride卷积核每次滑动的像素数步长越大输出越小滑动步长激活层Activation加入非线性变换让网络可以拟合复杂函数ReLU、Sigmoid等池化层Pooling降采样缩小特征图尺寸减少计算量保留核心特征最大池化、平均池化全连接层FC二维特征展平为一维映射到最终分类结果输入维度、输出类别数1.3 三者对应关系算法↔软件↔硬件核心逻辑PyTorch负责训练出权重参数FPGA负责加载权重、用硬件电路完成推理计算。CNN算法概念PyTorch对应接口FPGA硬件实现滑动卷积计算torch.nn.Conv2d()行缓存 3×3窗口生成 乘加树卷积权重conv.weight权重寄存器组 DSP乘法器卷积偏置conv.bias偏置寄存器 加法器ReLU激活torch.nn.ReLU()单路判断逻辑负数置0正数直通最大池化torch.nn.MaxPool2d()窗口寄存器 数值比较器特征图数据Tensor张量AXI-Stream高速数据流 片内缓存补充说明批归一化BN层在推理阶段一般会提前融合进卷积层的权重和偏置中不需要单独做硬件电路属于部署优化的常规操作。第二篇 基础实践篇补齐CNN最核心标准单元第2章 新增ReLU激活层算法原理ReLURectified Linear Unit是CNN的标配激活函数公式为ymax(0,x) y max(0, x)ymax(0,x)正数原样输出负数直接置0计算成本极低硬件实现开销极小作用给线性的卷积计算加入非线性让多层网络才有意义硬件实现单通道版本增量修改在卷积输出、池化输入之间增加一级ReLU处理逻辑修改量仅几行代码// 卷积计算结果先经过ReLU再进入后续池化 wire signed [15:0] conv_out; reg signed [15:0] relu_out; always (posedge clk or negedge rst_n) begin if(!rst_n) begin relu_out 16d0; end else begin // ReLU核心逻辑小于0则输出0否则直通 relu_out (conv_out $signed(16d0)) ? $signed(16d0) : conv_out; end endPyTorch验证对照importtorchimporttorch.nnasnn# 搭建和硬件完全对应的极简网络modelnn.Sequential(nn.Conv2d(in_channels1,out_channels1,kernel_size3,stride1,padding0),nn.ReLU(),nn.MaxPool2d(kernel_size2,stride2))# 写入和FPGA完全相同的恒等算子权重withtorch.no_grad():model[0].weight.fill_(0)model[0].weight[0,0,1,1]1.0# 中心位置权重为1model[0].bias.fill_(0)# 输入测试数据得到软件基准结果input_imgtorch.zeros(1,1,128,128)# 全零输入output_pytorchmodel(input_img)实践步骤在现有卷积模块中增加ReLU逻辑输出接入池化模块重新打包IP、升级实例、清空综合缓存、生成比特流运行测试程序对比FPGA输出与PyTorch输出验收标准全零输入下输出全为0随机输入下逐像素与PyTorch结果完全一致连续多帧传输无超时、无错位第3章 Padding填充控制特征图尺寸算法原理问题3×3卷积在特征图边缘滑动时边缘像素计算次数少输出尺寸会缩小128×128输入→126×126输出解决在特征图四周补0Padding让边缘像素也能参与完整计算控制输出尺寸常用padding1搭配3×3卷积可实现输出尺寸与输入完全一致输出尺寸计算公式输出尺寸输入尺寸−核大小2×PaddingStride1 输出尺寸 \frac{输入尺寸 - 核大小 2×Padding}{Stride} 1输出尺寸Stride输入尺寸−核大小2×Padding1硬件实现要点输入数据有效时判断像素坐标边缘位置补0行缓存读写逻辑配合调整确保窗口生成正确验收标准128×128输入 padding1 3×3卷积输出尺寸为128×128结果与PyTorchpadding1配置完全对齐第4章 Stride步长控制计算密度算法原理步长Stride卷积核每次滑动的像素数stride1逐像素滑动计算最密集输出尺寸变化小stride2隔一个像素计算一次输出尺寸减半计算量减为1/4作用降采样减少后续计算量扩大感受野硬件实现要点输出有效信号间隔输出每stride个输入周期产生一个有效输出行列计数器配合步长做跳变验收标准stride2时输出尺寸为输入的一半结果与PyTorchstride2配置完全对齐第三篇 核心进阶篇从单通道到多通道第5章 扩展多输出通道算法原理输出通道Output Channel一个卷积层包含多个卷积核每个卷积核提取一种特征输出一张特征图比如输出通道2就是同时用2个不同的卷积核计算输出2张特征图这是真实CNN网络的基础结构通道数逐层增加尺寸逐层减小硬件实现要点复制一套乘加计算单元共用同一套行缓存和窗口生成逻辑两套计算单元分别加载不同的权重和偏置输出按通道顺序拼接通过AXI-Stream串行输出调整TLAST计数适配总数据长度单帧字节数 × 通道数验收标准输出数据按通道0、通道1顺序排列两个通道的结果分别与PyTorch对应通道结果完全一致帧长度正确DMA接收无溢出、无超时第6章 池化算子扩展最大池化与平均池化算法原理最大池化取窗口内最大值保留最显著的特征最常用平均池化取窗口内平均值特征更平滑两种池化硬件实现逻辑不同对应不同的算法场景硬件实现要点增加1位控制寄存器通过软件配置选择池化模式平均池化需要增加加法器和移位器除以4等价于右移2位验收标准两种模式下结果分别与PyTorch的MaxPool2d、AvgPool2d对齐第7章 可配置算子设计算法原理卷积的功能完全由权重决定权重不同提取的特征就不同常见3×3算子恒等、Sobel边缘检测、高斯模糊、浮雕、锐化可配置设计权重通过寄存器写入不需要修改硬件代码实践内容依次配置不同的卷积核权重输入测试图像观察输出效果与OpenCV/PyTorch对应算子的结果做对比验收标准切换不同权重后输出效果符合算子预期数值结果与软件计算一致第四篇 全链路闭环篇从单个算子到完整网络第8章 两级卷积级联体验多层特征提取算法原理CNN的核心思想就是多层堆叠浅层提取低级特征边缘深层提取高级特征形状、物体两级卷积激活池化级联就是一个最简的浅层CNN网络硬件实现要点两套「卷积ReLU池化」IP通过AXI-Stream无缝级联前一级的m_axis输出直接连接后一级的s_axis输入两级分别配置各自的权重和偏置流控反压正常后一级暂停时前一级自动暂停数据不丢失验收标准端到端输出与PyTorch两层网络结果完全一致连续传输无丢数、无错位第9章 端到端全流程PyTorch训练 → 权重导出 → FPGA推理全流程步骤训练阶段用PyTorch搭建一个小型CNN网络比如2层卷积2层池化在MNIST数据集上训练手写数字分类参数导出训练完成后导出每一层的权重、偏置参数做定点量化8bit参数部署把量化后的权重、偏置通过AXI-Lite依次写入FPGA对应层的寄存器硬件推理输入手写数字图片FPGA完成端到端计算输出分类结果结果校验对比FPGA推理结果与PyTorch推理结果的准确率差异验收标准完整走通「训练→导出→部署→推理」全流程同一输入图片FPGA推理结果与PyTorch推理结果类别一致理解定点量化对精度的影响第10章 全流程总结完成以上所有章节后你将掌握完整的FPGA AI加速知识架构算法层理解CNN各核心算子的作用、参数、相互关系软件层掌握PyTorch搭建网络、训练、导出参数的基本流程硬件层掌握各算子的RTL实现、接口设计、模块级联方法系统层打通「参数配置→DMA数据搬运→硬件计算→结果回传」的软硬件协同全链路后续可以根据需求再深入性能优化更高并行度、脉动阵列、量化优化、带宽优化此时已有完整架构认知优化方向会非常清晰。后记本教程遵循「先建立整体框架再逐步填充细节」的学习思路避免一开始就陷入底层优化的细节中。每一章都有明确的算法原理、硬件修改、验证方法和验收标准可独立完成也可按顺序逐步推进。建议每完成一章都做一次记录和总结梳理清楚「这一步解决了什么问题、对应CNN里的什么概念、软硬件是怎么对应的」逐步构建起完整的知识体系。