基于VHDL语言正弦波信号发生器EDA实训报告.docx

上传人:b****2 文档编号:16987661 上传时间:2023-07-21 格式:DOCX 页数:15 大小:381KB
下载 相关 举报
基于VHDL语言正弦波信号发生器EDA实训报告.docx_第1页
第1页 / 共15页
基于VHDL语言正弦波信号发生器EDA实训报告.docx_第2页
第2页 / 共15页
基于VHDL语言正弦波信号发生器EDA实训报告.docx_第3页
第3页 / 共15页
基于VHDL语言正弦波信号发生器EDA实训报告.docx_第4页
第4页 / 共15页
基于VHDL语言正弦波信号发生器EDA实训报告.docx_第5页
第5页 / 共15页
基于VHDL语言正弦波信号发生器EDA实训报告.docx_第6页
第6页 / 共15页
基于VHDL语言正弦波信号发生器EDA实训报告.docx_第7页
第7页 / 共15页
基于VHDL语言正弦波信号发生器EDA实训报告.docx_第8页
第8页 / 共15页
基于VHDL语言正弦波信号发生器EDA实训报告.docx_第9页
第9页 / 共15页
基于VHDL语言正弦波信号发生器EDA实训报告.docx_第10页
第10页 / 共15页
基于VHDL语言正弦波信号发生器EDA实训报告.docx_第11页
第11页 / 共15页
基于VHDL语言正弦波信号发生器EDA实训报告.docx_第12页
第12页 / 共15页
基于VHDL语言正弦波信号发生器EDA实训报告.docx_第13页
第13页 / 共15页
基于VHDL语言正弦波信号发生器EDA实训报告.docx_第14页
第14页 / 共15页
基于VHDL语言正弦波信号发生器EDA实训报告.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于VHDL语言正弦波信号发生器EDA实训报告.docx

《基于VHDL语言正弦波信号发生器EDA实训报告.docx》由会员分享,可在线阅读,更多相关《基于VHDL语言正弦波信号发生器EDA实训报告.docx(15页珍藏版)》请在冰点文库上搜索。

基于VHDL语言正弦波信号发生器EDA实训报告.docx

基于VHDL语言正弦波信号发生器EDA实训报告

EDA实训报告

 

学生姓名:

XXX学号:

XXXXXXXXXXXX

学院:

理工学院

专业:

电子科学与技术

题目:

基于FPGA的正弦波发生器

*****************************

 

2013年1月

课程设计成绩评定表

学生姓名

XXX

学号

0XXXXX

成绩

专业班级

电子科学与技术

起止时间

设计题目

基于FPGA的正弦波发生器

 

指导教师:

安国臣

年月日

基于FPGA的正弦波发生器

摘要:

本设计结合了EDA技术和直接数字频率合成(DDS)技术。

EDA技术是现代电子设计技术的核心,是以电子系统设计为应用方向的电子产品自动化的设计技术。

DDS技术则是最为先进的频率合成技术,具有频率分辨率高、频率切换速度快、相位连续、输出相位噪声低等诸多优点。

本文在对现有DDS技术的大量文献调研的基础上,提出了符合FPGA结构的正弦信号发生器设计方案并利用MAXPLUSⅡ软件进行了设计实现。

文中介绍了EDA技术相关知识,同时阐述了DDS技术的工作原理、电路结构,及设计的思路和实现方法。

经过仿真测试,设计达到了技术要求。

关键词:

现场可编程门阵列(FPGA);直接数字频率合成(DDS);正弦波信号发生器

一、DDS的基本原理

正弦波信号发生器是由地址发生器和正弦波数据存储器ROM两块构成,输入为时钟脉冲,输出为8位二进制。

1.地址发生器的原理

地址发生器实质上就是计数器,ROM的地址是6位数据,相当于64位循环计数器。

2.只读存储器ROM的设计

(1)、VHDL编程的实现

①基本原理:

为每一个存储单元编写一个地址,只有地址指定的存储单元才能与公共的I/O相连,然后进行存储数据的读写操作。

②逻辑功能:

地址信号的选择下,从指定存储单元中读取相应数据。

直接数字频率合成器(DDFS)的基本原理:

DDS是利用采样定理,根据相位间隔对正弦信号进行取样、量化、编码,然后储存在EPROM中构成一个正弦查询表,通过查表法产生波形。

它是由参考时钟、相位累加器、正弦查询表和D/A转换器组成,如图1所示。

图1直接数字频率合成器原理框图

相位累加器由N位加法器与N位累加寄存器级联构成,其原理框图如图2所示。

每来一个时钟脉冲Fc,N位加法器将频率控制数据K与累加寄存器输出的累加相位数据相加,把相加后的结果Y送至累加寄存器的输入端。

累加寄存器一方面将在上一时钟周期作用后所产生的新的相位数据反馈到加法器的输入端,以使加法器在下一时钟的作用下继续与频率控制数据K相加;另一方面以相加后的结果形成正弦查询表的地址,取出表中与该相位对应的单元中的幅度量化正弦函数值,作为取样地址值送入幅度/相位转换电路。

这样就可把存储在波形存储器内的波形抽样值(二进制编码)经查找表查出,完成相位到幅值转换。

波形存储器的输出送到D/A转换器,D/A转换器将数字量形式的波形幅值转换成所要求合成频率的模拟量形式信号。

图2相位累加器原理框图

由此可以看出,相位累加器在每一个时钟脉冲输入时,把频率控制字累加一次,相位累加器输出的数据就是合成信号的相位。

当相位累加器加满量时就会产生一次溢出,溢出频率就是DDS输出的信号频率。

相位累加器的最大计数长度与正弦查询表中所存储的相位分隔点数相同,在取样频率(由参考时钟频率决定)不变的情况下,由于相位累加器的相位增量不同,将导致一周期内的取样点数不同,输出信号的频率也相应变化。

如果设定累加器的初始相位,则可以对输出信号进行相位控制。

由采样原理可知,如果使用两个相同的频率合成器,并使其参考时钟相同,同时设定相同的频率控制字、不同的初始相位,那么在原理上就可以实现输出两路具有一定相位差的同频信号。

二、设计方案

1.基于VHDL编程的设计

在地址信号的选择下,从指定存储单元中读取相应数据

系统框图如下:

 

2、总体设计框图

信号发生器结构框图

三、原理图

1、顶层原理图

四、VHDL编程的实现

1、顶层文件

libraryieee;

useieee.std_logic_1164.all;

entitysinis

port(clk:

instd_logic;

b:

instd_logic_vector(15downto0);

qout:

outstd_logic_vector(6downto0);

sel_out:

outstd_logic_vector(3downto0);

q:

outstd_logic_vector(7downto0));

end;

architecturebhvofsinis

componentsine

port(clk:

instd_logic;

div_set:

instd_logic_vector(15downto0);

qout:

outstd_logic_vector(7downto0)

);

endcomponent;

componentseg_out

port(ins:

instd_logic_vector(3downto0);

outs:

outstd_logic_vector(6downto0));

endcomponent;

componentsel

port(clk:

instd_logic;

qin:

instd_logic_vector(15downto0);

qout:

outstd_logic_vector(3downto0);

sel_out:

outstd_logic_vector(3downto0));

endcomponent;

signalse:

std_logic_vector(3downto0);

begin

u1:

sineportmap(clk,b,q);

u2:

seg_outportmap(se,qout);

u3:

selportmap(clk,b,se,sel_out);

end;

2、rom设计

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

useieee.std_logic_arith.all;

entitysineis

port(clk:

instd_logic;

div_set:

instd_logic_vector(15downto0);

qout:

outstd_logic_vector(7downto0)

);

end;

architecturebhvofsineis

signaladdr:

std_logic_vector(5downto0);

signalcnt:

std_logic_vector(15downto0);

signalclk_temp:

std_logic;

typememoryisarray(0to63)ofstd_logic_vector(7downto0);

constantrom:

memory:

=("10000000","10001100","10011001","10100101","10110001","10111100","11000111","11010001","11011011","11100011","11101011","11110001","11110110","11111010","11111101","11111111","11111111","11111110","11111100","11111000","11110100","11101110","11100111","11011111","11010110","11001100","11000010","10110111","10101011","10011111","10010011","10000110","01111001","01101101","01100000","01010100","01001000","00111101","00110011","00101001","00100000","00011000","00010001","00001011","00000111","00000011","00000001","00000000","00000000","00000010","00000101","00001001","00001110","00010100","00011100","00100100","00101110","00111000","01000011","01001110","01011010","01100110","01110011","01111111");

begin

fre:

process(clk)

begin

ifrising_edge(clk)then

ifcnt=div_setthencnt<="0000000000000000";clk_temp<='1';

elsecnt<=cnt+1;clk_temp<='0';

endif;

endif;

endprocess;

p1:

process(clk_temp)

begin

ifrising_edge(clk_temp)then

ifaddr="111111"thenaddr<="000000";

elseaddr<=addr+1;

endif;

endif;

endprocess;

main:

process(addr)

variabletemp:

integerrange0to63;

begin

temp:

=conv_integer(addr);

qout<=rom(temp);

endprocess;

end;

3、7段数码管动态显示

3.1、片选

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityselis

port(clk:

instd_logic;

qin:

instd_logic_vector(15downto0);

qout:

outstd_logic_vector(3downto0);

sel_out:

outstd_logic_vector(3downto0));

end;

architecturebhvofselis

signalcnt:

std_logic_vector(5downto0);

signalsel_temp:

integerrange0to4;

signalclk_temp:

std_logic;

signalqin_temp1,qin_temp2:

std_logic_vector(15downto0);

begin

p1:

process(clk)

begin

ifrising_edge(clk)then

ifcnt="111111"thencnt<="000000";clk_temp<='1';

elsecnt<=cnt+1;clk_temp<='0';

endif;

endif;

endprocess;

p2:

process(clk_temp)

begin

ifsel_temp=4thensel_temp<=0;

elsifrising_edge(clk_temp)then

sel_temp<=sel_temp+1;

endif;

endprocess;

p3:

process(sel_temp,qin)

begin

casesel_tempis

when0=>sel_out<="0001";qout<=qin(3downto0);

when1=>sel_out<="0010";qout<=qin(7downto4);

when2=>sel_out<="0100";qout<=qin(11downto8);

when3=>sel_out<="1000";qout<=qin(15downto12);

whenothers=>sel_out<="0000";

endcase;

endprocess;

endarchitecture;

3.2、7段数码管显示

libraryieee;

useieee.std_logic_1164.all;

entityseg_outis

port(ins:

instd_logic_vector(3downto0);

outs:

outstd_logic_vector(6downto0));

end;

architecturebhvofseg_outis

signaltemp:

std_logic_vector(3downto0);

begin

process(ins)

begin

caseinsis

when"0000"=>outs<="1111110";--显示0

when"0001"=>outs<="0110000";--显示1

when"0010"=>outs<="1101101";-----2

when"0011"=>outs<="1111001";-----3

when"0100"=>outs<="0110011";-----4

when"0101"=>outs<="1011011";-----5

when"0110"=>outs<="1011111";-----6

when"0111"=>outs<="1110000";-----7

when"1000"=>outs<="1111111";-----8

when"1001"=>outs<="1111011";-----9

when"1010"=>outs<="1110111";-----A

when"1011"=>outs<="0011111";-----B

when"1100"=>outs<="1001110";-----C

when"1101"=>outs<="0111101";-----D

when"1110"=>outs<="1001111";-----E

when"1111"=>outs<="1000111";-----F

whenothers=>null;

endcase;

endprocess;

end;

四、波形仿真结果

1、实验箱的引脚配

2、一些相关设计

3、利用VHDL语言设计的波形仿真结果

五、实训总结

通过这次设计,进一步加深了对EDA的了解,让我对它有了更加浓厚的兴趣。

特别是当每一个子模块编写调试成功时,心里特别的开心。

但是在编写顶层文件的程序时,遇到了不少问题,特别是各元件之间的连接,以及信号的定义,总是有错误,在细心的检查下,终于找出了错误和警告,排除困难后,程序编译就通过了,心里终于舒了一口气。

其次,在连接各个模块的时候一定要注意各个输入、输出引脚的线宽,因为每个线宽是不一样的,只要让各个线宽互相匹配,才能得出正确的结果,否则,出现任何一点小的误差就会导致整个文件系统的编译出现错误提示,在器件的选择上也有一定的技巧,只有选择了合适当前电路所适合的器件,编译才能得到完满成功。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。

在设计的过程中遇到问题,可以说得是困难重重,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。

终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。

最后,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!

在这次设计中,我也深深地体会到“细节决定成败”这句话的真正含义,也许就因为一个小的细节就会导致设计的失败。

这次设计也启发了我在以后的学习中一定要耐心、细心、认真,不可粗枝大叶。

 

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

当前位置:首页 > 总结汇报 > 其它

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2