信号发生器的设计任务书福建工程学院.docx
《信号发生器的设计任务书福建工程学院.docx》由会员分享,可在线阅读,更多相关《信号发生器的设计任务书福建工程学院.docx(24页珍藏版)》请在冰点文库上搜索。
![信号发生器的设计任务书福建工程学院.docx](https://file1.bingdoc.com/fileroot1/2023-7/5/df42ac4a-1f3d-4d09-aa3b-dbb56a507ecd/df42ac4a-1f3d-4d09-aa3b-dbb56a507ecd1.gif)
信号发生器的设计任务书福建工程学院
福建工程学院
课程设计实验报告
专业信息科学与工程学院
班级11级
座号
姓名
日期2013.01.02
一、实验目的
1.掌握内部LPM-ROM模块的调用方法。
2.熟悉信号发生器的设计方法。
3.了解高速DA芯片TLC5602的工作原理。
二、实验内容
1.通过对AD转换芯片TLC5602的控制,输出预定的正弦波、三角波和方波和锯齿波信号。
2.通过拨动开关进行各种输出信号间的切换。
3.通过按键对输出波形的频率进行控制(分为频加和频减按键)。
4.能输出之前产生的各种波形间的叠加信号(16种叠加波形)。
5.使用数码管来显示当前输出信号的频率,通过LED灯来实现当前信号的指示。
6.对输出信号的参数能进行调节,此实验主要是对方波的占空比进行了调节。
三、实验原理
本实验要求使用开发平台上现有的并行D/A转换器TLC5602来产生四种频率可调的波形:
正弦波、方波、三角波、锯齿波。
锯齿波、三角波产生的原理比较简单,锯齿波我们可以采用0-255的循环加法计数器来实现,三角波采用0-255-0的循环加减法计数器来实现。
方波产生的原理是让计数器在0和255时各保持输出半个周期。
正弦波的产生比较复杂,一般采用查表法来实现,正弦表值可以用MATLAB,C等程序语言生成。
在一个周期取样点越多则输出的波形失真度越小,但是点越多存储正弦波表值所需要的空间就越大,编写就越复杂。
正弦波波形数据ROM可以由多种方式实现,如逻辑方式在FPGA中实现,或利用LPM-ROM来实现。
相比之下,LPM-ROM实现起来更快,更方便。
在这个实验中我们可将这四种波形的数据均放入LPM-ROM内,我们只需要对每种波形的起始地址进行控制即可实现对四种波形的控制输出。
系统基准始终选择24MHZ,通过分频器分频,将分频后的时钟信号送给各个波形产生模块的时钟输入口。
分频器的分频比由按键S1和S2控制,S1和S2未按下为初始分频,分频比为1:
(256*2*2*2*2*2*2*2*2)=1:
65536(即“inclk”最低频率为366HZ),S1每按下一次分频改变一次,为频率上调;S2每按下一次分频改变一次,为频率下调。
由于基准时钟确定,所以各分频时钟是确定的,所以可以用S1和S2同时控制译码显示电路,译码显示接到八位数码管显示当前频率(实现写好在译码ROM中)。
四个波形产生器也可看成一个ROM,一个周期256个采样点存在ROM里,其触发信号为“inclk”时钟信号。
四种波形信号全部送到选择叠加电路,波形选择叠加受控于sw1-4,四个拨码开关状态分别代表四个信号输入状态,如用“1”代表开“0”代表关,sw4&sw3&sw2&sw1=“1000”输出正弦波,sw4&sw3&sw2&sw1=“1100”输出正弦波与方波叠加后的信号,以此类推。
当前信号的类型通过LED灯显示。
选择叠加后的信号经过8位DA转换器,接到示波器上,可以直观地观察到输出信号的波形与频率等信息。
四、实验步骤
1.
电路系统框图
信号发生器逻辑电路系统框图
2.电路模块概述
本电路分为9个小模块:
分频模块、正弦波产生模块、方波产生模块、三角波产生模块、锯齿波产生模块、波形叠加模块、DA转换模块(实验板现成的)、LED灯指示模块与译码显示模块。
本设计的思想主要是将程序模块化,各个模块分开来设计,先设计各个模块的程序,然后采用例化语句将各个模块综合在一个SignalGenerator.vhd文件中,最终实现程序功能。
分频模块:
对基准频率进行分频操作,8分频
正弦波产生模块:
产生正弦波
方波产生模块:
产生方波
三角波产生模块:
产生三角波
锯齿波产生模块:
产生锯齿波
波形叠加模块:
可产生16种组合波形
DA转换模块:
DA转换
LED灯指示模块:
指示当前波形的类型
译码显示模块:
显示当前频率的大小
3.各模块之间的联系
五、仿真波形
六、硬件测试
波形类型LED指示灯方波波形显示
叠加后波形显示
数码管显示频率
七、总结
通过这次课程设计,初步掌握了利用VHDL语言设计系统的方法。
本次课程设计主要是利用VHDL语言进行多功能信号发生器的设计。
课程设计期间,对课本上学习到的理论知识得到了一个很好的应用。
设计之初,感觉到比较迷茫,无从下手。
但是通过网上查阅相关资料,觉得其实并没有想象中的那么难。
在多方面查阅资料之后,最终确立了设计方案。
设计完之后的电路,除了有基本功能外,添加了数码管显示频率、LED指示灯、频加频减控制按键、拨码开关控制波形叠加等功能。
设计期间,存在了很多疑惑,通过网上查阅资料和询问同学都得到了很好的解决。
总之,通过这次课程设计对硬件电路设计(VHDL)有了一个较深刻的认识。
八、附录
VHDL代码
SignalGenerator.vhd
-------------------------------------------------------------------------------------------------------
--FileName:
SignalGenerator.vhd
--Function:
采用例化语句综合各模块
--CreatedBy:
HZT
--CreatedData:
2013.12.25
--ModifyData:
-------------------------------------------------------------------------------------------------------
LIBRARYIEEE;--顶层设计
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYSignalGeneratorIS
PORT(
CLK:
INSTD_LOGIC;--时钟基准输入
P:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);--频率输出
LED:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);--LED灯显示开关状态
CLKOUT:
OUTSTD_LOGIC;--时钟脉冲输出
DOUT:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);--频率数据输出
WSEL:
OUTSTD_LOGIC_VECTOR(2DOWNTO0);--位选择
K1:
INSTD_LOGIC;--正弦波信号输出按键
K2:
INSTD_LOGIC;--方波信号输出按键
K3:
INSTD_LOGIC;--三角波信号输出按键
K4:
INSTD_LOGIC;--锯齿波信号输出按键
S1:
INSTD_LOGIC;--频加按键
S2:
INSTD_LOGIC--频减按键
);
ENDENTITYSignalGenerator;
ARCHITECTUREbehavOFSignalGeneratorIS
------------------------------正弦波声明------------------------------
COMPONENTSin
PORT(
ADDRESS:
INSTD_LOGIC_VECTOR(7DOWNTO0);--8位地址信号
INCLOCK:
INSTD_LOGIC;--地址锁存时钟
Q:
OUTSTD_LOGIC_VECTOR(7DOWNTO0)
);
ENDCOMPONENT;
------------------------------方波声明------------------------------
COMPONENTSquare
PORT(
ADDRESS:
INSTD_LOGIC_VECTOR(7DOWNTO0);--8位地址信号
INCLOCK:
INSTD_LOGIC;--地址锁存时钟
Q:
OUTSTD_LOGIC_VECTOR(7DOWNTO0)
);
ENDCOMPONENT;
------------------------------三角波声明------------------------------
COMPONENTTriangle
PORT(
ADDRESS:
INSTD_LOGIC_VECTOR(7DOWNTO0);--8位地址信号
INCLOCK:
INSTD_LOGIC;--地址锁存时钟
Q:
OUTSTD_LOGIC_VECTOR(7DOWNTO0)
);
ENDCOMPONENT;
------------------------------锯齿波声明------------------------------
COMPONENTSawtooth
PORT(
ADDRESS:
INSTD_LOGIC_VECTOR(7DOWNTO0);--8位地址信号
INCLOCK:
INSTD_LOGIC;--地址锁存时钟
Q:
OUTSTD_LOGIC_VECTOR(7DOWNTO0)
);
ENDCOMPONENT;
------------------------------显示声明------------------------------
COMPONENTDisplayIS
PORT(
DCLK:
INSTD_LOGIC;--分频时钟
DISOUT:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);--显示输出
SELD:
OUTSTD_LOGIC_VECTOR(2DOWNTO0);--位选
SELQ:
INSTD_LOGIC_VECTOR(2DOWNTO0)--频选
);
ENDCOMPONENT;
------------------------------信号定义------------------------------
SIGNALQ1:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALP1:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALP2:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALP3:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALP4:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALS_P:
STD_LOGIC_VECTOR(2DOWNTO0);--按键控制下分频信号
SIGNALQOUT:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALQIN:
STD_LOGIC;
SIGNALCOUNT:
INTEGERRANGE0TO1000000;
SIGNALC_CLK:
STD_LOGIC;--按键控制下时钟信号
SIGNALWAV_OVE:
STD_LOGIC_VECTOR(3DOWNTO0);--波形叠加信号
BEGIN
--------------------------------分频--------------------------------
PROCESS(CLK)
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IF(QOUT="11111111")THENQOUT<="00000000";
ELSEQOUT<=QOUT+1;
ENDIF;
ENDIF;
ENDPROCESS;
CLKOUT<=CLK;
------------------------------S1、S2按键消抖-------------------------
PROCESS(CLK,S1,S2)
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IF(S1='0'ORS2='0')THEN
IFCOUNT=1000000THENCOUNT<=COUNT;
ELSECOUNT<=COUNT+1;
ENDIF;
IFCOUNT=999999THENC_CLK<='0';
ELSEC_CLK<='1';
ENDIF;
ELSECOUNT<=0;
ENDIF;
ENDIF;
ENDPROCESS;
-----------------------------按键控制频加频减-----------------------
PROCESS(C_CLK,S1,S2)
BEGIN
IF(C_CLK'EVENTANDC_CLK='1')THEN
IFS1='1'THEN--当按下S1时频率加
S_P<=S_P+1;
IFS_P="111"THENS_P<="000";--当频率为"111"时,恢复为"000"
ENDIF;
ENDIF;
IFS2='1'THEN--当按下S2时频率减
S_P<=S_P-1;
IFS_P="000"THENS_P<="111";--当频率为"000"时,恢复为"111"
ENDIF;
ENDIF;
ENDIF;
ENDPROCESS;
-----------------------------按键控制下分频表------------------------
PROCESS(S_P)
BEGIN
CASES_PIS
WHEN"000"=>QIN<=QOUT(7);--366HZ(24MHZ/256*2)
WHEN"001"=>QIN<=QOUT(6);--732HZ(24MHZ/256*2*2)
WHEN"010"=>QIN<=QOUT(5);--1.46HZ(24MHZ/256*2*2*2)
WHEN"011"=>QIN<=QOUT(4);--2.93KHZ(24MHZ/256*2*2*2*2)
WHEN"100"=>QIN<=QOUT(3);--5.86KHZ(24MHZ/256*2*2*2*2*2)
WHEN"101"=>QIN<=QOUT
(2);--11.72KHZ(24MHZ/256*2*2*2*2*2*2)
WHEN"110"=>QIN<=QOUT
(1);--23.44KHZ(24MHZ/256*2*2*2*2*2*2*2)
WHEN"111"=>QIN<=QOUT(0);--46.88KHZ(24MHZ/256*2*2*2*2*2*2*2*2)
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
--------------------------------分频后频率---------------------------
PROCESS(QIN)
BEGIN
IFQIN'EVENTANDQIN='1'THENQ1<=Q1+1;
ENDIF;
ENDPROCESS;
--------------------------------例化---------------------------------
U1:
SinPORTMAP(ADDRESS=>Q1,Q=>P1,INCLOCK=>CLK);--正弦波例化
U2:
SquarePORTMAP(ADDRESS=>Q1,Q=>P2,INCLOCK=>CLK);--方波例化
U3:
TrianglePORTMAP(ADDRESS=>Q1,Q=>P3,INCLOCK=>CLK);--三角波波例化
U4:
SawtoothPORTMAP(ADDRESS=>Q1,Q=>P4,INCLOCK=>CLK);--锯齿波例化
U5:
DisplayPORTMAP(DCLK=>CLK,DISOUT=>DOUT,SELD=>WSEL,SELQ=>S_P);--显示例化
WAV_OVE<=K1&K2&K3&K4;
----------------------------------波形叠加----------------------------
PROCESS(K1,K2,K3,K4)
BEGIN
CASEWAV_OVEIS
WHEN"0000"=>P<="ZZZZZZZZ";LED<="0000";
WHEN"0001"=>P<=P1;LED<="0001";
WHEN"0010"=>P<=P2;LED<="0010";
WHEN"0011"=>P<=(TO_STDLOGICVECTOR(TO_BITVECTOR(P1)SRL1))+(TO_STDLOGICVECTOR(TO_BITVECTOR(P2)SRL1));LED<="0011";
WHEN"0100"=>P<=P3;LED<="0100";
WHEN"0101"=>P<=(TO_STDLOGICVECTOR(TO_BITVECTOR(P1)SRL1))+(TO_STDLOGICVECTOR(TO_BITVECTOR(P3)SRL1));LED<="0101";
WHEN"0110"=>P<=(TO_STDLOGICVECTOR(TO_BITVECTOR(P2)SRL1))+(TO_STDLOGICVECTOR(TO_BITVECTOR(P3)SRL1));LED<="0110";
WHEN"0111"=>P<=(TO_STDLOGICVECTOR(TO_BITVECTOR(P1)SRL2))+(TO_STDLOGICVECTOR(TO_BITVECTOR(P2)SRL2))+(TO_STDLOGICVECTOR(TO_BITVECTOR(P3)SRL2));LED<="0111";
WHEN"1000"=>P<=P4;LED<="1000";
WHEN"1001"=>P<=(TO_STDLOGICVECTOR(TO_BITVECTOR(P1)SRL1))+(TO_STDLOGICVECTOR(TO_BITVECTOR(P4)SRL1));LED<="1001";
WHEN"1010"=>P<=(TO_STDLOGICVECTOR(TO_BITVECTOR(P2)SRL1))+(TO_STDLOGICVECTOR(TO_BITVECTOR(P4)SRL1));LED<="1010";
WHEN"1011"=>P<=(TO_STDLOGICVECTOR(TO_BITVECTOR(P1)SRL2))+(TO_STDLOGICVECTOR(TO_BITVECTOR(P2)SRL2))+(TO_STDLOGICVECTOR(TO_BITVECTOR(P4)SRL2));LED<="1011";
WHEN"1100"=>P<=(TO_STDLOGICVECTOR(TO_BITVECTOR(P3)SRL1))+(TO_STDLOGICVECTOR(TO_BITVECTOR(P4)SRL1));LED<="1100";
WHEN"1101"=>P<=(TO_STDLOGICVECTOR(TO_BITVECTOR(P1)SRL2))+(TO_STDLOGICVECTOR(TO_BITVECTOR(P3)SRL2))+(TO_STDLOGICVECTOR(TO_BITVECTOR(P4)SRL2));LED<="1101";
WHEN"1110"=>P<=(TO_STDLOGICVECTOR(TO_BITVECTOR(P2)SRL2))+(TO_STDLOGICVECTOR(TO_BITVECTOR(P3)SRL2))+(TO_STDLOGICVECTOR(TO_BITVECTOR(P4)SRL2));LED<="1110";
WHEN"1111"=>P<=(TO_STDLOGICVECTOR(TO_BITVECTOR(P1)SRL2))+(TO_STDLOGICVECTOR(TO_BITVECTOR(P2)SRL2))+(TO_STDLOGICVECTOR(TO_BITVECTOR(P3)SRL2))+(TO_STDLOGICVECTOR(TO_BITVECTOR(P4)SRL2));LED<="1111";
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
ENDbehav;
Display.vhd
--------------------------------------------数码管显示对照表-------------------------------------