西安电子科技大学 VHDL大作业程控滤波器设计.docx
- 文档编号:8721324
- 上传时间:2023-05-14
- 格式:DOCX
- 页数:33
- 大小:214.83KB
西安电子科技大学 VHDL大作业程控滤波器设计.docx
《西安电子科技大学 VHDL大作业程控滤波器设计.docx》由会员分享,可在线阅读,更多相关《西安电子科技大学 VHDL大作业程控滤波器设计.docx(33页珍藏版)》请在冰点文库上搜索。
西安电子科技大学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<="
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 西安电子科技大学 VHDL大作业程控滤波器设计 VHDL 作业 程控 滤波器 设计