第一层卷积层实现
单通道卷积网络通常用于处理灰度图像或单通道特征数据。其核心操作是使用卷积核(Filter)在输入数据上进行滑动计算,提取局部特征。输入数据为单通道(如28×28的灰度图像),卷积核为5×5x6的矩阵。
代码讲解
module conv5x5_stream #(
parameter DATA_W = 16, // Q8.8
parameter IMG_W = 28, // 输入行宽
parameter OC_NUM = 6, // 输出通道数
parameter ACT_RELU = 1'b1,
parameter W_FILE = "conv1.weight.hex",
parameter B_FILE = "conv1.bias.hex"
)(
input wire clk,
input wire rst_n,
input wire signed [DATA_W-1:0] din,
input wire din_vld,
input wire [$clog2(OC_NUM)-1:0] oc_sel,
output reg signed [DATA_W-1:0] dout,
output reg dout_vld
);
输入:
din_vld
驱动下,1 拍 1 像素(Q8.8 定点);
输出:一次只算 一个输出通道,由外部把oc_sel
轮询 0-5。
—— 所以硬件规模≈“一个 5×5 Kernel”,与 OC 数无关,超省资源。
// ==========================================================
// 1. 参数 ROM
// ==========================================================
(* rom_style="block" *)
reg signed [DATA_W-1:0] w_rom [0:25*OC_NUM-1];
(* rom_style="block" *)
reg signed [DATA_W-1:0] bias_rom [0:OC_NUM-1];
initial begin
$readmemh(W_FILE, w_rom);
$readmemh(B_FILE, bias_rom);
end
-
(* rom_style="block" *)
提示综合器把这两个数组用 Block RAM 实现,而不是用 LUT。 $readmemh
在仿真 0 ns 或综合阶段把 ASCII-HEX 文件里的 16 bit 定点数写进这些 ROM;之后运行时只读不写。- 地址映射固定为
oc_sel*25 + k
(权重)和oc_sel
(偏置),因此权重文件行序必须是 “输出通道 → 25 个核系数”。
核心思想代码
// ===================