dds正弦波信号发生源文档格式.docx
《dds正弦波信号发生源文档格式.docx》由会员分享,可在线阅读,更多相关《dds正弦波信号发生源文档格式.docx(9页珍藏版)》请在冰点文库上搜索。
![dds正弦波信号发生源文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/6/291af9e8-1212-4b65-8793-43090822a7ec/291af9e8-1212-4b65-8793-43090822a7ec1.gif)
设定频率值
Dataout[7..0]:
频率输出
(2)dds_fen模块
根据需要生成的频率信号,产生对应的时钟信号,是DDS设计的核心部分。
clk为系统时钟,clr为清零信号,datain为所需频率值。
该模块根据datain提供的频率值,产生对应的后续模块的时钟信号。
在后续正弦波所需模块中需要提供的时钟信号为所需频率的64倍,通过相位累加产生模块中需要。
dds_fen模块的VHDL原代码如下
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYdds_fenIS
GENERIC(WIDTH:
INTEGER:
=20;
clk_k:
=10000000);
PORT(clk,clr:
INSTD_LOGIC;
datain:
INSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0);
clk_out:
OUTSTD_LOGIC);
END;
ARCHITECTUREoneOFdds_fenI
BEGIN
data_c<
=datain&
"
000000"
;
PROCESS(clk,clr,datain)
IFclr='
1'
THENq<
=0;
ELSIFclk'
EVENTANDclk='
THEN
IFq<
clk_k-CONV_INTEGER(data_c)THEN
q<
=q+CONV_INTEGER(data_c);
clk_out_c<
='
0'
ELSE
ENDIF;
ENDPROCESS;
clk_out<
=clk_out_c;
(3)dds_sin模块实现正弦波地址数据输出,
模块的VHDL原代码如下
LIBRARYIEEE;
ENTITYdds_sinIS
=6;
depth:
=64);
q:
OUTSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0));
ARCHITECTUREoneOFdds_sinIS
SIGNALq1:
INTEGERRANGE0TO(depth-1);
PROCESS(clk,clr)
THENq1<
THEN
IFq1<
(depth-1)THEN
q1<
=q1+1;
=CONV_STD_LOGIC_VECTOR(q1,WIDTH);
(4)dds_rom模块用来保存正弦波波形数据
其模块如下
ENTITYdds_romIS
GENERIC(addr:
width:
=8);
PORT(clk:
address:
INSTD_LOGIC_VECTOR(addr-1DOWNTO0);
dataout:
ARCHITECTUREoneOFdds_romIS
SIGNALq:
INTEGERRANGE0TO63;
SIGNALd:
INTEGERRANGE0TO255;
=CONV_INTEGER(address);
PROCESS(clk)
BEGIN
CASEqIS
WHEN00=>
d<
=255;
WHEN01=>
=254;
WHEN02=>
=252;
WHEN03=>
=249;
WHEN04=>
=245;
WHEN05=>
=239;
WHEN06=>
=233;
WHEN07=>
=225;
WHEN08=>
=217;
WHEN09=>
=207;
WHEN10=>
=197;
WHEN11=>
=186;
WHEN12=>
=174;
WHEN13=>
=162;
WHEN14=>
=150;
WHEN15=>
=137;
WHEN16=>
=124;
WHEN17=>
=112;
WHEN18=>
=99;
WHEN19=>
=87;
WHEN20=>
=75;
WHEN21=>
=64;
WHEN22=>
=53;
WHEN23=>
=43;
WHEN24=>
=34;
WHEN25=>
=26;
WHEN26=>
=19;
WHEN27=>
=13;
WHEN28=>
=8;
WHEN29=>
=4;
WHEN30=>
=1;
WHEN31=>
WHEN32=>
WHEN33=>
WHEN34=>
WHEN35=>
WHEN36=>
WHEN37=>
WHEN38=>
WHEN39=>
WHEN40=>
WHEN41=>
WHEN42=>
WHEN43=>
WHEN44=>
WHEN45=>
WHEN46=>
WHEN47=>
WHEN48=>
WHEN49=>
WHEN50=>
WHEN51=>
WHEN52=>
WHEN53=>
WHEN54=>
WHEN55=>
WHEN56=>
WHEN57=>
WHEN58=>
WHEN59=>
WHEN60=>
WHEN61=>
WHEN62=>
WHEN63=>
WHENOTHERS=>
NULL;
ENDCASE;
dataout<
=CONV_STD_LOGIC_VECTOR(d,WIDTH);
完成上述步骤后进行编译,封装,仿真、锁定引脚,再下载。
三.实验结果分析(要附图)
通过嵌入式逻辑分析仪SingalTapⅡ观察波形
设计引脚用N2作为时钟信号clk输入,用开关N25作为清零信号clr输入,用开关(N26、P25、AE14、AF14、AD13、AC13、C13、B13、A13、N1、P1、P2、T7、U3、U4、V1、V2)作为datain[19..0]的输入,用扩展端口GPIO_0[7]~GPIO_0[0](J20、J21、F23、F24、E25、E26、J22、D25)作为dataout[7..0]的输出。
全程编译通过下载到DE2板,扩展端口外接D/A变换后送示波器观察波形。
动态仿真正弦波
四总结
设计过程中遇到了一些问题。
如,编译control时总出现错误,但源代码不存在问题,最后发现control的编译必须在con1编译封装完成后才能实现。
而且在保存的时候,文件名必须与实体名一致。
每一次编译的时候都要将文件置顶,否则编译不成功。
文件名保存错误或编译错误都要从打开程序。
经过一次的修改,一次次的编译,最后终于完成了设计,看到最终的波形,无比开心。
虽然期间遇到了很多困难,但通过与同学的探讨和老师的提点,成功的解决了很多问题,最终圆满完成。
这次学习让我认识到一件事:
不断挑战摸索出来的成功比简单的胜利更有意义。
遇到并解决困难,是学习与提高的必经过程,这样才能使能力与心智得到成长。
丰富的知识,冷静的态度,成熟的头脑,不懈的精神都是成功的要素。
同时经过这次设计让我对EDA有了个更整体更全面的认识,对其步骤也比以前更清楚更熟练了。
真的收获颇多
五.问题
1.什么是DDS?
DDS一种以全数字技术从相位概念出发直接合成所需波形的一种频率合成技术。
2.DDS完成什么功能?
能输出什么信号?
能够产生任意波形,能输出数字化的正弦波。
3.DDS各端口都有什么功能?
clk:
系统时钟clr:
datain[19..0]:
dataout[7..0]:
4.dds_fen模块实现什么功能?
根据需要生成的信号频率值,产生对应的时钟信号
5.GENERIC类属说明语句有什么作用,其定义的值在程序中如何使用?
类属为实体与外界通信提供了一种静态信息通道,用来规定端口大小、总线宽度和实体中子元件的数目等。
类属值可以由设计实体外部提供,接受赋值。
6.后续模块时钟信号与所需频率值之间有什么关系?
后续模块时钟信号为所需频率值的64倍,通过相位累加即可得到所需频率。
7.dds_sin模块实现什么功能?
实现正弦波地址数据输出。
8.dds_sin模块输出的数据地址范围是…?
0到11111111.