1、西安电子科技大学 VHDL大作业程控滤波器设计一、 设计功能与要求设计并制作程控滤波器,其组成如图8.108所示。放大器增益可设置;低通或高通滤波器通带、截止频率等参数可设置。 1. 放大器输入正弦信号电压振幅为10mV,电压增益为40dB,增益10dB步进可调,通频带为100Hz-40kHz,放大器输出电压无明显失真。 2. 滤波器可设置为低通滤波器,其-3dB截止频率fc在1kHz-20kHz范围内可调,调节的频率步进为1kHz,2fc处放大器与滤波器的总电压增益不大于30dB,RL=1k。 3. 滤波器可设置为高通滤波器,其-3dB截止频率fc在1kHz-20kHz范围内可调,调节的频率
2、步进为1kHz,0.5fc处放大器与滤波器的总电压增益不大于30dB,RL=1k。 4. 电压增益与截止频率的误差均不大于10%,有设置参数显示功能。2设计思路及框图根据设计要求可画出FPGA控制模块的框图如下图所示。根据FPGA控制模块的框图可设计出如下图所示的FPGA控制核心模块原理,程序见附录。其中,输入端clk接50MHz晶振电路;输入端接高低电平,00时键盘控制低通滤波器,01时键盘控制高通滤波器,10时键盘控制的程控滤波器;输入端接键盘。输出端start接发光二极管,有键值输出时发光二极管显示;输出端接键盘;输出端接数码管a、b、c、d、e、f、g、h;输出端分别接四个共阴极数码管
3、。KEYBOARD是键盘模块,用于设置放大倍数和截止频率;CONTROL是控制模块,用于控制低通滤波器、高通滤波器和程控放大器是否工作,并传送键盘数据;CONTROL1、CONTROL2、CONTROL3模块分别用于控制低通滤波器、高通滤波器的截止频率和放大器的放大倍数。根据设计要求可画出FPGA控制模块的框图如下图所示。系统各个模块介绍:1 分频器模块根据设计要求可画出分频器模块的框图如图所示。分频器模块框图该模块将的晶振进行25000和625分频,得到两个不同频率的时钟信号,分别为,其中时钟用来为键盘模块提供时钟信号,而时钟用来为键盘模块和低通滤波器控制模块、高通滤波器控制模块和放大器控制
4、模块提供时钟信号。library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity FEN is port(clk:in std_logic; clk1,clk0:out std_logic);end FEN;architecture arch of FEN is signal clk_mid0,clk_mid:std_logic;beginprocess(clk)variable data:integer range 0 to 25000;b
5、eginif clkevent and clk=1 then if data=25000 then data:=0; clk_mid0=not clk_mid0; else data:=data+1; end if;end if;clk0=clk_mid0;end process;process(clk)variable data:integer range 0 to 625;begin if clkevent and clk=1then if data=625 then data:=0; clk_mid=not clk_mid; else data:=data+1; end if;end i
6、f;clk1=clk_mid;end process;end arch;仿真结果:3.3.2 键盘模块根据设计要求可画出键盘模块的框图如图11所示。图11 键盘模块框图在时钟信号和作用下,用行列式键盘来产生所需的键值,用作为控制信号,当其值为或者时,用键盘C键来加1实现高通滤波器和低通滤波器的截止频率的步进,用D键来实现减1操作;当其值为时,用键盘C键来加10实现放大器增益步进,用D键来实现减10操作。从而实现放大倍数和截止频率的调节。同时将输入的数据用数码管进行显示。信号从端口输出。library ieee;use ieee.std_logic_1164.all;use ieee.std_l
7、ogic_arith.all;use ieee.std_logic_unsigned.all;entity KEYBOARD isport(control:in std_logic_vector(1 downto 0); control_out:out std_logic_vector(1 downto 0); clk_1k:in std_logic; clk_40k:in std_logic; key_lie:in std_logic_vector(3 downto 0); start:out std_logic; key_hang:out std_logic_vector(3 downto
8、 0); data_p:out std_logic_vector(7 downto 0); disp_data:out std_logic_vector(7 downto 0); disp_sel:out std_logic_vector(3 downto 0) );end;architecture arch of KEYBOARD is signal int:std_logic;signal clk_sel:std_logic;signal start_reg:std_logic;signal disp_sel_reg:std_logic_vector(3 downto 0);signal
9、data_l,data_h:std_logic_vector(3 downto 0);signal data_tmp:std_logic_vector(3 downto 0);signal key_hang_tmp:std_logic_vector(3 downto 0);signal disp_data_reg:std_logic_vector(3 downto 0);signal key_code:std_logic_vector(7 downto 0);signal data_p_reg:std_logic_vector(7 downto 0);begin control_out=con
10、trol;key_code=key_hang_tmp&key_lie;data_p=data_p_reg;start=start_reg;key_hang=key_hang_tmp;disp_sel=disp_sel_reg;clk_sel=clk_1k and (not int);process(clk_sel,clk_40k,int)variable state:integer range 0 to 3;begin if rising_edge(clk_40k)then int key_hang_tmpkey_hang_tmpkey_hang_tmpkey_hang_tmp data_tm
11、p case key_code is when 01110111= data_l=0001; data_h data_l=0010; data_h data_l=0011; data_h data_l=0100;-4 data_h data_l=0101; data_h data_l=0110; data_h data_l=0111;-7 data_h data_l=1000; data_h data_l=1001; data_h data_l=0000;-0 data_h-C if control=10then-+10 if data_h=1001 then data_h=1001; els
12、e data_h=data_h+1; end if; elsif control=00or control=01 then -+1 if data_h=1001then if data_l=1001then data_h=1001; data_l=1001; else data_l=data_l+1; end if; elsif data_l=1001then data_l=1000; data_h=data_h+1; else data_l=data_l+1; data_h-D if control=10then-10 if data_h=0000 then data_h=0000; els
13、e data_h=data_h-1; end if; elsif control=00or control=01 then -1 if data_l=0000and data_h=0000then data_l=0000; data_h=0000; elsif data_l=0000then data_l=1001; data_h=data_h-1; else data_l=data_l-1; data_h-E data_l=0000; data_l-F data_l=data_l; data_h=data_h; data_p_reg=data_h&data_l; start_reg stat
14、e:=2; end case; when 2= if counter=99999 then counter:=0; state:=3; else counter:=counter+1; state:=2; end if; when 3= start_reg disp_sel_reg=1011; disp_data_reg disp_sel_reg=0111; disp_data_reg disp_sel_reg=1110; if control=00or control=01 then disp_data_reg=1100;-k elsif control=10then disp_data_r
15、eg disp_sel_reg=1101; if control=00or control=01 then disp_data_reg=1101;-h elsif control=10then disp_data_reg disp_data disp_data disp_data disp_data disp_data disp_data disp_data disp_data disp_data disp_data disp_data disp_data disp_data disp_data disp_data road1=1; road2=0; road3=0; data_out1 ro
16、ad1=0; road2=1; road3=0; data_out2 road1=0; road2=0; road3=1; data_out3null;end case;end process;end arch;仿真结果如下:3.3.4 低通滤波器控制模块根据设计要求可画出低通滤波器模块的框图如图13所示。图13 低通滤波器模块框图在时钟信号的作用下,将传送来的键盘数据转化成十进制数,然后与预先设置好的数值进行比较得到选通的频率,从而通过,输出二进制代码,进而输入到模拟开关,最后选通相应的开关,从而实现截止频率的控制。低通滤波器控制模块如图12所示。library ieee;use ieee.
17、std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity CONTROL1 is port(control:in std_logic; clk:in std_logic; bcd:in std_logic_vector(7 downto 0); d0,d1,d2,d3,d4:out std_logic_vector(2 downto 0) );end CONTROL1;architecture arch of CONTROL1 isbeginprocess(clk,bcd)var
18、iable data:integer range 0 to 100;begin if clkevent and clk=1then data:=conv_integer(bcd(7 downto 4)*10+conv_integer(bcd(3 downto 0);if control=1then case data is when 1= d0=000; d1=100; d2=100; d3=100; d4 d0=001; d1=100; d2=100; d3=100; d4 d0=010; d1=100; d2=100; d3=100; d4 d0=011; d1=100; d2=100;
19、d3=100; d4 d0=100; d1=000; d2=100; d3=100; d4 d0=100; d1=001; d2=100; d3=100; d4 d0=100; d1=010; d2=100; d3=100; d4 d0=100; d1=011; d2=100; d3=100; d4 d0=100; d1=100; d2=000; d3=100; d4 d0=100; d1=100; d2=001; d3=100; d4 d0=100; d1=100; d2=010; d3=100; d4 d0=100; d1=100; d2=011; d3=100; d4 d0=100; d1=100; d2=100; d3=000; d4 d0=100; d1=100; d2=
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1