基于vhdl 的简单信号发生器的设计综述.docx
- 文档编号:29433874
- 上传时间:2023-07-23
- 格式:DOCX
- 页数:25
- 大小:512.82KB
基于vhdl 的简单信号发生器的设计综述.docx
《基于vhdl 的简单信号发生器的设计综述.docx》由会员分享,可在线阅读,更多相关《基于vhdl 的简单信号发生器的设计综述.docx(25页珍藏版)》请在冰豆网上搜索。
基于vhdl的简单信号发生器的设计综述
目录
设计任务及要求1
1、设计目的2
2、设计的主要内容和要求2
3、整体设计方案2
4、方案选择3
5、具体实现设计3
5.1正弦波的波形的产生3
5.2四种LPM_ROM的调用7
5.3四种波形的输出选择8
5.4输出频率的选择9
5.5数码管频率显示10
5.6D/A的控制10
6、引脚锁定系统仿真和下载测试10
6.1LPM_ROM的仿真10
6.2引脚设置11
6.3系统总逻辑仿真(基于signaltap)11
7、使用说明12
7.1各相关元件符号名称12
7.2使用方法12
8、总结13
参考文献14
《VHDL与数字系统设计》课程设计
设计题目:
简单信号发生器的设计
院系:
电子信息与电气工程系
专业:
电子科学与技术
班级:
电科
学生姓名:
学号:
指导教师:
201年月日
设计任务及要求
本课程设计主要是利用VHDL语言设计一个信号发生器,要求实现以下功能:
1.信号发生器的控制模块可以用数据选择器实现,用4选1数据选择器实现对四种信号的输出进行选择。
2.根据输入信号的选择可以产生周期性输出正弦波、方波、三角波、锯齿波四种波形信号。
3.将波形数据送入D/A转换器,将数字信号转换为模拟信号输出,用示波器测试D/A转换器的输出,可以观测到4种信号的输出。
4.实现根据不同输入输出不同频率输出的功能,并且能把频率显示到数码管上。
5.实现多种波形的叠加功能。
6.实现波形幅度的增加功能。
7.上面的1,2,3这三点要求是基本要求,而4,5,6是本次课程设计的发挥部分。
1、设计目的
1)掌握使用EDA工具设计信号发生器系统的设计思路和设计方法,体会使用EDA综合过程中电路设计方法和设计思路的不同,理解层次化设计理念。
2)熟悉在QuartusII环境中,用文本输入方式与原理图输入方式完成电路的设计,同时掌握使用这两种方式相结合的EDA设计思路。
3)通过这一部分的学习,对VHDL的设计方法进行进一步的学习,对其相关语言设计规范进行更深层次的掌握,能够更加熟练的做一些编程设计。
2、设计的主要内容和要求
通过使用VHDL语言及QuartusII软件,设计多功能信号发生器的每个模块,将正弦波模块,方波模块,三角波模块,锯齿波模块创建相应的元件,同时设计好4选1数据选择器模块,再通过例化连接语句或图形输入的方式,将各个模块组合起来,设计成一个完整的多种信号发生器电路,同时将各个模块单独进行仿真,设计各个模块的仿真波形,最后进行总原理图电路仿真,设计该信号发生器的总的仿真波形,然后进行下载,然后用硬件电路调试。
信号发生器:
实现四种波形的转换。
根据题目的分析与整体构思可知,要完成设计任务必须完成以下要求:
1、设计好用于总电路设计的各个信号输出模块;
2、设计好用于波形切换的四路数据选择器;
3、设计好用于频率切换的分频电路;
4、设计好用于数码管显示的动态扫描电路;
5、设计好用于波形叠加的选择电路;
6、设计好数模(D/A)转换。
3、整体设计方案
基本设计方案:
在现有多路选择器的基础上,加上其它信号模块,通过组合与设计,用数模转换器(D/A)将选中的信号源发出的信号由数字信号转换为模拟信号,再用示波器显示出来,其信号发生器的基本结构框图如图所示。
信号发生器由各个单一信号模块组合而成,其中信号产生模块将产生所需的各种信号,信号发生器的控制模块可以用数据选择器实现,用4选1数据选择器实现对四种信号的选择。
最后将波形数据送入D/A转换器,将数字信号转换为模拟信号输出。
用示波器测试D/A转换器的输出,可以观测到4种信号的输出。
图信号发生器结构框图
最后,在前面模块做好的基础上再考虑如何输出波形的问题,通过对四种波形采样就可以得到。
总体功能框图
4、方案选择
4.1各波形数据模块实现方式
①.VHDL模块各自调用:
这种方法看起来比较明了,很容易知道自己写了什么,但是正弦波,锯齿波这些波形的数据切换都要自己查表自己输入进vhdl文本中去,这样不仅费时费力,而且很容易出错,一旦出错,很难找出错误的所在,总的来说不是一个很好的方案。
②.LPM_ROM调用:
LPM,即参数化模块库(LibraryofParameterizedModules),是Altera公司FPGA/CPLD设计软件QuartusII自带的一些宏功能模块,功能非常强大,很容易满足我们的要求,我们只要建立一个ROM模块,并且把数据文件导入进去就可以很简单的做出一个我们需要的宏模块。
很明显要选LPM_ROM作为解决方案,这样我们要分别做四种波形的ROM。
4.2各模块连接方式
①.图形连接输入:
这种方法简单明了,不过只适合小型工程,对于大工程不能使用图形输入。
②.VHDL文本的例化连接:
例化连接使用COMPONENT等语句直接可以连接映射,更能直接表现出各引脚的连接方式。
所以用VHDL文本例化连接。
5、具体实现设计
5.1正弦波的波形的产生
我们用调用mif的方式来实现LPM_ROM的具体功能,这里我们不需要写任何一行代码,具体方法如下:
1、打开向导工具tools→MegaWizardPlug-inManager
2、选择ROM,选择VHDL,并且输入名称
3、选择双时钟输入,选择采样字节数
4、把输出时钟取消掉,只剩下一个inclock
5、选着生成的nif文件,mif中存在需要输出波形数据
6、点击finish,这样我们的一个正弦波LPM_ROM就做好了
这样我们一行代码也没写,却做到了很多功能,这效率是要提前完工的节奏啊,可喜可贺啊!
mif文件也是这样生成的:
感谢杭州康芯电子公司提供的mifmaker!
打开mifmaker→设置全局参数→选择正弦波→保存为mif→可以用来输入了!
通过这种方式我们连续再做三次,就得到了能输出数据分别是正弦波、方波、三角波和锯齿波的元件,只要在最顶层文件中调用就可以了!
!
5.2四种LPM_ROM的调用
在最高层文件中调用这四种LPM_ROM,因为每个ROM都生成了自己相对应的vhd文件,所以我们直接调用就ok啦,具体实现代码如下:
这是这四种LPM_ROM的声明部分
这是这四种LPM_ROM的调用例化管脚映射部分
5.3四种波形的输出选择
用K1,K2来控制选着输出具体的哪一种波形
5.4输出频率的选择
用K3,K4,K5来控制选择输出频率,具体代码如下:
5.5数码管频率显示
调用我们之前例化好的一个动态显示元件display,元件代码见附录二
5.6D/A的控制
由于实验箱只有一个时钟,所以把时钟分频后连接入LPM_ROM的时钟,不分频的直接接入D/A模块时钟,用这种方式就能达到DAC正常输出目的波形的效果。
6、引脚锁定系统仿真和下载测试
6.1LPM_ROM的仿真
以正弦波为例,dout是查mif得出的值
6.2引脚设置
6.3系统总逻辑仿真(基于signaltap)
7、使用说明
7.1各相关元件符号名称
名称
功能
SIN
正弦波信号发生
SQUAR
方波信号发生
SANJIAO
三角波信号发生
JU
锯齿波信号发生
DISP
综合波形选择以及频率选择
DISPLAY
数码管动态扫描
7.2使用方法
K1,K2的调节方式如下
选择值
对应输出波形
00
正弦波
01
方波
10
三角波
11
锯齿波
K3,K4,K5的调节方式如下
选择值
对应输出频率
000
93.75KHz
001
46.88KHz
010
23.44KHz
011
11.72KHz
100
5.86KHz
101
2.93KHz
110
1.46KHz
111
732Hz
8、总结
参考文献
[1]潘松,黄继业.EDA技术实用教程(第四版)[M].科学出版社,2010
[2]江国强.EDA技术与应用(第3版)[M].电子工业出版社,2010
[3]J.Bhasker著,徐振林等译.VerilogHDL硬件描述语言.北京:
机械工业出版社,2000
[4]卢杰,赖毅.VHDL与数字电路设计.北京:
科学出版社,2001
[5]张昌凡,龙永红,彭涛.可编程逻辑器件及VHDL设计技术.广州:
华南工学院出版社,2001
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
----*******************************----
entityDISPis
port(clk:
instd_logic;--这是时钟输入
dout:
outstd_logic_vector(7downto0);--输出给AD
Pout:
outstd_logic_vector(7downto0);--段码
WS:
outstd_logic_vector(2downto0);--位选
CLKOUT:
OUTstd_logic;--clk直接输出给DA
K1:
instd_logic;--拨动开关12,用来选信号种类
K2:
instd_logic;
K3:
instd_logic;--拨动开关345,用来选信号频率
K4:
instd_logic;
K5:
instd_logic);
endDISP;
architecturebehavofDISPis
----*******************************----
componentSIN--这是正弦波
port(address:
instd_logic_vector(6downto0);
inclock:
instd_logic;
q:
outstd_logic_vector(7downto0));
endcomponent;
----*******************************----
componentSQUAR--这是方波
port(address:
instd_logic_vector(6downto0);
inclock:
instd_logic;
q:
outstd_logic_vector(7downto0));
endcomponent;
----*******************************----
componentSANJIAO--这是三角波
port(address:
instd_logic_vector(6downto0);
inclock:
instd_logic;
q:
outstd_logic_vector(7downto0));
endcomponent;
----*******************************----
componentJU--这是锯齿波
port(address:
instd_logic_vector(6downto0);
inclock:
instd_logic;
q:
outstd_logic_vector(7downto0));
endcomponent;
----*******************************----
componentdisplay--这是数码管显示功能的例化声明
port(dclk:
instd_logic;
disout:
outstd_logic_vector(7downto0);--显示输出
seld:
outstd_logic_vector(2downto0);--位选
selq:
instd_logic_vector(2downto0));--频率选择
endcomponent;
----*******************************----
signalq1:
std_logic_vector(6downto0);--地址寻址
signalDOUT1:
std_logic_vector(7downto0);--用来输出各种波形
signalDOUT2:
std_logic_vector(7downto0);
signalDOUT3:
std_logic_vector(7downto0);
signalDOUT4:
std_logic_vector(7downto0);
signalSLE:
std_logic_vector(1downto0);--信号选择
signalFRE:
std_logic_vector(2downto0);--频率选择
signalQout:
std_logic_vector(7downto0);--clk分频
signalQin:
std_logic;--clk分频后输出
begin
----*******************************----
p0:
process(clk)--24Mhz
begin
ifclk'eventandclk='1'then
if(Qout="11111111")thenQout<="00000000";
elseQout<=Qout+1;
endif;
endif;
endprocess;
----*******************************----
CLKOUT<=clk;--DADADADADAD
----*******************************----
FRE<=K3&K4&K5;
p1:
process(FRE)
BEGIN
CASEFREIS
WHEN"000"=>qin<=qout(7);--732hz
WHEN"001"=>qin<=qout(6);
WHEN"010"=>qin<=qout(5);
WHEN"011"=>qin<=qout(4);
WHEN"100"=>qin<=qout(3);
WHEN"101"=>qin<=qout
(2);
WHEN"110"=>qin<=qout
(1);
WHEN"111"=>qin<=qout(0);--93.7k
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
----*******************************----
P2:
process(qin)
begin
ifqin'eventandqin='1'thenq1<=q1+1;
endif;
ENDPROCESS;
----*******************************----
u1:
SINportmap(address=>q1,q=>dout1,inclock=>qin);
u2:
SQUARportmap(address=>q1,q=>dout2,inclock=>qin);
u3:
SANJIAOportmap(address=>q1,q=>dout3,inclock=>qin);
u4:
JUportmap(address=>q1,q=>dout4,inclock=>qin);
U5:
DISPLAYportmap(dclk=>CLK,disout=>pout,seld=>ws,selq=>FRE);
----*******************************----
SLE<=K1&K2;
P3:
process(SLE)
BEGIN
CASESLEIS
WHEN"00"=>DOUT<=dout1;
WHEN"01"=>DOUT<=dout2;
WHEN"10"=>DOUT<=dout3;
WHEN"11"=>DOUT<=dout4;
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
endbehav;
--*****动态显示********动态显示*******动态显示******动态显示************
--*****动态显示********动态显示*******动态显示******动态显示************
--*****动态显示********动态显示*******动态显示******动态显示************
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitydisplayis
port(
dclk:
instd_logic;
disout:
outstd_logic_vector(7downto0);--显示输出
seld:
outstd_logic_vector(2downto0);--位选
selq:
instd_logic_vector(2downto0));--频率选择
endentity;
architecturebehaveofdisplayis
signaldclk1:
std_logic;
signalc:
std_logic_vector(7downto0);
signaldis:
std_logic_vector(2downto0);
begin
process(dclk)
begin
ifdclk'eventanddclk='1'then
c<=c+1;
endif;
endprocess;
process(c
(2))--dclk8分频
begin
ifc
(2)'eventandc
(2)='1'then
dis<=dis+1;
endif;
seld<=dis;
endprocess;
process(selq)
begin
caseselqis
when"111"=>
casedisis--93.75KHz
when"000"=>disout<="00000000";
when"001"=>disout<="01101111";
when"010"=>disout<="11001111";
when"011"=>disout<="00000111";
when"100"=>disout<="01101101";
when"101"=>disout<="01110111";
when"110"=>disout<="01110110";
when"111"=>disout<="01011011";
endcase;
when"110"=>--46.88KHz
casedisis
when"000"=>disout<="00000000";
when"001"=>disout<="01100110";
when"010"=>disout<="11111101";
when"011"=>disout<="01111111";
when"100"=>disout<="01111111";
when"101"=>disout<="01110111";
when"110"=>disout<="01110110";
when"111"=>disout<="01011011";
endcase;
when"101"=>--23.44KHz
casedisis
when"000"=>disout<="00000000";
when"001"=>disout<="01011011";
when"010"=>disout<="11001111";
when"011"=>disout<="01100110";
when"100"=>disout<="01100110";
when"101"=>disout<="01110111";
when"110"=>disout<="01110110";
when"111"=>disout<="01011011";
endcase;
when"100"=>--11.72KHz
casedisis
when"000"=>disout<="00000000";
when"001"=>disout<="00000110";
when"010"=>disout<="10000110";
when"011"=>disout<="00000111";
when"100"=>disout<="01011011";
when"101"=>disout<="01110111";
when"110"=>disout<="01110110";
when"111"=>disout<="01011011";
endcase;
when"011"=>--5.86KHz
casedisis
when"000"=>disout<="00000000";
when"001"=>disout<="00000000";
when"010"=>disout<="11101101";
when"011"=>disout<="01111111";
when"100"=>disout<="01111101";
when"101"=>disout<="01110111";
when"110"=>disout<="01110110";
when"111"=>disout<="01011011";
endcase;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于vhdl 的简单信号发生器的设计综述 基于 vhdl 简单 信号发生器 设计 综述