当前位置:首页 > 工业控制 > 电路设计项目集锦
[导读]如果你拥有Forgix和一台笔记本电脑,只需几分钟就能完成这个项目。笔记本电脑通过麦克风采集音频信号,RP2354将采样数据传输至Efinix Trion T8,而FPGA则在真实硬件上执行频谱分析,返回八个频率带的幅度值,并由笔记本实时绘制。此外,Forgix的RGB LED灯会变成一个微型音量单位(VU)表,低频以红色显示,中频以绿色显示,高频以蓝色显示。

在成功将FLIR Lepton运行到Forgix之后,我想要一个无需额外硬件即可演示的项目,展示我们如何为该板开发项目。

如果你拥有Forgix和一台笔记本电脑,只需几分钟就能完成这个项目。笔记本电脑通过麦克风采集音频信号,RP2354将采样数据传输至Efinix Trion T8,而FPGA则在真实硬件上执行频谱分析,返回八个频率带的幅度值,并由笔记本实时绘制。此外,Forgix的RGB LED灯会变成一个微型音量单位(VU)表,低频以红色显示,中频以绿色显示,高频以蓝色显示。

该项目的重点并非FPGA是唯一能计算八段频谱的方法。你的笔记本电脑甚至可以在微秒级时间内完成这一计算。关键在于,它在一个小型且可验证的设计中完整展示了Forgix的开发流程:一个具备自检模拟功能的VHDL处理引擎、RP2354与T8之间通过SPI进行的运行时数据传输、在官方Forgix加载协议基础上清晰叠加的固件,以及将所有组件整合在一起的主机应用程序。

这正是我为该板上的真实信号处理应用所设计的基础框架,而所有内容都已包含在代码仓库中:RTL设计、测试平台、固件、主机软件和构建脚本。

信号路径

每个帧的处理路径如下:

•笔记本电脑采集约32毫秒的单声道音频,并将其重采样至8,000采样/秒。

•系统应用汉宁窗(Hann window),将信号缩放到Q15精度,然后以一个经过CRC32保护的USB帧形式发送256个有符号的16位样本。

•RP2354通过Forgix三线SPI接口,将这512字节的数据转发给FPGA。

•Trion T8使用一次时间复用的硬件乘法器计算八个DFT频段。

•RP2354读取返回的20字节响应,其中包含八个16位幅度值、帧计数器和状态信息,并通过USB将结果传回。

•笔记本电脑将幅度转换为dBFS并更新条形显示,而FPGA则直接从相同的幅度驱动RGB LED。

•八个被分析的频段中心频率分别为62.5、125、250、500、1000、1500、2250和3000 Hz。

在8千采样率下采用256个采样帧时,这些频率对应DFT的第2、4、8、16、32、48、72和96个分量,从而实现了从严格线性分辨率变换中获得的音乐上实用且近似对数间隔的频谱分布。

DFT引擎:八个分量,一个乘法器

构建频谱分析仪最直观的方法是使用FFT,但FFT会计算全部128个可用分量,而我只需要其中八个。对于T8大小的设备,仅需几个嵌入式乘法器,更好的选择是直接进行DFT,并只在感兴趣的分量处计算,这本质上与Goertzel算法所依据的核心思想相同。

对于每个输入样本,引擎必须为八个分量分别计算一次余弦和正弦乘积,总共需要十六次乘法运算。在32 MHz的板载时钟频率下,样本之间有数百个周期可供利用,因此无需使用十六个或甚至两个乘法器。所有操作共享一个带符号的16×16位乘法器。

一个小型状态机将每个样本通过八个分组进行处理,每个分组花费六个状态:加载余弦系数、相乘、累加到实数总和中;加载正弦系数、相乘、累加到虚数总和中。单个样本的完整计算耗时48个时钟周期,远低于USB和SPI接口下样本到达的速率。

这些“twiddle因子”来自一个65条目、以Q15格式存储的四分之一波长正弦表。每个分组使用一个8位相位累加器,在每样本中按分组编号递增,而四分之一波长对称性将该表展开为完整的正弦和余弦函数:

每个分组的数据被累加到40位有符号寄存器中,这提供了远超最坏情况(256个全量乘积)的保护位。当第256个样本完成时,引擎会再次遍历所有分组以生成输出幅度。它不使用真正的平方和根值来计算,而是采用经典的无乘法近似方式 |实部| + |虚部|,在45度角时最大误差约为3 dB,这种误差在柱状图显示中几乎不可见。随后移除六个保护位,使全量程的汉宁窗调音信号接近0 dBFS,若任何数据溢出则达到全量程饱和。最后清除累加器和相位,递增帧计数器,并设置帧就绪标志。

引擎自身也会进行状态记录:当状态机仍处于忙碌状态时,若新样本到达,会触发一个溢出标志,该标志通过状态字返回并以警告形式在主机查看器中显示。实际上它通常不会被触发,但实时设计应能及时提示假设条件已失效,而非静默丢弃数据。

三线SPI传输

Forgix在RP2354与T8之间使用三线SPI链路,采用单条共享的SDIO数据线,而非独立的MOSI和MISO线路。FPGA端在此基础上实现了一种紧凑的命令协议:

•0x10后接512字节可输出256个小端序有符号PCM采样值。

•0x11用于读取20字节的频谱响应。

•0x9f用于读取一个字节的设计ID,即0xA8。

SPI从设备:通过三级移位寄存器将SCK、CS和SDIO同步至32 MHz时钟域;在上升沿采样数据;在下降沿改变数据。任何共享数据线协议中有趣的部分在于其响应机制。当FPGA接收到读取命令时,会接管SDIO总线,但必须忽略在开始递增发送位计数器之前终止命令字节的下降沿;一旦这个边沿处理错误,整个响应就会发生一位偏移。另一方面,RP2354在发送应答前先释放线路驱动。

对0x11命令的响应以设计ID和一个包含帧就绪标志与溢出标志的状态字开始,接着是16位帧计数器,然后按小端序排列的八个数值。重要的是,这些数值和状态信息会在命令字被解码的瞬间被“快照”到保持寄存器中,因此DFT引擎可以在先前结果仍在输出期间继续处理下一个帧,而读取设备则永远不会看到破损或部分更新的结果。

固件:一种协议,两种特性

RP2354的固件并未发明新的协议,而是扩展了官方Forgix USB加载器协议。其帧结构、CRC32保护、序列号以及HELLO、STATUS、START、DATA、END和ABORT命令,完全符合标准加载器规范。Spectrum桥接器添加了一个0x10命令,用于从笔记本电脑传输一个512字节的PCM帧,以及一个0x90响应,用于返回20字节的频谱数据。任何已支持Forgix加载器协议的设备均可驱动此固件。

相同的引脚还承担双重功能。在配置期间,固件通过硬件SPI0以8 MHz频率驱动T8,将比特流进行CRC验证,并监听CDONE信号。一旦FPGA启动,固件会取消SPI外设的初始化,并重新将相同引脚注册为GPIO,因为运行时链路采用三线协议,且在SDIO上存在交易方向的中间切换,而硬件SPI模块无法实现这一功能。运行时的数据传输采用位拼接方式,固件在报告成功前通过读取ID寄存器来确认设计处于活动状态。

这个ping值很重要。它将“已加载的比特流”转换为“我预期的设计实际上正在运行并作出响应”,这是一个更强有力的表述,能够立即检测到过时或错误的比特流,而不是等到后续出现神秘的垃圾数据才察觉。

主机软件

主机端是一个使用pySerial、sounddevice和Matplotlib的单个Python应用程序。启动时,程序会通过USB VID自动识别Forgix,通过加载器协议编程FPGA镜像,然后对设计进行ping,接着进入数据流循环:捕获数据、重采样至8千采样/秒、应用汉宁窗、发送数据、绘制图像。一个指数平滑平均值能充分平滑条形图,使其清晰可读而不显延迟;同时,状态栏会显示FPGA帧计数、每帧的USB往返时间,以及任何麦克风或FPGA溢出警告。

由于在硬件尚未正常工作前就要求读者授权麦克风权限并不合适,因此还提供了合成模式。运行可视化器时使用--source sweep参数,会通过完整的USB、SPI和FPGA路径,从62.5 Hz到3 kHz进行对数正弦扫频,你可以依次观察峰值在八个硬件频段中的变化。它无需任何音频硬件,即可验证链路中的每一个环节,并且是首次在全新配置下运行的程序。

结果

该构建在32 MHz的板载时钟频率下,使用3.27纳秒的正向设置余量,采用1,875个LUT4、1,180个触发器和一个嵌入式乘法器,运行于Trion T8芯片上。每个采样耗时48个引擎周期,即32 MHz时为1.5微秒,因此一帧的DFT结果在SPI字节最终到达后约一微秒内即可完成。实时显示以USB往返速率更新,屏幕上会显示往返时间,溢出标志保持为低电平,RGB LED脉冲与麦克风所听到的声音同步输出,这是一种令人惊喜且令人满意的方式,可验证音频确实由数百个触发器在微型FPGA上进行处理。

总结

该项目是Forgix工作流的微型版本:一个在进入硅片前已在仿真中验证过的自包含VHDL引擎,标准加载器之上叠加了运行时协议,引脚可在配置和运行时之间切换模式,以及一个主机应用程序,只需一条命令即可让整个系统投入使用。它所展示的技术——包括对稀缺乘法器的时间复用、四分之一波长系数的存储、防止读取冲突的快照寄存器,以及在信任链路之前进行设计ID握手——可直接扩展到该板上更复杂的信号处理任务,甚至更大规模的设备。

本文编译自hackster.io

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭