多功能信号发生器设计.docx
《多功能信号发生器设计.docx》由会员分享,可在线阅读,更多相关《多功能信号发生器设计.docx(21页珍藏版)》请在冰点文库上搜索。
多功能信号发生器设计
目录
1、主要功能1
2、功能模块的划分1
3、主要功能的实现1
3.1信号的产生模块1
3.2信号选择模块3
3.3系统的细化框图3
3.4多功能信号发生器的RTL图4
4程序的调试分析与仿真5
5总结9
6附录10
6.1主程序10
6.2递增锯齿波形源程序11
6.3正弦波形源程序12
6.4三角波形源程序14
6.5方波源程序15
6.6波形选择模块源程序16
7参考文献17
1、主要功能
用VHDL语言设计一个多功能信号发生器,根据输入信号的选择可以输出递增锯齿波、正弦波、三角波、方波和以上四种波形的任意线性叠加等15种信号。
2、功能模块的划分
根据设计要求,信号发生器的结构框图如图2.1所示。
图2.1信号发生器的结构框图
其中信号产生模块将产生所需的各种信号,信号发生器的控制模块可以用数据选择器实现,用多选1数据选择器实现对15种信号的选择。
最后将波形数据送入D/A转换器,将数字信号转换为模拟信号输出。
用示波器测试D/A转换器的输出,可以观测到5种信号的输出。
3、主要功能的实现
3.1信号的产生模块
信号的产生可以利用计数器直接产生信号输出,当系统时钟输入后,通过复位开关选择是否产生波形
(1)递增锯齿波INCR的模块图如图3.1.1所示,其中CLK是输入时钟端口,RESET为输入复位端口,DOUT[7..0]为信号输出端口。
图3.1.1递增锯齿波INCR的模块图
(2)正弦波SINE的模块图如图3.1.2所示,其中CLK是输入时钟端口,RESET为输入复位端口,DOUT[7..0]为信号输出端口。
图3.1.2正弦波SINE的模块图
(3)三角波TRIA的模块图如图3.1.3所示,其中CLK是输入时钟端口,RESET为输入复位端口,DOUT[7..0]为信号输出端口。
图3.1.3三角波TRIA的模块图
(4)方波模块的RECT的模块图如图3.1.4所示,其中CLK是输入时钟端口,RESET为输入复位端口,DOUT[7..0]为信号输出端口。
图3.1.4方波RECT的模块图
3.2信号选择模块
信号选择模块是一个多选1的数据选择器,模块图如图3.2.1所示,其中SEL为波形数据选择端口,SEL[3..0]为4位二进制输入端口,DOUT[7..0]为8位二进制输出端口。
该模块可以根据外部开关的状态选择相应的波形输出
图3.2.1信号选择模块图
3.3系统的细化框图
图3.3.1系统的细化框图
3.4多功能信号发生器的RTL图
图3.4.1多功能信号发生器的RTL图
4程序的调试分析与仿真
复位信号RESET为低电平时输出,高电平为不输出,选择性分析
(1)第一次SEL选择值设为0001,输出为递增锯齿波,其仿真波形如图4.1.1所示。
图4.1.1递增锯齿波的仿真波形
(2)第二次SEL选择值设为0010,输出为正弦波,其仿真波形如图4.1.2所示。
图4.1.2递减锯齿波的仿真波形
(3)第三次SEL的值设为0100,输出为三角波,其仿真波形如图4.1.3所示。
图4.1.3三角波的仿真波形
(4)第三次SEL的值设为1000,输出为方波,其仿真波形如图4.1.4所示。
图4.1.4方波的仿真波形
(5)第三次SEL的值设为0011,输出为递增锯齿波和正弦波的叠加,其仿真波形如图4.1.5所示。
图4.1.5递增锯齿波和正弦波的叠加波形
(6)第三次SEL的值设为0101,输出为递增锯齿波和三角波的叠加,其仿真波形如图4.1.6所示。
图4.1.6递增锯齿波和三角波的叠加波形
(7)第三次SEL的值设为1001,输出为递增矩形波和方波的叠加,其仿真波形如图4.1.7所示。
图4.1.7递增矩形波和方波的叠加波形
(8)第三次SEL的值设为0110,输出为正弦波和三角波的叠加,其仿真波形如图4.1.8所示。
图4.1.8正弦波和三角波的叠加波形
(9)第三次SEL的值设为1010,输出为正弦波和方波的叠加,其仿真波形如图4.1.9所示。
图4.1.9正弦波和方波的叠加波形
(10)第三次SEL的值设为1100,输出为三角波和方波的叠加,其仿真波形如图4.1.10所示。
图4.1.10三角波和方波的叠加波形
(11)第三次SEL的值设为0111,输出为递增锯齿波、正弦波和三角波的叠加,其仿真波形如图4.1.11所示。
图4.1.11递增锯齿波、正弦波和三角波的叠加波形
(12)第三次SEL的值设为1011,输出为递增锯齿波、正弦波和方波的叠加,其仿真波形如图4.1.12所示。
图4.1.12递增锯齿波、正弦波和方波的叠加波形
(13)第三次SEL的值设为1101,输出为递增锯齿波、三角波和方波的叠加,其仿真波形如图4.1.13所示。
图4.1.13递增锯齿波、三角波和方波的叠加
(14)第三次SEL的值设为1110,输出为正弦波、三角波和方波的叠加,其仿真波形如图4.1.14所示。
图4.1.14正弦波、三角波和方波的叠加波形
(15)第三次SEL的值设为1111,输出为以上四种波行的叠加,其仿真波形如图4.1.15所示。
图4.1.15四种波行的叠加波形
5总结
由于EDA课本的相关内容是以前从未接触过的,再加上课时少,而且集中,导致了我对对内容的理解、吸收困难。
尽管老师对重要的知识点讲得很详细,但对我而言,很多知识只是听一遍,能够达到看得懂,却学不到.对于基本的知识,我还略晓一二,但要稍微有点变动,基本就不懂了.只能说是对着教材死记硬背。
所以,对于课设,我是一筹莫展。
无奈之下只好拿着别人的模块程序,然后再自己理解修改,不断的调试,联合同学的帮忙,程序总算才能运行.
课设已经是很多次了,尽管不熟练,尽管有些是在别人的帮忙之下才完成的,尽管每次都感叹课设好难自己平时没学好,但这几天的收获还是很大的,课设的几天是很充实的,脑子在不停的运转,虽说不懂,但在做的过程中,还是能学到很多东西.尽管只有短短的几天,但大家一起发现问题,讨论问题,解决问题.剩下的就是你要的知识,这种很互动的学习方式让我们实在是受益匪浅啊!
虽然得对着电脑半天,一天的做程序,有点累也有些晕,可是当看到劳动成果时,真是别有一番滋味在心头啊!
世上无难事,只怕有心人,的确如此。
做完这个程序最大的收获就是坚持真的很重要啊!
做完这个课程设计,我们的自信一下子提高了,我也会写些程序了;尽管对于有些人这种程序会很简单,可我的C实在是学的不怎么样,会另外一种也很不错啊!
因为享受劳动成果的滋味实在很美妙啊!
忙碌了几天,在大家的共同努力下,我们总算将此多功能信号发生器设计出来。
尽管不是自己独立完成,但仍然很高兴,因为在设计的过程中,让我了解到要设计一个大型程序,查找资料是至关重要的,在他人的基础上,再根据自己所学进行修改与调试,最后设计出自己想要的程序,这过程艰辛,但只要你持之以恒,成功指日可待。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才是真正的知识,才能提高自己的实际动手能力和独立思考的能力。
6附录
6.1主程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYXINHAOIS
PORT(CLK:
INSTD_LOGIC;
RESET:
INSTD_LOGIC;
SEL:
INSTD_LOGIC_VECTOR(3DOWNTO0);
DOUT:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDXINHAO;
ARCHITECTURETOPOFXINHAOIS
COMPONENTINCRIS
PORT(CLK:
INSTD_LOGIC;
RESET:
INSTD_LOGIC;
DOUT:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDCOMPONENTINCR;
COMPONENTSINEIS
PORT(CLK:
INSTD_LOGIC;
RESET:
INSTD_LOGIC;
DOUT:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDCOMPONENTSINE;
COMPONENTTRIAIS
PORT(CLK:
INSTD_LOGIC;
RESET:
INSTD_LOGIC;
DOUT:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDCOMPONENTTRIA;
COMPONENTRECTIS
PORT(CLK:
INSTD_LOGIC;
RESET:
INSTD_LOGIC;
DOUT:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDCOMPONENTRECT;
COMPONENTCHOIIS
PORT(SEL:
INSTD_LOGIC_VECTOR(3DOWNTO0);
D1,D2,D3,D4:
INSTD_LOGIC_VECTOR(7DOWNTO0);
DOUT:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDCOMPONENTCHOI;
SIGNALD1:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALD2:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALD3:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALD4:
STD_LOGIC_VECTOR(7DOWNTO0);
BEGIN
U1:
INCRPORTMAP(CLK=>CLK,RESET=>RESET,DOUT=>D1);
U2:
SINEPORTMAP(CLK=>CLK,RESET=>RESET,DOUT=>D2);
U3:
TRIAPORTMAP(CLK=>CLK,RESET=>RESET,DOUT=>D3);
U4:
RECTPORTMAP(CLK=>CLK,RESET=>RESET,DOUT=>D4);
U5:
CHOIPORTMAP(SEL=>SEL,D1=>D1,D2=>D2,D3=>D3,D4=>D4,DOUT=>DOUT);
ENDTOP;
6.2递增锯齿波形源程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYINCRIS
PORT(CLK:
INSTD_LOGIC;
RESET:
INSTD_LOGIC;
DOUT:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDINCR;
ARCHITECTUREONEOFINCRIS
BEGIN
PROCESS(CLK,RESET)
VARIABLEQ:
STD_LOGIC_VECTOR(7DOWNTO0);
BEGIN
IFRESET='1'THEN
Q:
="00000000";
ELSIFCLK'EVENTANDCLK='1'THEN
IFQ="11111111"THEN
Q:
="00000000";
ELSE
Q:
=Q+'1';
ENDIF;
ENDIF;
DOUT<=Q;
ENDPROCESS;
ENDONE;
6.3正弦波形源程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYSINEIS
PORT(CLK:
INSTD_LOGIC;
RESET:
INSTD_LOGIC;
DOUT:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDSINE;
ARCHITECTURETWOOFSINEIS
SIGNALCNT_VAL:
INTEGER;
BEGIN
U1:
PROCESS(CLK,RESET)
VARIABLECNT:
INTEGERRANGE0TO63;
BEGIN
IFRESET='1'THEN
CNT:
=0;
ELSIFCLK'EVENTANDCLK='1'THEN
IFCNT=63THEN
CNT:
=0;
ELSE
CNT:
=CNT+1;
ENDIF;
ENDIF;
CNT_VAL<=CNT;
ENDPROCESSU1;
U2:
PROCESS(CNT_VAL)
BEGIN
CASECNT_VALIS
WHEN0=>DOUT<="11111111";
WHEN1=>DOUT<="11111110";
WHEN2=>DOUT<="11111100";
WHEN3=>DOUT<="11111001";
WHEN4=>DOUT<="11110101";
WHEN5=>DOUT<="11101111";
WHEN6=>DOUT<="11101001";
WHEN7=>DOUT<="11100001";
WHEN8=>DOUT<="11011001";
WHEN9=>DOUT<="11001111";
WHEN10=>DOUT<="11001010";
WHEN11=>DOUT<="10111010";
WHEN12=>DOUT<="10101110";
WHEN13=>DOUT<="10100010";
WHEN14=>DOUT<="10010110";
WHEN15=>DOUT<="10001001";
WHEN16=>DOUT<="01111100";
WHEN17=>DOUT<="01110000";
WHEN18=>DOUT<="01100011";
WHEN19=>DOUT<="01010111";
WHEN20=>DOUT<="01001011";
WHEN21=>DOUT<="01000000";
WHEN22=>DOUT<="00110101";
WHEN23=>DOUT<="00101011";
WHEN24=>DOUT<="00100010";
WHEN25=>DOUT<="00011010";
WHEN26=>DOUT<="00010011";
WHEN27=>DOUT<="00001101";
WHEN28=>DOUT<="00001000";
WHEN29=>DOUT<="00000100";
WHEN30=>DOUT<="00000001";
WHEN31=>DOUT<="00000000";
WHEN32=>DOUT<="00000000";
WHEN33=>DOUT<="00000001";
WHEN34=>DOUT<="00000100";
WHEN35=>DOUT<="00001000";
WHEN36=>DOUT<="00001101";
WHEN37=>DOUT<="00010011";
WHEN38=>DOUT<="00011010";
WHEN39=>DOUT<="00100010";
WHEN40=>DOUT<="00101011";
WHEN41=>DOUT<="00110101";
WHEN42=>DOUT<="01000000";
WHEN43=>DOUT<="01001011";
WHEN44=>DOUT<="01010111";
WHEN45=>DOUT<="01100011";
WHEN46=>DOUT<="01110000";
WHEN47=>DOUT<="01111100";
WHEN48=>DOUT<="10001001";
WHEN49=>DOUT<="10010110";
WHEN50=>DOUT<="10100010";
WHEN51=>DOUT<="10101110";
WHEN52=>DOUT<="10111010";
WHEN53=>DOUT<="11000101";
WHEN54=>DOUT<="11001111";
WHEN55=>DOUT<="11011001";
WHEN56=>DOUT<="11100001";
WHEN57=>DOUT<="11101001";
WHEN58=>DOUT<="11101111";
WHEN59=>DOUT<="11110101";
WHEN60=>DOUT<="11111001";
WHEN61=>DOUT<="11111100";
WHEN62=>DOUT<="11111110";
WHEN63=>DOUT<="11111111";
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESSU2;
ENDTWO;
6.4三角波形源程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYTRIAIS
PORT(CLK:
INSTD_LOGIC;
RESET:
INSTD_LOGIC;
DOUT:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDTRIA;
ARCHITECTURETHREEOFTRIAIS
BEGIN
PROCESS(CLK,RESET)
VARIABLEQ:
STD_LOGIC_VECTOR(7DOWNTO0);
VARIABLESIGN:
STD_LOGIC;
BEGIN
IFRESET='1'THEN
Q:
="00000000";
SIGN:
='0';
ELSIFCLK'EVENTANDCLK='1'THEN
IFSIGN='0'THEN
IFQ="11111110"THEN
Q:
="11111111";
SIGN:
='1';
ELSE
Q:
=Q+'1';
ENDIF;
ELSE
IFQ="00000001"THEN
Q:
="00000000";
SIGN:
='0';
ELSE
Q:
=Q-'1';
ENDIF;
ENDIF;
ENDIF;
DOUT<=Q;
ENDPROCESS;
ENDTHREE;
6.5方波源程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYRECTIS
PORT(CLK:
INSTD_LOGIC;
RESET:
INSTD_LOGIC;
DOUT:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDRECT;
ARCHITECTUREFOUROFRECTIS
SIGNALSIGN:
STD_LOGIC;
BEGIN
U1:
PROCESS(CLK,RESET)
VARIABLEQ:
STD_LOGIC_VECTOR(7DOWNTO0);
BEGIN
IFRESET='1'THEN
Q:
="00000000";
SIGN<='0';
ELSIFCLK'EVENTANDCLK='1'THEN
IFQ="11111111"THEN
Q:
="00000000";
ELSE
Q:
=Q+'1';
ENDIF;
IFQ<="01000000"THEN
SIGN<='1';
ELSE
SIGN<='0';
ENDIF;
ENDIF;
ENDPROCESSU1;
U2:
PROCESS(CLK,SIGN)
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFSIGN='1'THEN
DOUT<="11111111";
ELSE
DOUT<="00000000";
ENDIF;
ENDIF;
ENDPROCESSU2;
ENDFOUR;
6.6波形选择模块源程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCHOIIS
PORT(SEL:
INSTD_LOGIC_VECTOR(3DOWNTO0);
D1,D2,D3,D4:
INSTD_LOGIC_VECTOR(7DOWNTO0);
DOUT:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDCHOI;
ARCHITECTUREFIVEOFCHOIIS
BEGIN
PROCESS(SEL)
BEGIN
CASESELIS
WHEN"0001"=>DOUT<=D1;
WHEN"0010"=>DOUT<=D2;
WHEN"0100"=>DOUT<=D3;
WHEN"1000"=>DOUT<=D4;
WHEN"0011"=>DOUT<=D1+D2;
WHEN"0101"=>DOUT<=D1+D3;
WHEN"1001"=>DOUT<=D1+D4;
WHEN"0110"=>DOUT<=D2+D3;
WHEN"1010"=>DOUT<=D2+D4;
WHEN"1100"=>DOUT<=D3+D4;
WHEN"0111"=>DOUT<=D1+D2+D3;
WHEN"1011"=>DOUT<=D1+D2+D4;
WHEN"1101"=>DOUT<=D1+D3+D4;
WHEN"1110"=>DOUT<=D2+D3+D4;
WHEN"1111"=>DOUT<=D1+D2+D3+D4;
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
ENDFIVE;
7参考文献