firpm函数+FPGA_FIR vivado_2022.2具体实操配置

关于仿真以及可能遇到的部分问题可以参考之前两篇博客

【FIR滤波器设计及其FPGA实现】

【FIR IP 核重析】

由于最近开始国赛,所以继续优化FIR滤波器设计以前遗留的问题,此篇博客主要解析

  • 更新后没有识别连接的 FPGA 设备
  • 更新 vivado 为 2022.2 ,FIR IP 核重构(重点修改)
  • FIR 输出直流 or 输出带较大直流偏置

识别FPGA设备 驱动(JTAG-HS2)

如果使用的是JTAG-HS2烧录工具出现vivado无法识别到FPGA设备,可以尝试安装驱动

https://digilent.com/reference/software/adept/start?redirect=1


2022.2 VIVADO FIR IP核配置

  • MATLAB - firpm采用优化后的版本生成FIR滤波器系数
  • 导入滤波器系数
  • 保持MATLAB设置采样速率与FIR IP核输入采样速率相等
  • 设置滤波器系数,输入信号为无符号(区别于仿真 ADDA为无符号);输出量修约规则选取全精度模式

FIR输出直流问题 or 输出带较大直流偏置解决

输出直流的问题基本可以归结为以下两个原因:

  • 原先采用Truncate LSBs模式,此处引入计算误差
  • 截位方式不对,这将导致没有截取到输出信号的最有效部分。

    参考官方FIR设计文档之后,最后采用全精度模式,自主截位并加入直流偏差的量化系数

1
2
3
4
5
6
7
8
ad9764_dac ad9764_dac_inst (
.clk (pll_out_clk_adc), // 输入时钟 一般由 PLL 产生 后续会被分频
.rst_n (rst_n),
.DAC_data (fir_out_data - 14'd1804), // 输入端 DAC 数据
//直流偏差值运算(量化系数:偏差.val/5 *8192) 注:负偏差应该减去此系数
.IO_data (DAC_IO_data), // 输出到 IO 上的数据
.clk_driver() // 用于驱动 DAC 模块的时钟
);

这边注意量化系数加入的位置以及如何计算此系数,这需要参考你使用DA的输出最大电压以及DAC位数。比如我跟hui是使用 14 位的DAC故这边是用 8192 进行比例运算。负偏置需要减去此系数是因为DAC的(0,8192)表示正数,(8192,16384)为负数

如果想要使用 vscode 联动vivado 开发FPGA可以康康🎈🎈

【Vivado × VS Code 配置过程小记】: https://hui-shao.cn/Vivado-%C3%97-VS-Code/?highlight=vs