Verilog搭建神经网络学习记录,Day4:单次卷积操作实现

文章介绍了卷积的基本概念,即图片元素与卷积核对应元素相乘后求和。在硬件实现部分,通过16位浮点乘法和加法的综合处理模块来实现卷积操作。提供的Verilog代码定义了一个名为convUnit的模块,用于执行卷积操作,使用ProcessingElement模块处理图像和滤波器的元素,并通过索引来控制输入信号的处理。

想深耕嵌入式?这个专辑值得收藏

MCU、FPGA、工控、传感器一站式学习,实战项目直接抄

1.卷积

单次卷积操作,就是简单地把图片与卷积核的对应位置的元素相乘,然后再求和。如下图所示
在这里插入图片描述
在本次实验中,我们采用列的形式存储图片和权重,如下图所示:
在这里插入图片描述

2.硬件实现

在Day3中,我们将16位浮点乘法和16位浮点加法拼接而成一个综合处理模块。该模块已经可以实现将输入的浮点数相乘并累加的过程。因此要实现卷积操作,我们需要在卷积单元中实例化综合处理模块,并将图片数据和权重数据分割成若干个图像元素和权重元素,输入到综合处理模块中及进行逐元素乘法和累加。
在这里插入图片描述

3.完整代码

// 定义Verilog模块名为"convUnit",使用Processing Element(PE)模块执行卷积操作
module convUnit(clk,reset,image,filter,result);

// 定义参数
parameter DATA_WIDTH = 16; // 输入数据宽度
parameter D = 1; // 滤波器深度
parameter F = 5; // 滤波器大小

// 定义输入输出端口
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; // 用于向PE模块发送图像和滤波器的一个元素
integer i; // 用于记录当前处理的图像和滤波器元素的索引

// 实例化PE模块
processingElement PE
	(
		.clk(clk),
		.reset(reset),
		.floatA(selectedInput1),
		.floatB(selectedInput2),
		.result(result)
	);

// 使用always块控制输入信号的处理
always @ (posedge clk, posedge reset) begin
	if (reset == 1'b1) begin // 如果复位信号为高电平,重置所有变量
		i = 0; // 初始化索引
		selectedInput1 = 0; // 将向PE模块发送的图像元素清零
		selectedInput2 = 0; // 将向PE模块发送的滤波器元素清零
	end else if (i > D*F*F-1) begin // 如果已经处理完所有的图像和滤波器元素,但还在等待其他块完成处理
		selectedInput1 = 0; // 将向PE模块发送的图像元素清零
		selectedInput2 = 0; // 将向PE模块发送的滤波器元素清零
	end else begin // 发送一个图像元素和一个滤波器元素给PE模块进行逐元素乘法和累加
		selectedInput1 = image[DATA_WIDTH*i+:DATA_WIDTH]; // 从图像信号中选取一个元素
		selectedInput2 = filter[DATA_WIDTH*i+:DATA_WIDTH]; // 从滤波器信号中选取一个元素
		i = i + 1; // 更新索引,处理下一个元素
	end
end

endmodule

想深耕嵌入式?这个专辑值得收藏

MCU、FPGA、工控、传感器一站式学习,实战项目直接抄

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值