西安电子科技大学 VHDL大作业程控滤波器设计.docx

上传人:b****2 文档编号:23184102 上传时间:2023-05-15 格式:DOCX 页数:33 大小:214.83KB
下载 相关 举报
西安电子科技大学 VHDL大作业程控滤波器设计.docx_第1页
第1页 / 共33页
西安电子科技大学 VHDL大作业程控滤波器设计.docx_第2页
第2页 / 共33页
西安电子科技大学 VHDL大作业程控滤波器设计.docx_第3页
第3页 / 共33页
西安电子科技大学 VHDL大作业程控滤波器设计.docx_第4页
第4页 / 共33页
西安电子科技大学 VHDL大作业程控滤波器设计.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

西安电子科技大学 VHDL大作业程控滤波器设计.docx

《西安电子科技大学 VHDL大作业程控滤波器设计.docx》由会员分享,可在线阅读,更多相关《西安电子科技大学 VHDL大作业程控滤波器设计.docx(33页珍藏版)》请在冰豆网上搜索。

西安电子科技大学 VHDL大作业程控滤波器设计.docx

西安电子科技大学VHDL大作业程控滤波器设计

一、设计功能与要求

设计并制作程控滤波器,,其组成如图8.108所示。

放大器增益可设置;低通或高通滤波器通带、截止频率等参数可设置。

1.放大器输入正弦信号电压振幅为10mV,电压增益为40dB,增益10dB步进可调,通频带为100Hz-40kHz,放大器输出电压无明显失真。

2.滤波器可设置为低通滤波器,其-3dB截止频率fc在1kHz-20kHz范围内可调,调节的频率步进为1kHz,2fc处放大器与滤波器的总电压增益不大于30dB,RL=1k。

3.滤波器可设置为高通滤波器,其-3dB截止频率fc在1kHz-20kHz范围内可调,调节的频率步进为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;输出端分别接四个共阴极数码管。

KEYBOARD是键盘模块,用于设置放大倍数和截止频率;CONTROL是控制模块,用于控制低通滤波器、高通滤波器和程控放大器是否工作,并传送键盘数据;CONTROL1、CONTROL2、CONTROL3模块分别用于控制低通滤波器、高通滤波器的截止频率和放大器的放大倍数。

根据设计要求可画出FPGA控制模块的框图如下图所示。

系统各个模块介绍:

1分频器模块

根据设计要求可画出分频器模块的框图如图所示。

分频器模块框图

该模块将

的晶振进行25000和625分频,得到两个不同频率的时钟信号,分别为

,其中时钟

用来为键盘模块提供时钟信号,而时钟

用来为键盘模块和低通滤波器控制模块、高通滤波器控制模块和放大器控制模块提供时钟信号。

  libraryieee;

  useieee.std_logic_1164.all;

  useieee.std_logic_arith.all;

  useieee.std_logic_unsigned.all;

  

  entityFENis

  port(clk:

instd_logic;

  clk1,clk0:

outstd_logic);

  endFEN;

  

  architecturearchofFENis

  signalclk_mid0,clk_mid:

std_logic;

  begin

  process(clk)

  variabledata:

integerrange0to25000;

  begin

  ifclk'eventandclk='1'then

  ifdata=25000then

  data:

=0;

  clk_mid0<=notclk_mid0;

  else

  data:

=data+1;

  endif;

  endif;

  clk0<=clk_mid0;

  endprocess;

  

  process(clk)

  variabledata:

integerrange0to625;

  begin

  ifclk'eventandclk='1'then

  ifdata=625then

  data:

=0;

  clk_mid<=notclk_mid;

  else

  data:

=data+1;

  endif;

  endif;

  clk1<=clk_mid;

  endprocess;

  endarch;

仿真结果:

 

3.3.2键盘模块

根据设计要求可画出键盘模块的框图如图11所示。

图11键盘模块框图

在时钟信号

作用下,用行列式键盘来产生所需的键值,用

作为控制信号,当其值为

或者

时,用键盘C键来加1实现高通滤波器和低通滤波器的截止频率的步进,用D键来实现减1操作;当其值为

时,用键盘C键来加10实现放大器增益步进,用D键来实现减10操作。

从而实现放大倍数和截止频率的调节。

同时将输入的数据用数码管进行显示。

信号从

端口输出。

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_arith.all;

useieee.std_logic_unsigned.all;

entityKEYBOARDis

port(control:

instd_logic_vector(1downto0);

control_out:

outstd_logic_vector(1downto0);

clk_1k:

instd_logic;

clk_40k:

instd_logic;

key_lie:

instd_logic_vector(3downto0);

start:

outstd_logic;

key_hang:

outstd_logic_vector(3downto0);

data_p:

outstd_logic_vector(7downto0);

disp_data:

outstd_logic_vector(7downto0);

disp_sel:

outstd_logic_vector(3downto0)

);

end;

architecturearchofKEYBOARDis

signalint:

std_logic;

signalclk_sel:

std_logic;

signalstart_reg:

std_logic;

signaldisp_sel_reg:

std_logic_vector(3downto0);

signaldata_l,data_h:

std_logic_vector(3downto0);

signaldata_tmp:

std_logic_vector(3downto0);

signalkey_hang_tmp:

std_logic_vector(3downto0);

signaldisp_data_reg:

std_logic_vector(3downto0);

signalkey_code:

std_logic_vector(7downto0);

signaldata_p_reg:

std_logic_vector(7downto0);

begin

control_out<=control;

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_1kand(notint);

process(clk_sel,clk_40k,int)

variablestate:

integerrange0to3;

begin

ifrising_edge(clk_40k)then

int<=not(key_lie(3)andkey_lie

(2)andkey_lie

(1)andkey_lie(0));

endif;

ifrising_edge(clk_sel)then

casestateis

when0=>key_hang_tmp<="1110";

state:

=1;

when1=>key_hang_tmp<="1101";

state:

=2;

when2=>key_hang_tmp<="1011";

state:

=3;

when3=>key_hang_tmp<="0111";

state:

=0;

endcase;

endif;

endprocess;

process(clk_40k,int)

variablestate:

integerrange0to3;

variablecounter:

integerrange0to99999;

begin

ifint='0'then

state:

=0;

counter:

=0;

elsifrising_edge(clk_40k)then

casestateis

when0=>

data_tmp<=data_l;

state:

=1;

when1=>

casekey_codeis

when"01110111"=>

data_l<="0001";

data_h<=data_tmp;

state:

=2;

when"01111011"=>

data_l<="0010";

data_h<=data_tmp;

state:

=2;

when"01111101"=>

data_l<="0011";

data_h<=data_tmp;

state:

=2;

when"01111110"=>

data_l<="0100";--4

data_h<=data_tmp;

state:

=2;

when"10110111"=>

data_l<="0101";

data_h<=data_tmp;

state:

=2;

when"10111011"=>

data_l<="0110";

data_h<=data_tmp;

state:

=2;

when"10111101"=>

data_l<="0111";--7

data_h<=data_tmp;

state:

=2;

when"10110110"=>

data_l<="1000";

data_h<=data_tmp;

state:

=2;

when"11010111"=>

data_l<="1001";

data_h<=data_tmp;

state:

=2;

when"11011011"=>

data_l<="0000";--0

data_h<=data_tmp;

state:

=2;

when"11100111"=>--C

ifcontrol="10"then--+10

ifdata_h="1001"then

data_h<="1001";

elsedata_h<=data_h+1;

endif;

elsifcontrol="00"orcontrol="01"then--+1

ifdata_h="1001"then

ifdata_l="1001"then

data_h<="1001";

data_l<="1001";

elsedata_l<=data_l+1;

endif;

elsifdata_l="1001"then

data_l<="1000";

data_h<=data_h+1;

elsedata_l<=data_l+1;

data_h<=data_h;

endif;

endif;

state:

=2;

when"11101011"=>--D

ifcontrol="10"then---10

ifdata_h="0000"then

data_h<="0000";

elsedata_h<=data_h-1;

endif;

elsifcontrol="00"orcontrol="01"then---1

ifdata_l="0000"anddata_h="0000"then

data_l<="0000";

data_h<="0000";

elsifdata_l="0000"then

data_l<="1001";

data_h<=data_h-1;

elsedata_l<=data_l-1;

data_h<=data_h;

endif;

endif;

state:

=2;

when"11101101"=>--E

data_l<="0000";

data_l<="0000";

state:

=2;

when"11101110"=>--F

data_l<=data_l;

data_h<=data_h;

data_p_reg<=data_h&data_l;

start_reg<='1';

state:

=2;

whenothers=>

state:

=2;

endcase;

when2=>

ifcounter=99999then

counter:

=0;

state:

=3;

elsecounter:

=counter+1;

state:

=2;

endif;

when3=>

start_reg<='0';

state:

=3;

endcase;

endif;

endprocess;

process(clk_1k,data_l,data_h)

variablestate:

integerrange0to3;

begin

ifrising_edge(clk_1k)then

casestateis

when0=>

disp_sel_reg<="1011";

disp_data_reg<=data_l;

state:

=1;

when1=>

disp_sel_reg<="0111";

disp_data_reg<=data_h;

state:

=2;

when2=>

disp_sel_reg<="1110";

ifcontrol="00"orcontrol="01"then

disp_data_reg<="1100";--k

elsifcontrol="10"then

disp_data_reg<="1010";--b

endif;

state:

=3;

when3=>

disp_sel_reg<="1101";

ifcontrol="00"orcontrol="01"then

disp_data_reg<="1101";--h

elsifcontrol="10"then

disp_data_reg<="1011";--d

endif;

state:

=0;

endcase;

endif;

endprocess;

process(clk_1k,disp_data_reg)

begin

ifrising_edge(clk_1k)then

casedisp_data_regis

when"0000"=>

disp_data<="11111100";--0

when"0001"=>

disp_data<="01100000";--1

when"0010"=>

disp_data<="11011010";--2

when"0011"=>

disp_data<="11110010";--3

when"0100"=>

disp_data<="01100110";--4

when"0101"=>

disp_data<="10110110";--5

when"0110"=>

disp_data<="10111110";--6

when"0111"=>

disp_data<="11100000";--7

when"1000"=>

disp_data<="11111110";--8

when"1001"=>

disp_data<="11110110";--9

when"1010"=>

disp_data<="00111110";--b

when"1011"=>

disp_data<="01111010";--d

when"1100"=>

disp_data<="00001110";--k

when"1101"=>

disp_data<="01101110";--h

whenothers=>

disp_data<="00000000";

endcase;

endif;

endprocess;

end;

3.3.3控制模块

根据设计要求可画出控制模块的框图如图12所示。

图12控制模块框图

通过由键盘输入的控制信号

来控制低通滤波器、高通滤波器和放大器是否工作。

当其值为

时,选通低通滤波器,同时通过

来传送键盘数据;当其值为

时,选通高通滤波器器,同时通过

来传送键盘数据;当其值为

时,选通放大器,同时通过

传送键盘数据。

控制模块如图11所示。

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_arith.all;

useieee.std_logic_unsigned.all;

entityCONTROLis

port(control_in:

instd_logic_vector(1downto0);

data:

instd_logic_vector(7downto0);

road1,road2,road3:

outstd_logic;

data_out1,data_out2,data_out3:

outstd_logic_vector(7downto0)

);

endCONTROL;

architecturearchofCONTROLis

begin

process(data,control_in)

begin

casecontrol_inis

when"00"=>

road1<='1';

road2<='0';

road3<='0';

data_out1<=data(7downto0);

when"01"=>

road1<='0';

road2<='1';

road3<='0';

data_out2<=data(7downto0);

when"10"=>

road1<='0';

road2<='0';

road3<='1';

data_out3<=data(7downto0);

whenothers=>null;

endcase;

endprocess;

endarch;

仿真结果如下:

3.3.4低通滤波器控制模块

根据设计要求可画出低通滤波器模块的框图如图13所示。

图13低通滤波器模块框图

在时钟信号

的作用下,将传送来的键盘数据转化成十进制数,然后与预先设置好的数值进行比较得到选通的频率,从而通过

输出二进制代码,进而输入到模拟开关,最后选通相应的开关,从而实现截止频率的控制。

低通滤波器控制模块如图12所示。

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_arith.all;

useieee.std_logic_unsigned.all;

entityCONTROL1is

port(control:

instd_logic;

clk:

instd_logic;

bcd:

instd_logic_vector(7downto0);

d0,d1,d2,d3,d4:

outstd_logic_vector(2downto0)

);

endCONTROL1;

architecturearchofCONTROL1is

begin

process(clk,bcd)

variabledata:

integerrange0to100;

begin

ifclk'eventandclk='1'then

data:

=conv_integer(bcd(7downto4))*10+conv_integer(bcd(3downto0));

ifcontrol='1'then

casedatais

when1=>

d0<="000";

d1<="100";

d2<="100";

d3<="100";

d4<="100";

when2=>

d0<="001";

d1<="100";

d2<="100";

d3<="100";

d4<="100";

when3=>

d0<="010";

d1<="100";

d2<="100";

d3<="100";

d4<="100";

when4=>

d0<="011";

d1<="100";

d2<="100";

d3<="100";

d4<="100";

when5=>

d0<="100";

d1<="000";

d2<="100";

d3<="100";

d4<="100";

when6=>

d0<="100";

d1<="001";

d2<="100";

d3<="100";

d4<="100";

when7=>

d0<="100";

d1<="010";

d2<="100";

d3<="100";

d4<="100";

when8=>

d0<="100";

d1<="011";

d2<="100";

d3<="100";

d4<="100";

when9=>

d0<="100";

d1<="100";

d2<="000";

d3<="100";

d4<="100";

when10=>

d0<="100";

d1<="100";

d2<="001";

d3<="100";

d4<="100";

when11=>

d0<="100";

d1<="100";

d2<="010";

d3<="100";

d4<="100";

when12=>

d0<="100";

d1<="100";

d2<="011";

d3<="100";

d4<="100";

when13=>

d0<="100";

d1<="100";

d2<="100";

d3<="000";

d4<="100";

when14=>

d0<="100";

d1<="100";

d2<="

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1