跳转至

流程

HiLinux 和 FPGA 的数据交互

init 阶段

HiLinux FPGA
RW[0] 写 1 再写 0
重置所有信号 准备开始一帧的处理
RW[1] 写 0
RW[2] 写 xc yc
WriteMemory 首帧
320x240 写满之后开始处理
处理结束(写 Blkmem_ab)
R[0] 写 1
等待直到 R[0] 为 1

update 阶段

HiLinux FPGA
RW[0] 写 1 再写 0
重置所有信号 准备开始一帧的处理
RW[1] 写 1
WriteMemory 一帧
320x240 写满之后开始处理
处理结束(写 Blkmem_ab R[1] 写 xc yc)
R[0] 写 1
如果图片处理完毕 break
等待直到 R[0] 为 1
读 R[1] 得到 xc yc

FPGA 算法硬件实现

init

  • 【rx】传入 320x240 灰度 8 bit 的 frame
  • 【cropfft】使用 xc, yc 拿到尺寸为 w, h 的 f;f = f - 0.5;f = f · window;F = FFT(f)
  • \(A = K · F^*\)\(B = F · F^*\)

update

  • 【rx】传入 320x240 灰度 8 bit 的 frame
  • 计算偏移
    • 【cropfft】使用 xc, yc 拿到尺寸为 w, h 的 f;f = f - 0.5;f = f · window;F = FFT(f)
    • 【h】H = A / B(与 cropfft 并行)
    • 【g】G = F · H
    • 【ifftreal】g = real(IFFT(G))
    • 【argmax】找到 g 中最大值的坐标、得到两帧间的偏移量更新 xc, yc
  • 更新状态
    • 【cropfft】使用新的 xc, yc 拿到尺寸为 w, h 的 f;f = f - 0.5;f = f · window;F = FFT(f)
    • \(A = \eta\ (K · F^*) + (1 - \eta)\ A\)\(B = \eta\ (F · F^*) + (1 - \eta)\ B\)