【创作纪念】:从水声声呐、FPGA/ZYNQ到AI硬件的探索与沉淀

机缘

回首望去,我的码龄已经有 16 年了,但开始写博客只不过是近一年的事儿。在这段不算短的岁月里,我的技术足迹主要留在嵌入式系统、FPGA/ZYNQ 软硬件开发、水声声呐信号处理以及图像处理算法等底层硬核领域。

最初决定在 CSDN 上分享内容,初衷其实非常朴素:

  1. 实战项目中的经验沉淀:在日常面对复杂的软硬件协同设计、水声换能器设计或合成孔径声呐(SAS)调试时,经常会遇到各种棘手的工程瓶颈。这些实战中的避坑指南和架构方案,记录下来能有效防止日后重复犯错。
  2. 知识脉络的自我梳理:正如我写过的“保姆级教程”和“深入浅出”系列,编写这些文章不仅是为了与同行交流,更是为了逼迫自己把琐碎、庞杂的知识点(例如声学带宽与阻抗带宽的本质区别)梳理成严密的逻辑体系。
  3. 技术交流:嵌入式硬件与数字信号处理技术专业性极强,网上的实战资料相对零散。我希望通过文字,能和同行业者在算法优化与硬件加速领域共同探讨。

收获

在持续输出的过程中,创作给我带来了意料之外的反馈:

  1. 同行的关注:陆陆续续收获了 5000 多位读者的关注。在留言区里,遇到了不少同样在做水声信号处理、雷达声呐成像、FPGA 视频加速以及大模型辅助硬件设计的专业同仁。
  2. 正向的技术反馈:当看到“解决了困扰我好几天的设备树/UIO驱动问题”、“终于把换能器的电声转换理解透了”等评论,或是看到单篇文章收获了大家的收藏与讨论,这种技术上的共鸣与认同,远比单一的技术成果更让人欣慰。
  3. 自我知识体系的进化:在准备每篇文章时,查阅文献、核对公式、整理架构的过程,促使我的技术理解向更深层次拓展。

日常

  1. 创作与工作/学习的有机结合:对于我来说,创作绝不是无源之水。现在的创作更像是日常研发的“副产品”——它是我在项目中解决掉某一个技术难点、写完一个好用的测试脚本后,在静心思考时的系统总结。
  2. 时间精力上的平衡:在日常繁重的工作与研发压力下,精力确实有限。我通常不刻意追求高频更新,而是更倾向于“慢工出细活”。只有当自己在实战中积累了足够扎实的、能真正帮到别人的原创代码和设计思路时,才会动笔将其汇编成文。

成就

在过往的开发工作中,写过很多复杂的 Verilog 状态机、水声信号处理算法和 Linux 驱动。但在工程实战中,往往是一些能够化繁为简、提高整个团队开发效率的“小工具”最让人有成就感。

下面这段代码是我在进行 ZYNQ Linux 开发 时,为了摆脱繁琐的驱动编写、快速在内核用户态验证 PL 端 BRAM 与 AXI GPIO 逻辑功能而设计的 Shell 测试脚本。它利用 Linux 自带的 devmem 快速完成物理地址读写,极大提升了软硬件联调的效率:

#!/bin/sh
# -------------------------------------------------------------------------------
# 脚本名称: zynq_bram_gpio_test.sh
# 描述: 向BRAM写入12个32位配置数据,并通过AXI GPIO发送脉冲通知PL端
# 适用场景: ZYNQ/FPGA 软硬件协同开发初期的快速功能验证
# -------------------------------------------------------------------------------

BRAM_BASE=0x40000000
GPIO_BASE=0x41200000
DATA_COUNT=12

# 1. 检查root权限
if [ "$(id -u)" -ne 0 ]; then
    echo "错误:此脚本需要root权限运行(用于访问 /dev/mem)"
    echo "请使用: sudo $0"
    exit 1
fi

# 2. 检测devmem工具是否可用
if command -v devmem >/dev/null 2>&1; then
    echo "检测到devmem工具,准备进行物理内存写操作..."
else
    echo "错误:系统未找到devmem命令。"
    echo "请安装busybox或devmem2,或使用用户态C程序替代。"
    exit 1
fi

echo "开始向BRAM基地址 $BRAM_BASE 顺序写入 $DATA_COUNT 个32位测试数据..."

# 3. 循环写入BRAM数据
i=0
while [ $i -lt $DATA_COUNT ]; do
    # 计算当前32位字偏移地址 (i * 4)
    ADDR_OFFSET=$((i * 4))
    TARGET_ADDR=$(printf "0x%08X" $((BRAM_BASE + ADDR_OFFSET)))
    
    # 构造测试数据
    VAL=$((i + 100))
    VAL_HEX=$(printf "0x%08X" $VAL)
    
    # 执行写操作
    devmem $TARGET_ADDR 32 $VAL_HEX
    echo "Write BRAM: $TARGET_ADDR <- $VAL_HEX"
    
    i=$((i + 1))
done

# 4. 通过AXI GPIO产生触发脉冲,通知PL端数据就绪
echo "数据写入完毕,通过AXI GPIO产生触发脉冲..."

# 写入高电平
devmem $GPIO_BASE 32 0x00000001
usleep 1000 # 保持1ms的高电平脉冲

# 恢复低电平
devmem $GPIO_BASE 32 0x00000000

echo "GPIO 触发脉冲发送完成,PL端已通知。"

这段脚本虽然精简,但在需要反复烧录 PL、频繁修改配置参数的软硬件联调阶段,它帮我们免去了编写、编译复杂内核驱动的繁琐流程,让功能验证过程变得更加高效。


憧憬

  1. 职业与研发憧憬:未来的研发工作将继续深耕水声声呐系统开发、FPGA 异构计算与高速信号处理。面对当前 AI 大模型的爆发,我也在尝试探索引入 AI 工具辅助设计(如大模型辅助 Verilog 编写、硬件设计 AI 工具评估等),探索智能设计与传统硬件工程结合的契合点,寻找效率提升的新可能。
  2. 创作规划:继续保持理性且高质量的输出态度,逐步完善“ZYNQ学习”、“声呐信号处理”、“图像处理算法硬件加速”等专栏。希望写出更多能够讲透物理本质、紧贴工程一线、让新人能快速上手的技术文章。
Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐