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

837

被折叠的 条评论
为什么被折叠?



