【VHDL笔记】 FIR滤波器的设计(基于Quartus II软件)

这篇具有很好参考价值的文章主要介绍了【VHDL笔记】 FIR滤波器的设计(基于Quartus II软件)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

PS:此文章仅供参考


前言

本文介绍了使用VHDL语言实现一个FIR滤波器的设计


以下是本篇文章正文内容,代码可供参考

一、什么是FIR滤波器?

通常数字滤波器常用于修正或改变时域中信号的属性。学过信号与系统的同学应该知道,最为普通的数字滤波器就是 线性时不变量(LTI)滤波器,线性时不变量滤波器又分为两大类:有限脉冲响应(FIR)滤波器和无线脉冲响应(IIR)滤波器,FIR滤波器的组成结构如下图所示,该滤波器的优点在于其不再需要给X[n]提供额外的移位寄存器。
【VHDL笔记】 FIR滤波器的设计(基于Quartus II软件)

【VHDL笔记】 FIR滤波器的设计(基于Quartus II软件)
简单的来说就是

二、程序编写

1.顶层程序DTFIR.vhd

代码如下:

--顶层
LIBRARY LPM;
USE LPM.LPM_COMPONENTS.ALL;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY DTFIR IS
  PORT(K:IN STD_LOGIC;
       CLK:IN STD_LOGIC;
		 CLK2:IN STD_LOGIC;
		 COM:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
		 SEG:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END ENTITY DTFIR;

ARCHITECTURE ART OF DTFIR IS
  COMPONENT KG IS
    PORT(CLK:IN STD_LOGIC;
         K:IN STD_LOGIC;
		   TIMES:OUT STD_LOGIC);
    END COMPONENT KG;
  COMPONENT CLKGEN IS
    PORT(CLK: IN STD_LOGIC;
         NEWCLK: OUT STD_LOGIC);
	  
    END COMPONENT CLKGEN;	 
  COMPONENT KZSR IS
    PORT(CLK:IN STD_LOGIC;
         XOUT:OUT STD_LOGIC_VECTOR(8 DOWNTO 0);
		   LOAD:OUT STD_LOGIC;
		   COUT:OUT STD_LOGIC_VECTOR(8 DOWNTO 0));
	  
    END COMPONENT KZSR;
  COMPONENT FIR IS
    GENERIC(W1:INTEGER:=9;
			   W2:INTEGER:=18;
			   W3:INTEGER:=19;
			   W4:INTEGER:=11;
			   L:INTEGER:=4;
			   MPIPE:INTEGER:=3);
    PORT(CLK,LOAD_X:IN STD_LOGIC;
		   X_IN,C_IN:IN STD_LOGIC_VECTOR(W1-1 DOWNTO 0);
		   Y_OUT:OUT STD_LOGIC_VECTOR(W4-1 DOWNTO 0));  
    END COMPONENT FIR;
	 
  COMPONENT XSKZQ IS
      PORT (ABCD:IN STD_LOGIC_VECTOR(10 DOWNTO 0);
            G,S,B,Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));  
     END COMPONENT XSKZQ;
	 
  COMPONENT CTRLS IS
    PORT(CLK: IN STD_LOGIC;      
         SEL: OUT STD_LOGIC_VECTOR(2 DOWNTO 0));
    END COMPONENT CTRLS;
  COMPONENT DISPLAY IS
    PORT(SEL: IN STD_LOGIC_VECTOR(2 DOWNTO 0);
         G,S,B,Q: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
         COM: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
         SEG: OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
    END COMPONENT DISPLAY;
  SIGNAL CK:STD_LOGIC; 
  SIGNAL S0,S1,S2:STD_LOGIC; 
  SIGNAL SD:STD_LOGIC_VECTOR(8 DOWNTO 0);
  SIGNAL SL:STD_LOGIC_VECTOR(8 DOWNTO 0);
  SIGNAL SM:STD_LOGIC_VECTOR(10 DOWNTO 0);
  SIGNAL A,B,C,D:STD_LOGIC_VECTOR(3 DOWNTO 0);
  SIGNAL SE:STD_LOGIC_VECTOR(2 DOWNTO 0);
  BEGIN
  U0: KG PORT MAP(CLK=>CLK,K=>K,TIMES=>S0);
  U1: CLKGEN PORT MAP(S0,CK);
  U2: KZSR PORT MAP(CK,SD,S1,SL);
  U3: FIR PORT MAP(CK,S1,SD,SL,SM); 
  U4: XSKZQ PORT MAP(SM,A,B,C,D);
  U5: CTRLS PORT MAP(CLK2,SE);
  U6: DISPLAY PORT MAP(SE,A,B,C,D,COM,SEG);
  
  END ARCHITECTURE ART;
 

顶层代码也可采用原理图输入的方法,这里简单介绍一下在Quartus II软件中,顶层程序原理图输入使用。
第一步:将所需工程的各种底层模块代码编写完毕,并验证其是否正确。
第二步:右键程序文件,点击Create Symbol File for Current file 创建一个原理图模块
【VHDL笔记】 FIR滤波器的设计(基于Quartus II软件)
生成好的原理图模块如下图所示:
【VHDL笔记】 FIR滤波器的设计(基于Quartus II软件)
之后在工程目录中新建一个原理图工程.bdf后缀的文件,之后添加各个模块,连线编译就可以了,此次工程的原理图输入如下图所示:
【VHDL笔记】 FIR滤波器的设计(基于Quartus II软件)

2.开关控制程序 KG.vhd

使用一个外部拨码开关控制外部输入时钟信号,达到滤波器的启动停止功能。
外部输入 KG.vhd 代码如下:

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY KG IS
  PORT(CLK:IN STD_LOGIC;
       K:IN STD_LOGIC;
		 TIMES:OUT STD_LOGIC);
END ENTITY KG;

ARCHITECTURE ART OF KG IS
  BEGIN
  PROCESS(CLK,K)IS
    BEGIN
	 IF K='1' THEN
	   TIMES<=CLK;
	 ELSE
	   TIMES<='0';
	 END IF;
  END PROCESS;`
END ARCHITECTURE ART;

3.数码管的控制程序 KZSR.vhd

此程序为FIR滤波器的前级程序,使用1Hz的时钟信号同步控制,在时钟下降沿的时候将FIR滤波器的所需的系数C_IN与变量X_IN装载进FIR.vhd程序中,其中可根据自己的所需设定不同的XOUT的值输入进FIR.vhd 程序中进行运算。
程序源码如下,可自行参考:

--数码管控制文件
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
--USE IEEE.STD_LOGIC_ARITH.ALL;

ENTITY KZSR IS
  PORT(CLK:IN STD_LOGIC;
       XOUT:OUT STD_LOGIC_VECTOR(8 DOWNTO 0);
		 LOAD:OUT STD_LOGIC;
		 COUT:OUT STD_LOGIC_VECTOR(8 DOWNTO 0));
END ENTITY KZSR;

ARCHITECTURE ART OF KZSR IS
  SIGNAL SEL:STD_LOGIC_VECTOR(3 DOWNTO 0);
  SIGNAL A:STD_LOGIC_VECTOR(3 DOWNTO 0);
  BEGIN
  PROCESS(SEL,CLK)
  BEGIN
  IF CLK'EVENT AND CLK='0' THEN
    SEL<=SEL+'1';
  ELSE 
    NULL;
  END IF;
  
  IF CLK'EVENT AND CLK='0' THEN
    A<=A+'1';
  ELSE NULL;
  END IF;
  
  CASE A IS
    WHEN "0000"=>LOAD<='0';
	 WHEN "0001"=>LOAD<='0';
	 WHEN "0010"=>LOAD<='0';
	 WHEN "0011"=>LOAD<='0';
    WHEN OTHERS=>LOAD<='1';
  END CASE;
  
	 CASE SEL IS
	   WHEN "0000"=>COUT<="001111100";XOUT<="000000000";
		WHEN "0001"=>COUT<="011010110";XOUT<="000000000";
		WHEN "0010"=>COUT<="000111001";XOUT<="000000000";
		WHEN "0011"=>COUT<="111011111";XOUT<="000000000";
		WHEN "0100"=>XOUT<="001100100";COUT<="000000000";
		WHEN "0101"=>XOUT<="010010110";COUT<="000000000";
		WHEN "0110"=>XOUT<="011001000";COUT<="000000000";
		WHEN "0111"=>XOUT<="011111010";COUT<="000000000";
		WHEN OTHERS=>XOUT<="000000000";COUT<="000000000";
	END CASE;
  END PROCESS;
END ARCHITECTURE ART;

4.FIR滤波器程序 FIR.vhd

--FIR滤波器设计
LIBRARY LPM;
USE LPM.LPM_COMPONENTS.ALL;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY FIR IS
	GENERIC(W1:INTEGER:=9;
			  W2:INTEGER:=18;
			  W3:INTEGER:=19;
			  W4:INTEGER:=11;
			  L:INTEGER:=4;
			  MPIPE:INTEGER:=3);
	PORT(CLK,LOAD_X:IN STD_LOGIC;
		  X_IN,C_IN:IN STD_LOGIC_VECTOR(W1-1 DOWNTO 0);
		  Y_OUT:OUT STD_LOGIC_VECTOR(W4-1 DOWNTO 0));
END ENTITY FIR;

ARCHITECTURE ART OF FIR IS
	SUBTYPE N1BIT IS STD_LOGIC_VECTOR(W1-1 DOWNTO 0);
	SUBTYPE N2BIT IS STD_LOGIC_VECTOR(W2-1 DOWNTO 0);
	SUBTYPE N3BIT IS STD_LOGIC_VECTOR(W3-1 DOWNTO 0);
	TYPE ARRAY_N1BIT IS ARRAY(0 TO L-1)OF N1BIT;
	TYPE ARRAY_N2BIT IS ARRAY(0 TO L-1)OF N2BIT;
	TYPE ARRAY_N3BIT IS ARRAY(0 TO L-1)OF N3BIT;
	SIGNAL X:N1BIT;
	SIGNAL Y:N3BIT;
	SIGNAL C:ARRAY_N1BIT;  --系数C的数组
	SIGNAL P:ARRAY_N2BIT;  --单项乘积数组
	SIGNAL A:ARRAY_N3BIT;  --加法矩阵
	BEGIN
	LOAD:PROCESS IS
	BEGIN
		WAIT UNTIL CLK='1';
		IF(LOAD_X='0')THEN
			C(L-1)<=C_IN;
			FOR I IN L-2 DOWNTO 0 LOOP
				C(I)<=C(I+1);
		END LOOP;
		ELSE
			X<=X_IN;
		END IF;
	END PROCESS LOAD;
	
	SOP:PROCESS(CLK)IS
	BEGIN
		IF CLK'EVENT AND (CLK='1') THEN
		FOR I IN 0 TO L-2 LOOP
			A(I)<=(P(I)(W2-1)&P(I))+A(I+1);
		END LOOP;
		A(L-1)<=P(L-1)(W2-1)&P(L-1);
		END IF;
		Y<=A(0);
	END PROCESS SOP;
	
	--流水线乘法器
	MULGEN:FOR I IN 0 TO L-1 GENERATE
		MULS:LPM_MULT
			GENERIC MAP(LPM_WIDTHA=>W1,LPM_WIDTHB=>W1,
							LPM_PIPELINE=>MPIPE,LPM_REPRESENTATION=>"SIGNED",
							LPM_WIDTHP=>W2,LPM_WIDTHS=>W2)
			PORT MAP(CLOCK=>CLK,DATAA=>X,DATAB=>C(I),RESULT=>P(I));
	END GENERATE;
	Y_OUT<=Y(W3-1 DOWNTO W3-W4);
END ARCHITECTURE ART;



仿真显示如下:
【VHDL笔记】 FIR滤波器的设计(基于Quartus II软件)

5.数码管显示控制程序 XSKZQ.vhd

--数码管显示控制电路文件
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY  XSKZQ IS
  PORT (ABCD:IN STD_LOGIC_VECTOR(10 DOWNTO 0);
        G,S,B,Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));      
END ENTITY XSKZQ;
ARCHITECTURE ART OF XSKZQ IS

	SIGNAL TEMP1,TEMP2,TEMP3,TEMP4:INTEGER RANGE 0 TO 9;
   SIGNAL T0,T1,T2,T3:INTEGER RANGE 0 TO 10#9999#;
	BEGIN
   PROCESS (ABCD) IS
     BEGIN
        T0<=CONV_INTEGER(ABCD);T1<=T0-T0/1000*1000;T2<=T1-T1/100*100;T3<=T2-T2/10*10;
        TEMP1<=T3;
	     TEMP2<=(T2-T3)/10;
	     TEMP3<=(T1-T2)/100;
	     TEMP4<=(T0-T1)/1000;
		  
   CASE TEMP1 IS
      WHEN 0  =>G<="0000"; 
      WHEN 1  =>G<="0001"; 
      WHEN 2  =>G<="0010";
      WHEN 3  =>G<="0011";
      WHEN 4  =>G<="0100";
      WHEN 5  =>G<="0101";
      WHEN 6  =>G<="0110";
      WHEN 7  =>G<="0111";
      WHEN 8  =>G<="1000";
      WHEN 9  =>G<="1001";
      WHEN OTHERS=>G<="0000";	
   END CASE;


   CASE TEMP2 IS
      WHEN 0  =>S<="0000"; 
      WHEN 1  =>S<="0001"; 
      WHEN 2  =>S<="0010";
      WHEN 3  =>S<="0011";
      WHEN 4  =>S<="0100";
      WHEN 5  =>S<="0101";
      WHEN 6  =>S<="0110";
      WHEN 7  =>S<="0111";
      WHEN 8  =>S<="1000";
      WHEN 9  =>S<="1001";
      WHEN OTHERS=>S<="0000";	
   END CASE;
	
	CASE TEMP3 IS
      WHEN 0  =>B<="0000" ; 
      WHEN 1  =>B<="0001"; 
      WHEN 2  =>B<="0010";
      WHEN 3  =>B<="0011";
      WHEN 4  =>B<="0100";
      WHEN 5  =>B<="0101";
      WHEN 6  =>B<="0110";
      WHEN 7  =>B<="0111";
      WHEN 8  =>B<="1000";
      WHEN 9  =>B<="1001";
      WHEN OTHERS=>B<="0000";
   END CASE;

   CASE TEMP4 IS
      WHEN 0  =>Q<="0000" ; 
      WHEN 1  =>Q<="0001"; 
      WHEN 2  =>Q<="0010";
      WHEN 3  =>Q<="0011";
      WHEN 4  =>Q<="0100";
      WHEN 5  =>Q<="0101";
      WHEN 6  =>Q<="0110";
      WHEN 7  =>Q<="0111";
      WHEN 8  =>Q<="1000";
      WHEN 9  =>Q<="1001";
      WHEN OTHERS=>Q<="0000";	
   END CASE;
	
	END PROCESS;
END ARCHITECTURE ART;
	

6、RTL图显示结果

【VHDL笔记】 FIR滤波器的设计(基于Quartus II软件)
其中后面的DISPLAY.vhdCTRL.vhd数码管显示驱动程序文件比较常见这里就不再赘述,大家可自行查阅资料。

总结

以上就是今天要讲的内容,本文仅仅简单介绍了使用VHDL语言设计FIR滤波器,同过使用FPGA进行逻辑综合实现FIR滤波器的数字化显示功能。
最后,非常感谢学长们对我的指导和帮助,让我完成了此次的FIR滤波器的设计。有更好方案的也希望大家在评论去留言。文章来源地址https://www.toymoban.com/news/detail-412281.html

到了这里,关于【VHDL笔记】 FIR滤波器的设计(基于Quartus II软件)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于FPGA的FIR滤波器的实现(5)— 并行结构FIR滤波器的FPGA代码实现

    并行结构,并行实现滤波器的累加运算,即并行将具有对称系数的输入数据进行相加,而后采用多个乘法器并行实现系数与数据的乘法运算,最后将所有乘积结果相加输出。这种结构具有最高的运行速度,因不需要累加运算,因此系数时钟频率可以与数据输出时钟频率保持一

    2024年02月03日
    浏览(53)
  • FIR数字滤波器设计——窗函数法

    本实验结合理论教材中FIR数字滤波器设计的教学内容中的窗函数设计法,学习和掌握窗函数法设计FIR数字滤波器的原理和实现过程,学习MATLAB设计FIR数字滤波器的相关函数的使用,掌握使用MATLAB设计FIR数字滤波器的过程与方法,从而加深对FIR数字滤波器常用指标和设计过程的

    2024年02月13日
    浏览(36)
  • 窗函数法设计FIR数字滤波器

    一、   实验目的 1.1.1掌握用窗函数法设计FIR数字滤波器的原理和方法。 1.1.2熟悉线性相位FIR数字滤波器特性。 1.1.3了解各种窗函数对滤波特性的影响。 实验原理 窗函数设计法的基本原理是用有限长单位脉冲序列逼近与。由于往往是无限长序列,且是非因果的,所以用窗函数

    2024年02月05日
    浏览(51)
  • Xilinx FIR IP核设计滤波器

    使用matlab工具,根据具体需求设计出滤波器系数; 打开fir ip导入滤波器系数即可; 打开matlab使用fdatool工具,填入相应的参数生成系数; Fs=250; Fpass=50; Fstop=70; Apass=0.01; Astop=80; 将滤波器系数设置为定点数输出; 导出滤波器系数,生成coe文件; Select source:选择为coe文件

    2024年02月05日
    浏览(42)
  • 滤波器设计:FIR和IIR高、低、带通滤波器的实现及Matlab代码

    滤波器设计:FIR和IIR高、低、带通滤波器的实现及Matlab代码 引言: 滤波器作为信号处理中非常重要的一部分,广泛应用于数字信号处理、音频处理、图像处理等领域。本文主要讨论FIR(有限长冲激响应)和IIR(无限长冲激响应)两种常见滤波器的设计及其实现。 FIR滤波器

    2024年02月09日
    浏览(40)
  • Xilinx的FIR滤波器IP的设计与仿真

    平台:Vivado2021.1 芯片:xcku115-flva1517-2-i (active) 语言:VerilogHDL 参考文件:pg149.下载地址 FIR Compiler LogiCORE IP Product Guide • FIR Compiler (PG149) • 阅读器 • AMD 自适应计算文档门户 (xilinx.com) FIR滤波器 最近准备研究以下滤波器。还是从xilinx的官方IP出发,来学习以下这部分。 使用

    2024年01月21日
    浏览(48)
  • 【Verilog 教程】7.3 Verilog 串行 FIR 滤波器设计

    串行 FIR 滤波器设计 设计说明 设计参数不变,与并行 FIR 滤波器参数一致。即,输入频率为 7.5 MHz 和 250 KHz 的正弦波混合信号,经过 FIR 滤波器后,高频信号 7.5MHz 被滤除,只保留 250KMHz 的信号。 串行设计,就是在 16 个时钟周期内对 16 个延时数据分时依次进行乘法、加法运算

    2024年02月06日
    浏览(48)
  • 基于Quartues ii和Modelsim的FIR滤波器仿真

    本设计需要实现基于FPGA的FIR低通滤波,采样频率5MHz,截止频率100kHz,利用Matlab设计FIR滤波器系数,并生成测试数据保存至txt文件。在Quartues ii中编写FIR滤波器模块,联合Modelsim进行功能仿真,观察滤波效果。 本设计分为两个部分,一个是MATLAB中测试数据的产生和FIR滤波器的设

    2023年04月16日
    浏览(27)
  • 数字信号处理音频FIR去噪滤波器(基于MATLAB GUI的开发)

    利用MATLAB GUI设计平台,用窗函数法设计FIR数字滤波器,对所给出的含有噪声的声音信号进行数字滤波处理,得到降噪的声音信号,进行时域频域分析,同时分析不同窗函数的效果。将文件解压至一个目录下,运行m文件即可使用。 读取.wav音频文件函数 :audioread();(老版

    2024年02月08日
    浏览(53)
  • 基于FPGA的FIR低通滤波器实现(附工程源码),matlab+vivado19.2+simulation

    本文为FPGA实现FIR滤波器仿真过程,附源代码。 提示:以下是本篇文章正文内容,下面案例可供参考 打开MATLAB在命令行窗口输入: fadtool 回车后在滤波器设计界面设置滤波器参数如下 之后点击如图标志,设置定点,在菜单栏\\\"目标(R)\\\"出选择生成对应滤波器系数.COE文件 mat

    2024年02月11日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包