手把手教你用FPGA设计一个FIR数字滤波器

原创 电子工程世界 2025-01-03 08:01
要求

设计一个带通滤波器,并验证其功能。


1、使用MATLAB设计滤波器系数



MATLAB首页找到APP后找到滤波器设计工具并打开,使用该工具可以生成数字滤波器的系数后续用于FPGA配置FIR IP核。
打开滤波器设计工具后即可输入相关参数并设计需要的滤波器,本次设计一个带通滤波器,所以滤波器响应类型选择带通;设计方案选择FIR(有限冲激响应);滤波器阶数这里选择最小阶,也可以自己指定阶数,阶数越大滤波器的滤波效果越好但越耗费FPGA资源,阶数可以根据实际情况进行取舍;密度因子默认20;频率设定,本次设计的采样率设置为10MHz,滤波器的频率特性设置可以按照图示进行填写,图片指示的意义很清楚,Fstop1为下限阻带截止频率,这里设置为50kHz,Fpass1为下限通带截止频率,这里设置为100kHz,Fpass2为上限通道截止频率,这里设置为400kHz,Fstop2为上限阻带截止频率,这里设置为450kHz(Fpass1-Fstop1和Fstop2-Fpass2为过渡带宽度,本次设计的过渡带宽度为50kHz;Fpass2-Fpass1为通带宽度,本次设计的通带宽度为400kHz;其余为阻带);幅值设定,其中Astop为阻带衰减的幅度值,本次设计阻带衰减50dB,Apass为通带的纹波,这里限制通带纹波不超过0.1dB。
设置好以上参数后点击滤波器设计,等待片刻即可设计好所需滤波器,从左侧窗口当前滤波器信息中可以发现符合本次设计需求的最小阶数为483阶。
点击工具栏:
可以查看滤波器幅值响应、相位响应、零极点等。
点击工具栏文件--导出,即可导出设计的滤波器系数。导出后可以在工作区中看到滤波器系数的变量Num。
以下为本次导出的系数,一共484个。
滤波器系数在FPGA中导入时每个系数之间需要逗号隔开,所以这里将系数保存到txt并使用逗号隔开,注意最后一个数的逗号需要删除。
生成后的系数删除最后的逗号。


2、FPGA中FIR的实现



这里省略FPGA工程建立过程,新建工程后点击Create Block Design。
添加FIR IP核。
配置FIR IP核,Filter Option中Select Source选择Vector,Coefficient Vector中粘贴之前MATLAB生成的系数,其余保持默认。左边Freq.Response窗口中可以查看频率响应曲线。
Channel Specification中主要配置采样率和工作时钟,input Sampling Frequency(MHz)配置10MHz采样率,后续DDS工作时钟需要和采样率保持一致;Clock Frequency(MHz)配置200MHz后续FIR IP核的工作时钟给200MHz。
Implement配置,Coefficient With可以根据需要进行配置,本次设计时配置成24,配置成24时通过查看左边Freq.Response窗口可以发现两条红色和蓝色曲线重合较接近理想曲线Ideal,所以这里配置成24,也可以根据需要进行配置。
Interface这里配置如下:
FIR配置完后再增加一个fifo,配置如下:
配置完后将FIR和fifo相连并引出接口:
最后右击block design先generate Output ...再Create HDL...。


3、FPGA中DDS的实现



这里DDS用于产生FIR的输入信号。同样点击Create Block Design,添加DDS IP核。


Configuration配置System Clock(MHz)为10MHz即可,其余保持默认配置。
Detailed Implementation配置如下:
最后输出频率配置成0.15MHz即150kHz,也可以根据需要进行配置。
按照上述配置再生成50kHz、350kHz、450kHz频率的DDS。
生成完DDS后再生成一个fifo。该fifo用于跨时钟域,将DDS产生的10MHz时钟域的信号转到200MHz时钟域输入FIR进行滤波。fifo配置如下,深度16,数据位宽16bit。
最后将生成的IP核按下图连线,该dds用于测试fir滤波器。可以外部可以将DDS生成的350kHz和150kHz进行叠加后再输入到fifo中,最后经过跨时钟域后从Multi_wave_M_AXIS输出到FIR进行滤波,叠加后的波形存在和频(500kHz)、差频(200kHz),经过滤波器后只剩下差频200kHz,如果滤波器输出200kHz正弦波则说明设计符合预期。也可以将单频信号(50kHz/150kHz/350kHz/450kHz)输入滤波器查看滤波器输出幅度情况。


4、top模块编写



顶层模块例化两个block_design ,dds产生50kHz、150kHz、350kHz和450kHz的正弦信号,外部将dds生成的其中两个信号做乘法后输入到dds的fifo接口中,使相乘的信号从10Mhz时钟域到200Mhz时钟域,最后输入到FIR中进行滤波。如果需要测试FIR单频信号的滤波器则可以将DDS输出的其中一个信号与常数相乘后再输入到FIR中进行测试。另外top模块中还需例化一个pll产生10MHz时钟用于DDS产生信号,以及200MHz时钟用于FIR。

  • module fir_top(

  • input pl_ref_clk_100m_p,

  • input pl_ref_clk_100m_n

  • );

  • reg [4:0] cnt;

  • wire clk_10m,clk_200m;

  • wire signed [7:0] M_AXIS_50k_tdata;

  • wire M_AXIS_50k_tvalid,M_AXIS_50k_tready;

  • wire signed [7:0] M_AXIS_150k_tdata;

  • wire M_AXIS_150k_tvalid,M_AXIS_150k_tready;

  • wire signed [7:0] M_AXIS_350k_tdata;

  • wire M_AXIS_350k_tvalid,M_AXIS_350k_tready;

  • wire signed [7:0] M_AXIS_450k_tdata;

  • wire M_AXIS_450k_tvalid,M_AXIS_450k_tready;

  • wire signed [15:0] Multi_wave_S_AXIS_tdata;

  • wire Multi_wave_S_AXIS_tvalid,Multi_wave_S_AXIS_tready;

  • wire signed [15:0] Multi_wave_M_AXIS_tdata;

  • wire Multi_wave_M_AXIS_tvalid,Multi_wave_M_AXIS_tready;

  • wire signed [15:0] FIR_S_AXIS_tdata;

  • wire FIR_S_AXIS_tvalid,FIR_S_AXIS_tready;

  • wire signed [23:0] FIR_M_AXIS_tdata;

  • wire FIR_M_AXIS_tvalid,FIR_M_AXIS_tready;

  • assign rst_n = locked;

  • // Multi_wave_S_AXIS

  • assign Multi_wave_S_AXIS_tdata = M_AXIS_450k_tdata * 8'hff/*M_AXIS_350k_tdata */;

  • assign Multi_wave_S_AXIS_tvalid = M_AXIS_450k_tvalid & 1/*M_AXIS_350k_tvalid */;

  • assign M_AXIS_50k_tready = Multi_wave_S_AXIS_tready;

  • assign M_AXIS_150k_tready = Multi_wave_S_AXIS_tready;

  • assign M_AXIS_350k_tready = Multi_wave_S_AXIS_tready;

  • assign M_AXIS_450k_tready = Multi_wave_S_AXIS_tready;

  • // Multi_wave_M_AXIS

  • assign FIR_S_AXIS_tvalid = Multi_wave_M_AXIS_tvalid;

  • assign FIR_S_AXIS_tdata = Multi_wave_M_AXIS_tdata;

  • assign Multi_wave_M_AXIS_tready = FIR_S_AXIS_tready;


  • assign FIR_M_AXIS_tready = (cnt == 'd19) && Multi_wave_M_AXIS_tvalid;

  • dds_design_wrapper dds_design(

  • .M_AXIS_150k_tdata (M_AXIS_150k_tdata ),

  • .M_AXIS_150k_tready (M_AXIS_150k_tready ),

  • .M_AXIS_150k_tvalid (M_AXIS_150k_tvalid ),

  • .M_AXIS_350k_tdata (M_AXIS_350k_tdata ),

  • .M_AXIS_350k_tready (M_AXIS_350k_tready ),

  • .M_AXIS_350k_tvalid (M_AXIS_350k_tvalid ),

  • .M_AXIS_450k_tdata (M_AXIS_450k_tdata ),

  • .M_AXIS_450k_tready (M_AXIS_450k_tready ),

  • .M_AXIS_450k_tvalid (M_AXIS_450k_tvalid ),

  • .M_AXIS_50k_tdata (M_AXIS_50k_tdata ),

  • .M_AXIS_50k_tready (M_AXIS_50k_tready ),

  • .M_AXIS_50k_tvalid (M_AXIS_50k_tvalid ),

  • .Multi_wave_M_AXIS_tdata (Multi_wave_M_AXIS_tdata ),

  • .Multi_wave_M_AXIS_tready(Multi_wave_M_AXIS_tready),

  • .Multi_wave_M_AXIS_tvalid(Multi_wave_M_AXIS_tvalid),

  • .Multi_wave_S_AXIS_tdata (Multi_wave_S_AXIS_tdata ),

  • .Multi_wave_S_AXIS_tready(Multi_wave_S_AXIS_tready),

  • .Multi_wave_S_AXIS_tvalid(Multi_wave_S_AXIS_tvalid),

  • .aresetn (rst_n ),

  • .clk_10m (clk_10m ),

  • .clk_200m (clk_200m )

  • );

  • always@(posedge clk_200m or negedge rst_n)begin

  • if(!rst_n)begin

  • cnt <= 'd0;

  • end

  • else begin

  • cnt <= (cnt == 'd19)? 'd0 : (cnt + 1'b1);

  • end

  • end

  • bandpass_fir_wrapper bandpass_fir(

  • .FIR_M_AXIS_tdata (FIR_M_AXIS_tdata ),

  • .FIR_M_AXIS_tready (FIR_M_AXIS_tready ),

  • .FIR_M_AXIS_tvalid (FIR_M_AXIS_tvalid ),

  • .FIR_S_AXIS_tdata (FIR_S_AXIS_tdata ),

  • .FIR_S_AXIS_tready (FIR_S_AXIS_tready ),

  • .FIR_S_AXIS_tvalid (FIR_S_AXIS_tvalid ),

  • .aresetn (rst_n ),

  • .clk_200m (clk_200m )

  • );

  • clk_wiz_0 pll(

  • .clk_10m(clk_10m),

  • .clk_200m(clk_200m), // output clk_200m

  • .reset(1'b0), // input reset

  • .locked(locked), // output locked

  • .clk_100m_in(clk_100m) // input clk_100m_in

  • );

  • IBUFDS clk_100m_ibufds(

  • .O (clk_100m),

  • .I (pl_ref_clk_100m_p),

  • .IB (pl_ref_clk_100m_n)

  • );

  • endmodule




5、功能仿真



DDS产生的四个信号如下:
50kHz信号,一个时钟周期的时间为102.31-82.31=20us,刚好为50kHz。
150kHz,一个时钟周期的时间为82.51-75.91=6.6us,频率约为151515Hz。
350kHz,一个是时钟周期的时间为71.21-68.31=2.9us,频率约为344827Hz。
450kHz,一个时钟周期的时间为91.51-89.31=2.2us,频率约为454545Hz。
将150kHz正弦和350kHz正弦叠加后输入到FIR,输入信号代码修改如下(配图中的频率写错了,实际是150kHz和350kHz相叠加,图片的是450kHz和350kHz,图片上的组合也不影响测试FIR,因为两个信号的和频以及差频为800kHz和100kHz,经过滤波器后100kHz信号正常输出而800kHz信号则被滤除):
两个光标之间的间隔为112.975-102.975=10us,每个时钟周期为5us,所以滤波器输出的频率为200kHz。由于输入的信号为150kHz正弦波叠加350kHz的正弦波,叠加后的波形存在和频500kHz和差频200kHz,由于500kHz在滤波器通频带外,所以500kHz的信号会被滤除,经过滤波器后只剩下200kHz的正弦波。所以仿真结果符合滤波器特性。仿真波形如下图,其中FIR_M_AXIS_tdata信号为FIR滤波输出信号。
将50kHz正弦信号输入FIR,输入信号代码修改如下:50kHz信号与常数8‘hff叠加后输入到FIR。
由于50kHz在滤波器带外,所以经过滤波器后幅度应该被衰减。仿真波形如下图,FIR输出信号FIR_M_AXIS_tdata被衰减,符合预期。
将150kHz正弦信号输入FIR,输入信号代码修改如下:150kHz信号与常数8‘hff叠加后输入到FIR。
由于150kHz在滤波器带内,所以经过滤波器后幅度不变。仿真波形如下图,FIR输出信号FIR_M_AXIS_tdata幅度正常,符合预期。
将350kHz正弦信号输入FIR,输入信号代码修改如下:350kHz信号与常数8‘hff叠加后输入到FIR。
由于350kHz在滤波器带内,所以经过滤波器后幅度不变。仿真波形如下图,FIR输出信号FIR_M_AXIS_tdata幅度正常,符合预期。
将450kHz正弦信号输入FIR,输入信号代码修改如下:450kHz信号与常数8‘hff叠加后输入到FIR。
由于450kHz在滤波器带外,所以经过滤波器后幅度应该被衰减。仿真波形如下图,FIR输出信号FIR_M_AXIS_tdata被衰减,符合预期。


6、结论


从仿真结果可知输入信号不管是单频信号还是叠加后的双频信号,结果都符合预期。相关工程源码请点击阅读原文,在原贴中下载。


· END ·


欢迎将我们设为“星标”,这样才能第一时间收到推送消息。

关注下方“汽车开发圈”回复“Auto”,免费领取Autosar入门与实践资料包!


扫码添加小助手回复“进群”

和电子工程师们面对面交流经验

电子工程世界 关注EEWORLD电子工程世界,即时参与讨论电子工程世界最火话题,抢先知晓电子工程业界资讯。
评论 (0)
  • 一、引言:健康管理数字化浪潮下的血压监测转型在慢性病高发与老龄化加剧的双重压力下,家庭健康监测设备正从“被动测量工具”向“主动健康管家”演进。传统血压计虽能提供基础数值,却无法解决用户的核心痛点:数据如何解读?异常如何干预?风险如何预防?WT2605C芯片方案的诞生,通过“AI对话+云端互联+个性化服务”三重技术突破,重新定义了血压计的价值边界——它不仅是一台测量仪器,更是一个全天候在线的健康管理生态系统。二、传统血压计的局限与用户需求升级1. 功能单一性困境数据孤岛:仅显示收缩压/舒张压数值,
    广州唯创电子 2025-04-16 08:55 52浏览
  • 展会名称:2025成都国际工业博览会(简称:成都工博会)展会日期:4月23 -25日展会地址:西部国际博览城展位号:15H-E010科士威传动将展示智能制造较新技术及全套解决方案。 2025年4月23-25日,中国西部国际博览城将迎来一场工业领域的年度盛会——2025成都国际工业博览会。这场以“创链新工业,共碳新未来”为主题的展会上,来自全球的600+ 家参展企业将齐聚一堂,共同展示智能制造产业链中的关键产品及解决方案,助力制造业向数字化、网络化、智能化转型。科士威传动将受邀参展。&n
    科士威传动 2025-04-14 17:55 90浏览
  • 二、芯片的设计1、芯片设计的基本流程 (1)需求定义: 明确芯片功能(如处理器、存储、通信)、性能指标(速度、功耗、面积)及目标应用场景(消费电子、汽车、工业)。 (2)架构设计: 确定芯片整体框架,包括核心模块(如CPU、GPU、存储单元)的协同方式和数据流路径。 (3)逻辑设计: 通过硬件描述语言(如Verilog、VHDL)将架构转化为电路逻辑,生成RTL(寄存器传输级)代码。 (4)物理设计: 将逻辑代码映射到物理布局,涉及布局布线、时序优化、功耗分析等,需借助EDA工具(如Ca
    碧海长空 2025-04-15 11:30 174浏览
  • 在当今汽车电子化和智能化快速发展的时代,车规级电子元器件的质量直接关系到汽车安全性能。三星作为全球领先的电子元器件制造商,其车规电容备受青睐。然而,选择一个靠谱的三星车规电容代理商至关重要。本文以行业领军企业北京贞光科技有限公司为例,深入剖析如何选择优质代理商。选择靠谱代理商的关键标准1. 授权资质与行业地位选择三星车规电容代理商首先要验证其授权资质及行业地位。北京贞光科技作为中国电子元器件行业的领军者,长期走在行业前沿,拥有完备的授权资质。公司专注于市场分销和整体布局,在电子元器件领域建立了卓
    贞光科技 2025-04-14 16:18 152浏览
  • 你知道精益管理中的“看板”真正的意思吗?在很多人眼中,它不过是车间墙上的一块卡片、一张单子,甚至只是个用来控制物料的工具。但如果你读过大野耐一的《丰田生产方式》,你就会发现,看板的意义远不止于此。它其实是丰田精益思想的核心之一,是让工厂动起来的“神经系统”。这篇文章,我们就带你一起从这本书出发,重新认识“看板”的深层含义。一、使“看板”和台车结合使用  所谓“看板”就是指纸卡片。“看板”的重要作用之一,就是连接生产现场上道工序和下道工序的信息工具。  “看板”是“准时化”生产的重要手段,它总是要
    优思学院 2025-04-14 15:02 118浏览
  • 三、芯片的制造1、制造核心流程 (1)晶圆制备:以高纯度硅为基底,通过拉晶、切片、抛光制成晶圆。 (2)光刻:光刻、离子注入、薄膜沉积、化学机械抛光。 (3)刻蚀与沉积:使用干法刻蚀(等离子体)精准切割图形,避免侧壁损伤。 (4)掺杂:注入离子形成PN结特性,实现晶体管开关功能。2、材料与工艺创新 (1)新材料应用: 高迁移率材料(FinFET中的应变硅、GaN在射频芯片中的应用); 新型封装技术(3D IC、TSV硅通孔)提升集成度。 (2)工艺创新: 制程从7nm到3nm,设计架构由F
    碧海长空 2025-04-15 11:33 217浏览
  •   高空 SAR 目标智能成像系统软件:多领域应用的前沿利器   高空 SAR(合成孔径雷达)目标智能成像系统软件,专门针对卫星、无人机等高空平台搭载的 SAR传感器数据,融合人工智能与图像处理技术,打造出的高效目标检测、识别及成像系统。此软件借助智能算法,显著提升 SAR图像分辨率、目标特征提取能力以及实时处理效率,为军事侦察、灾害监测、资源勘探等领域,提供关键技术支撑。   应用案例系统软件供应可以来这里,这个首肌开始是幺伍扒,中间是幺幺叁叁,最后一个是泗柒泗泗,按照数字顺序组合
    华盛恒辉l58ll334744 2025-04-14 16:09 155浏览
  • 四、芯片封测技术及应用场景1、封装技术的发展历程 (1)DIP封装:早期分立元件封装,体积大、引脚少; (2)QFP封装:引脚密度提升,适用于早期集成电路。 (3)BGA封装:高密度互连,散热与信号传输优化; (4)3D封装:通过TSV(硅通孔)实现垂直堆叠,提升集成度(如HBM内存堆叠); (5)Chiplet封装:异质集成,将不同工艺节点的模块组合(如AMD的Zen3+架构)。 (6)SiP封装:集成多种功能芯片(如iPhone的A系列SoC整合CPU、GPU、射频模块)。2、芯片测试 (1
    碧海长空 2025-04-15 11:45 217浏览
  •   无人装备作战协同仿真系统软件:科技的关键支撑   无人装备作战协同仿真系统软件,作为一款综合性仿真平台,主要用于模拟无人机、无人车、无人艇等无人装备在复杂作战环境中的协同作战能力、任务规划、指挥控制以及性能评估。该系统通过搭建虚拟战场环境,支持多种无人装备协同作战仿真,为作战指挥、装备研发、战术训练和作战效能评估,提供科学依据。   应用案例   系统软件供应可以来这里,这个首肌开始是幺伍扒,中间是幺幺叁叁,最后一个是泗柒泗泗,按照数字顺序组合就可以找到。   核心功能   虚拟战
    华盛恒辉l58ll334744 2025-04-14 17:24 90浏览
  • 一、引言:智能化趋势下的学爬玩具开发挑战随着早教理念的普及,学爬玩具作为婴幼儿早期运动能力开发的重要工具,市场需求持续增长。然而,传统学爬玩具开发面临多重挑战:需集成红外遥控、语音交互、电机控制等多模块,开发周期长、硬件成本高;复杂的红外编解码与语音功能实现依赖工程师深度参与,技术门槛陡增。如何以更低成本、更快速度打造差异化产品,成为行业亟待解决的痛点。二、传统开发模式痛点分析硬件冗余红外接收模块、语音芯片、主控MCU分立设计,导致PCB面积增加,BOM成本攀升。开发周期长需工程师独立完成红外协
    广州唯创电子 2025-04-16 08:40 49浏览
  • 一、智能语音播报技术演进与市场需求随着人工智能技术的快速发展,TTS(Text-to-Speech)技术在商业场景中的应用呈现爆发式增长。在零售领域,智能收款机的语音播报功能已成为提升服务效率和用户体验的关键模块。WT3000T8作为新一代高性能语音合成芯片,凭借其优异的处理能力和灵活的功能配置,正在为收款机智能化升级提供核心技术支持。二、WT3000T8芯片技术特性解析硬件架构优势采用32位高性能处理器(主频240MHz),支持实时语音合成与多任务处理QFN32封装(4x4mm)实现小型化设计
    广州唯创电子 2025-04-15 08:53 111浏览
  • 一、芯片的发展历程总结:1、晶体管的诞生(1)电子管时代 20世纪40年代,电子管体积庞大、功耗高、可靠性差,无法满足计算机小型化需求。(2)晶体管时代 1947年,贝尔实验室的肖克利、巴丁和布拉顿发明点接触晶体管,实现电子信号放大与开关功能,标志着固态电子时代的开端。 1956年,肖克利发明晶体管。(3)硅基晶体管时代 早期晶体管采用锗材料,但硅更耐高温、成本低,成为主流材料。2、集成电路的诞生与发展 1958年,德州仪器工程师基尔比用锗材料制成世界上第一块含多个晶体管的集成电路,同年仙童半导
    碧海长空 2025-04-15 09:30 127浏览
  • 一、智能门锁市场痛点与技术革新随着智能家居的快速发展,电子门锁正从“密码解锁”向“无感交互”进化。然而,传统人体感应技术普遍面临三大挑战:功耗高导致续航短、静态人体检测能力弱、环境适应性差。WTL580微波雷达解决方案,以5.8GHz高精度雷达感知技术为核心,突破行业瓶颈,为智能门锁带来“精准感知-高效触发-超低功耗”的全新交互范式。二、WTL580方案核心技术优势1. 5.8GHz毫米波雷达:精准感知的革命全状态人体检测:支持运动、微动(如呼吸)、静态(坐卧)多模态感知,检测灵敏度达0.1m/
    广州唯创电子 2025-04-15 09:20 98浏览
  • 2025年4月13日(中国武汉)——在全球经济分化与地缘政治不确定性加剧的背景下,科技与金融的深度融合已成为推动创新与繁荣的关键动力。为实现科技创新、产业进步和金融发展有机结合,发挥金融对科技创新和产业进步的支持作用,国际金融论坛(IFF)科技金融委员会启动大会暨首届科技金融圆桌会议于4月13日在湖北省武汉市武汉产业创新发展研究院成功举行。同时,IFF科技金融委员会由国际金融论坛IFF与武创院联合成立。本次大会汇聚了来自政府、产业与学术研究机构及金融等多领域的精英,共同探讨科技金融如何更好地服务
    华尔街科技眼 2025-04-15 20:53 46浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦