0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

通过vivado HLS设计一个FIR低通滤波器

FPGA设计论坛 来源:FPGA设计论坛 2026-01-20 16:19 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Vivado HLS是一款强大的高层次综合工具,可将C/C++代码转换为硬件描述语言(HDL),显著提升FPGA开发效率。

1. FIR参数确定

FIR滤波器的设计,首先要明确其技术指标,这些指标对滤波器的性能和资源占用起着关键作用。以一个低通滤波器为例,其具体参数如下:

滤波器阶数设定为15。

采样频率是100MHz。

通带截止频率为20MHz。

阻带起始频率为30MHz。

通带波纹要求在0.1dB以内。

阻带衰减需达到60dB。

2. FIR系数计算

可以借助Python等工具来计算滤波器系数。下面是用Python计算系数的代码:

importnumpyasnpfromscipyimportsignalimportmatplotlib.pyplotasplt# 滤波器参数order =15# 滤波器阶数fs =100e6# 采样频率 (Hz)f_pass =20e6# 通带截止频率 (Hz)f_stop =30e6# 阻带起始频率 (Hz)A_pass =0.1# 通带波纹 (dB)A_stop =60# 阻带衰减 (dB)# 归一化频率nyquist =0.5* fs wp = f_pass / nyquist ws = f_stop / nyquist# 计算FIR滤波器系数(使用 Parks-McClellan 算法)h = signal.remez(order +1, [0, wp, ws,1.0], [1,0], Hz=1.0)# 打印系数(量化为16位定点数)coeffs_q15 = [int(round(c *32767))forcinh]print("FIR系数 (Q15格式):")fori, cinenumerate(coeffs_q15):  print(f"h[{i}] ={c}, 即{c/32768:.10f}")# 绘制频率响应w, h_freq = signal.freqz(h) plt.figure() plt.plot(0.5*fs*w/np.pi,20*np.log10(np.abs(h_freq))) plt.title('FIR滤波器频率响应') plt.xlabel('频率 (Hz)') plt.ylabel('幅度 (dB)') plt.grid(True) plt.axvline(f_pass, color='green') # 通带截止频率plt.axvline(f_stop, color='red')  # 阻带起始频率plt.show()

3. C/C++代码实现

使用Vivado HLS特定的数据类型和指令:

#include"fir.h"voidfir(data_t*output,data_tinput){  // 定义FIR系数(Q15格式)constcoeff_th[NUM_TAPS] = {    -10,-22,-32,-37,-26,10,72,133,     171,171,133,72,10,-26,-37,-32,-22,-10  };    // 声明移位寄存器数组staticdata_tshift_reg[NUM_TAPS];    // pragma指令,优化循环展开#pragmaHLS ARRAY_PARTITION variable=shift_reg complete dim=1// 数据移位操作for(inti = NUM_TAPS -1; i >0; i--) {    #pragmaHLS UNROLL    shift_reg[i] = shift_reg[i-1];   }   shift_reg[0] = input;    // 执行乘法累加操作acc_tacc =0;  for(inti =0; i < NUM_TAPS; i++) {        #pragma HLS UNROLL         acc += shift_reg[i] * h[i];     }         // 输出结果     *output = acc >>15;// Q15格式转换}

定义头文件:

#ifndef_FIR_H_#define_FIR_H_#include"ap_fixed.h"// 定义数据类型typedefap_fixed<16, 1>data_t;  // 16位定点数,1位整数,15位小数typedefap_fixed<16, 1>coeff_t; // 系数类型typedefap_fixed<32, 17>acc_t;  // 累加器类型,防止溢出// 定义滤波器抽头数#defineNUM_TAPS 19// 函数原型voidfir(data_t*output,data_tinput);#endif

定义测试程序:

#include"fir.h"#include#include#include#definePI 3.14159265358979323846intmain(){  // 测试数据data_tinput[100];  data_toutput[100];    // 生成测试信号(混合了5MHz和40MHz的正弦波)for(inti =0; i < 100; i++) {        // 5MHz信号(应该通过)float sig1 = 0.5 * sin(2.0 * PI * 5e6 * i / 100e6);        // 40MHz信号(应该被衰减)float sig2 = 0.5 * sin(2.0 * PI * 40e6 * i / 100e6);        // 混合信号         input[i] = sig1 + sig2;     }         // 应用FIR滤波器for(int i = 0; i < 100; i++) {        fir(&output[i], input[i]);     }         // 输出结果到文件     FILE *fp_in = fopen("input_data.txt", "w");     FILE *fp_out = fopen("output_data.txt", "w");         for(int i = 0; i < 100; i++) {        fprintf(fp_in, "%f
", (float)input[i]);        fprintf(fp_out, "%f
", (float)output[i]);     }         fclose(fp_in);    fclose(fp_out);         printf("测试完成!数据已输出到input_data.txt和output_data.txt
");         // 简单验证(检查高频分量是否被衰减)float sum_input = 0, sum_output = 0;    for(int i = 80; i < 100; i++) {         sum_input += fabs((float)input[i]);         sum_output += fabs((float)output[i]);     }         if(sum_output < sum_input * 0.1) {        printf("验证通过:高频分量被有效衰减
");        return0;     } else {        printf("验证失败:高频分量衰减不足
");        return1;     } }

4. Vivado HLS项目创建与配置

4.1 在Vivado HLS中创建新项目并配置

1.打开Vivado HLS工具。

2.执行 "File > New Project" 命令来创建一个新的项目。

3.为项目命名,例如 "FIR_Filter",并选择合适的存储位置。

4.添加源文件,即前面编写的fir.c和fir.h。

5.添加测试平台文件tb_fir.c。

6.指定目标设备,比如xc7z020clg400-1。

7.配置解决方案,设置时钟周期(例如 10ns)和复位类型。

4.2在Vivado HLS中执行C仿真

1.点击 "Project > Run C Simulation"。

2.确保仿真顺利完成,并且控制台显示 "Verification successful"。

3.可以使用 gnuplot 或 MATLAB 对输出文件进行分析。

4.3执行C综合以将C代码转换为RTL

1.选择 "Solution > Run C Synthesis > Active Solution"。

2.综合完成后,查看报告,重点关注:

资源利用率(DSP、LUT、FF 等)。

延迟(Latency)和吞吐量(Interval)。

关键路径分析。

4.4进行RTL级仿真验证

1.选择 "Solution > Run C/RTL Co-simulation"。

2.选择仿真工具(如VCS、ModelSim等)。

3.等待仿真完成,检查结果是否与C仿真一致。

4.5导出IP

将设计导出为IP核供Vivado使用:

1.选择 "Solution > Export RTL"。

2.保持默认设置,点击 "OK"。

3.导出完成后,IP 核会出现在项目目录的exported_ip文件夹中。

4.6在Vivado中集成IP

6fb37c3e-f5b7-11f0-92de-92fbcf53809c.png

1.打开 Vivado,创建新工程或打开已有工程。

2.点击 "Settings > IP > Repository",添加HLS导出的IP路径。

3.在Block Design中添加FIR滤波器IP核。

4.完成系统集成(添加时钟、复位等)。

5.生成比特流并下载到FPGA进行硬件验证。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1664

    文章

    22571

    浏览量

    640747
  • 滤波器
    +关注

    关注

    162

    文章

    8497

    浏览量

    186605
  • 低通滤波器
    +关注

    关注

    15

    文章

    600

    浏览量

    49169
  • Vivado
    +关注

    关注

    19

    文章

    860

    浏览量

    71511

原文标题:通过vivado HLS设计一个FIR低通滤波器

文章出处:【微信号:gh_9d70b445f494,微信公众号:FPGA设计论坛】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    使用DDS生成三信号并在Vivado中实现低通滤波器

    本文使用 DDS 生成三信号,并在 Vivado 中实现低通滤波器低通滤波器将滤除相关信号。
    的头像 发表于 03-01 14:31 3076次阅读
    使用DDS生成三<b class='flag-5'>个</b>信号并在<b class='flag-5'>Vivado</b>中实现<b class='flag-5'>低通滤波器</b>

    Vivado 使用Simulink设计FIR滤波器

    。 使用vivado的System Generator可以在simulink下快速的通过matlab的强大设计功能设计滤波器。这里使用fdatool设计了
    发表于 04-17 17:29

    信号的谱分析、做一个FIR数字低通滤波器

    一个FIR数字低通滤波器,信号源是正弦信号加均匀白噪声,显示混叠信号和经过滤波后信号波形 以及频谱分析,
    发表于 05-10 00:05

    如何设计低通FIR滤波器

    设计实现低通FIR滤波器步设计和实现过滤器获得滤波器系数可调谐低通FIR滤波器高级设计选项:最
    发表于 08-23 10:00

    并行FIR滤波器Verilog设计

    的《数字滤波器的MATLAB与FPGA实现》。本设计将在Vivado环境下进行仿真。使用MATLAB设计2kHz采样,500Hz截止的15阶低通
    发表于 09-25 17:44

    基于DSP的FIR数字滤波器设计与实现

    分析了FIR数字滤波器的基本原理,在MATLAB环境下利用窗函数设计FIR低通滤波器,实现了FIR低通滤
    发表于 12-18 15:53 101次下载

    基于MATLAB及FPGA的FIR低通滤波器的设计

    充分利用有限冲击响应数字滤波器(Finite Impulse Response digital filter ,FIR)系数的对称特性,借助于MATLAB语言和现场可编程门阵列(FPGA)实现了种高效的
    发表于 08-05 14:23 83次下载
    基于MATLAB及FPGA的<b class='flag-5'>FIR</b><b class='flag-5'>低通滤波器</b>的设计

    HLS系列 – High Level Synthesis(HLS) 从最简单的fir滤波器开始2

    在这个系列的上篇文章“HighLevel Synthesis(HLS) 从最简单的fir滤波器
    发表于 02-08 05:10 836次阅读

    HLS系列 – High Level Synthesis(HLS) 从最简单的fir滤波器开始3

    在上章“High LevelSynthesis(HLS) 从最简单的fir滤波器开始2”中
    发表于 02-08 05:11 847次阅读
    <b class='flag-5'>HLS</b>系列 – High Level Synthesis(<b class='flag-5'>HLS</b>) 从<b class='flag-5'>一</b><b class='flag-5'>个</b>最简单的<b class='flag-5'>fir</b><b class='flag-5'>滤波器</b>开始3

    HLS系列 – High Level Synthesis(HLS) 从最简单的fir滤波器开始4

    在这个系列的前3篇文章“HighLevel Synthesis(HLS) 从最简单的fir滤波器开始1-3”中,我们从
    发表于 02-08 05:13 1665次阅读
    <b class='flag-5'>HLS</b>系列 – High Level Synthesis(<b class='flag-5'>HLS</b>) 从<b class='flag-5'>一</b><b class='flag-5'>个</b>最简单的<b class='flag-5'>fir</b><b class='flag-5'>滤波器</b>开始4

    HLS系列 – High LevelSynthesis(HLS) 从最简单的fir滤波器开始5

    在这个系列的前4篇文章“HighLevel Synthesis(HLS) 从最简单的fir滤波器开始1-4”中,我们从
    发表于 02-08 05:18 1082次阅读
    <b class='flag-5'>HLS</b>系列 – High LevelSynthesis(<b class='flag-5'>HLS</b>) 从<b class='flag-5'>一</b><b class='flag-5'>个</b>最简单的<b class='flag-5'>fir</b><b class='flag-5'>滤波器</b>开始5

    详解FIR滤波器和IIR滤波器的区别

    数字滤波器广泛应用于硬件电路设计,般分为FIR滤波器和IIR滤波器。那么FIR
    发表于 05-03 11:36 20次下载

    数字低通滤波器的设计

    本文主要介绍了数字低通滤波器的设计,数字滤波器有无限冲激响应(IIR)系统和有限冲激响应(FIR)系统两种。利用MATLAB设计IIR滤波器,设计过程简单、直接,大大缩减了设计开发的时
    发表于 01-14 15:16 2w次阅读
    数字<b class='flag-5'>低通滤波器</b>的设计

    Matlab低通滤波器设定与实践

    Matlab数字滤波器设计实践—FIR 1低通滤波器设定 在理想情况下,低通滤波器使信号中低于指定截止频率 ωc 的所有频率分量保持不变,并拒绝高于 ωc 的所有分量。由于实现理想
    的头像 发表于 08-16 11:10 1.7w次阅读
    Matlab<b class='flag-5'>低通滤波器</b>设定与实践

    如何使用HLS加速FPGA上的FIR滤波器

    电子发烧友网站提供《如何使用HLS加速FPGA上的FIR滤波器.zip》资料免费下载
    发表于 06-14 15:28 3次下载
    如何使用<b class='flag-5'>HLS</b>加速FPGA上的<b class='flag-5'>FIR</b><b class='flag-5'>滤波器</b>