0、初衷
我的历程:算法 -> RTL -> 算法&RTL
构建起这座桥,双向互译!直到 '写算法时心中有电路,写 FPGA 时心中有算法。'
阶段 1:我曾是算法的'原教旨主义者'。
最早期,我和许多算法工程师一样,活在 MATLAB/Python/C 语言的抽象象牙塔里。 对我来说,图像就是 imread() 返回的那个完美矩阵, 处理就是调用 conv2() 或 cv2.GaussianBlur() 等函数。 数据是静止的、无限的、免费的——内存不够就加条 DIMM, 算得慢就等几秒,边界处理? MATLAB 会帮我 padarray, Python 会帮我 cv2.BORDER_REFLECT。
阶段 2:感知算法 FPGA RTL 实现的成就感与艺术。
当我第一次看到 FPGA 代码时,我是困惑甚至抗拒的: 1)'什么?我要自己算地址?' 2)'为什么不能有 for 循环遍历整张图?' 3)'这个 always @(posedge clk) 是什么意思?我明明只是想做个滤波…'
我理解那种认知的撕裂感: 你明明知道算法在数学上是对的, 但面对硬件时,突然发现自己像个失语的翻译——你懂算法的'英语', 但完全不懂硬件的'法语',更不知道如何将一个翻译成另一个。
直到我逼着自己写完第一个 Line Buffer,调通第一个图像空间滤波算法, 我才突然顿悟: 硬件不是在'实现'算法,硬件是在'演绎'数据流。 深有成就感,然后在资源与带宽等 PPA(power/performance/area 的优化), 感知 FPGA 实现的艺术。
阶段 3:Translate:两种语言的'互译'能力
现在,我能在 MATLAB 和 Vivado 之间自由穿梭,不是因为我会两种语言, 而是因为我建立了一种'中间表示'(Intermediate Representation): 当我看到算法里的卷积, 我脑子里浮现的不是矩阵乘法, 而是滑动窗口的数据流图(Line Buffer 接 Shift Register 接 MAC 树); 当我看到硬件里的流水线延迟(Latency),我能立刻映射到算法里的帧缓冲需求; 当我写 C 定点化代码时,我脑子里同时在跑 Verilog 的波形和 MATLAB 的浮点参考, 确保每一级的误差都在预算内。 这种'双向翻译'能力,就是本课程要给你的元技能。
**最大的价值是培养


