0. 初衷:从算法到硬件的认知演进
我的历程:算法 → RTL → 算法 & RTL。构建起这座桥,实现双向互译,直到达到'写算法时心中有电路,写 FPGA 时心中有算法'的境界。

阶段 1:算法的'原教旨主义'
早期与许多算法工程师一样,停留在 MATLAB/Python/C 语言的抽象层面。图像是 imread() 返回的完美矩阵,处理是调用 conv2() 或 cv2.GaussianBlur() 等函数。数据被视为静止、无限且免费的:内存不足就加 DIMM,算得慢就等待,边界处理依赖 padarray 或 cv2.BORDER_REFLECT 自动完成。
阶段 2:感知 FPGA RTL 实现的成就感与艺术
初识 FPGA 代码时充满困惑:为何要手动计算地址?为何不能直接用 for 循环遍历整图?always @(posedge clk) 究竟意味着什么?这种认知撕裂感源于懂算法的'数学语言',却不懂硬件的'电路语言'。
直到独立完成第一个 Line Buffer 并调通图像空间滤波算法,才顿悟:硬件不是在'实现'算法,而是在'演绎'数据流。在资源、带宽与 PPA(Power, Performance, Area)的约束下进行优化,能深刻感知 FPGA 实现的艺术。
阶段 3:建立'互译'能力 如今能在 MATLAB 与 Vivado 之间自由穿梭,核心在于建立了'中间表示'(Intermediate Representation):看到卷积,脑中浮现的是滑动窗口数据流图(Line Buffer → Shift Register → MAC 树);看到硬件流水线延迟(Latency),能立刻映射到算法的帧缓冲需求;编写 C 定点代码时,脑中同步运行 Verilog 波形与 MATLAB 浮点参考,确保各级误差可控。这种'双向翻译'能力是成为系统架构师(System Architect)的元技能。
1. 方法论:跨界翻译的核心
本课程聚焦方法论本身,旨在打通'算法思维'与'硬件思维'的转换通道。这是一门'跨界翻译'指南:将数学语言转化为电路语言,并用流水线思维反哺算法设计。
2. 核心工作流:三级跳验证
- MATLAB 浮点原型(验证算法正确性)
- 手动定点化 C 模型(验证数值精度与范围)
- 时序展开 Verilog/RTL(验证硬件可行性与资源消耗)
关键洞察:C 定点化不是过渡步骤,而是精度验证的黄金标准。MATLAB 算对而 C 算不对,必是定点化逻辑有误;C 算对而 RTL 算不对,必是时序或流水线设计有误。
3. 思维架构与核心机制
3.1 两种思维方式的碰撞
- 算法人员误区:'先计算完整图像的梯度,再做非极大值抑制。'
- FPGA 人员误区:'只需将公式中的乘加运算全部映射到 DSP48 即可。'
- 正确认知:
- 空间域:图像是数据流,而非静态矩阵(除 DDR 缓存场景外)。
- 时间域:每个时钟周期必须产出结果或满足目标吞吐率,不可依赖'迭代收敛'过程。
- 精度域:硬件中没有
float,只有wire [N:0]与$signed()的精度博弈。
- 对比实验:以 3×3 Sobel 为例。算法版使用卷积函数、边界补零、整帧计算;硬件版采用 Line Buffer + 滑动窗口、边界复制、像素级流水线。


